Django項目常見面試問題


1.python中的lambda是什么意思,可以舉例
1 匿名函數
2 a = lambda x:x+1
3 print(a(1))
2.請寫出以下代碼執行的結果
 1 class Parent(object):
 2 x = 1
 3 class Child1(Parent):
 4 pass
 5 class Child2(Parent):
 6 pass
 7 print(Parent.x, Child1.x, Child2.x)
 8 Child1.x = 2
 9 print(Parent.x, Child1.x, Child2.x)
10 parent.x = 3
11 print(Parent.x, Child1.x, Child2.x)
12 
13 
14 111 121 323
3.寫出A0-A2的輸出結果,並解釋原因
1 A0 = [i for i in range(10) if i % 2 == 0]
2 A1 = {i: i+2 for i in A0}
3 A2 = sorted(A0, reverse=True)
4 
5 
6 A0 = [0, 2, 4, 6, 8] 7 A1 = {0:2,2:4,4:6,6:8,8:10} 8 A2 = [8,6,4,2,0]
4.寫出下列程序的輸出
 1 a = [2, 5]
 2 b = [a] * 4
 3 b = tuple(b)
 4 b[0][0] = 4
 5 print(b)
 6 print(a)
 7 
 8 
 9 ([4,5],[4,5],[4,5],[4,5]) 10 [4,5]運算符來操作列表時淺拷貝,只拷貝最外邊一層,內層還是原來的引用。
5.寫出下邊代碼打印的內容
 1 def decorate(func):
 2     print("func")
 3     def inner(**kwargs):
 4         print("123456")
 5         ret = func(**kwargs)
 6         print("789")
 7         return ret
 8     print('inner')
 9     return inner
10 @decorate
11 @decorate
12 def func(**kwargs):
13     return kwargs
14 
15 
16 
17 func 18 inner 19 func 20 inner                        
6.如何用redis實現分布式鎖
 1 import redis
 2 redis_conn = redis.StrictRedis(host="127.0.0.1", port=6379)
 3 try:
 4     lock_num = lock_num = redis_conn.incr("lock", 1)
 5     if lock_num == 1:
 6         # 執行操作,拼接response
 7         response
 8     else:
 9         return 404
10 finally:
11     redis_conn.incr("lock", -1)
12 return response
13 
14 
15 原理:redis是單線程的 16 目的,在分布式應用中,將並發變為串行,減少數據庫壓力,提升安全性能    
7.redis中的數據類型有哪些
1 string list hash set zset
8.使用生成器寫一個到n的斐波那契數列def feibo(n):
1 def feibo(n):
2     a, b = 1, 0
3     for _ in range(n):
4         a, b = b, a + b
5         yield b
9.簡述Python的內存管理機制
  小整數池 intern機制 引用計數為主,分代回收為輔
10.mysql事務隔離級別有哪些,分別會出現哪些問題,默認的事務隔離級別是什么

默認事務隔離級別是可重復讀

11.簡述對進程和線程的認識,並說說他們的區別
 
12.使用裝飾器實現一個單例
 1 def wrap(cls):
 2     instance = {}
 3     def inner(*args, **kwargs):
 4         if cls not in instance:
 5             instance[cls] = cls(*args, **kwargs)
 6         return instance[cls]
 7     return inner
 8 @wrap
 9 class A(object):
10     def __init__(self, name):
11         self.name = name
13.HTTP常用狀態碼有哪些
200 - 請求成功
201 - 已創建。成功請求並創建了新的資源
301 - 資源(網頁等)被永久轉移到其它URL
302 - 臨時移動。與301類似。但資源只是臨時被移動。客戶端應繼續使用原有URI
404 - 請求的資源(網頁等)不存在
403 - 服務器理解請求客戶端的請求,但是拒絕執行此請求
500 - 內部服務器錯誤
505 - 服務器不支持請求的HTTP協議的版本,無法完成處理
14.post和get的區別是什么
15.對稱加密和非對稱加密是什么
對稱加密
非對稱性加密
一對公鑰和一對私鑰
用戶和銀行分別有自己的公鑰
用戶使用銀行給的公鑰對原文進行加密
銀行可以用自己的私鑰對密文進行解密
非對稱加密速度很慢。
現實中加密方式的使用
用戶使用對稱加密,通過秘鑰對原文進行加密
將秘鑰使用非對稱加密方式加密然后傳給銀行
銀行使用秘鑰解密

 非對稱性加密

一對公鑰和一對私鑰
用戶和銀行分別有自己的公鑰
用戶使用銀行給的公鑰對原文進行加密
銀行可以用自己的私鑰對密文進行解密
非對稱加密速度很慢。
現實中加密方式的使用
用戶使用對稱加密,通過秘鑰對原文進行加密
將秘鑰使用非對稱加密方式加密然后傳給銀行
銀行使用秘鑰解密
16.Python線程安全模塊時什么,怎么使用
互斥鎖
 1 import threading
 2 # 定義全局變量
 3 g_num = 0
 4 # 創建全局互斥鎖
 5 lock = threading.Lock()
 6 # 循環一次給全局變量加1
 7 def sum_num1():
 8     # 上鎖
 9     lock.acquire()
10     for i in range(1000000):
11         global g_num
12         g_num += 1
13     print("sum1:", g_num)
14     # 釋放鎖
15     lock.release()
16 # 循環一次給全局變量加1
17 def sum_num2():
18     # 上鎖
19     lock.acquire()
20     for i in range(1000000):
21         global g_num
22         g_num += 1
23     print("sum2:", g_num)
24     # 釋放鎖
25     lock.release()
26 if __name__ == '__main__':
27     # 創建兩個線程
28     first_thread = threading.Thread(target=sum_num1)
29     second_thread = threading.Thread(target=sum_num2)
30     # 啟動線程
31     first_thread.start()
32     second_thread.start()    
17.寫出代碼的結果
 1 def f(x, l=[]):
 2     for i in range(x):
 3         l.append(i*i)
 4     print(l)
 5 f(2)
 6 f(3, [3,2,1])
 7 f(3)
 8 
 9 
10 
11 [0, 1] [3,2,1,0,1,4] [0,1,0,1,4]    

 

18.描述Python GIL的概念,以及它對python多線程的影響
1.全局解釋鎖。每個線程在執行的過程都需要先獲取GIL,保證同一時刻只有一個線程可以執行代碼
2.python語言和GIL並沒有關系,是由於歷史原因在Cpython解釋器中難以移除GIL。
3.線程釋放GIL鎖的情況:在IO操作等可能引起阻塞的系統調用之前,可以暫時釋放GIL,cpu會切換執行其他線程,
但在執行完畢后,必須重新獲取GIL。python3使用計時器(執行時間達到閾值后,當前線程釋放GIL) 如何解決GIL問題
1.換解釋器,默認是Cpython,可以換成jpython 2.使用其他語言寫其他線程。 3.進程+協程 結論: 1.Python使用多進程可充分利用多核cpu的資源 2.多線程爬取比單線程性能有提升,因為遇到IO阻塞會自動釋放GIL鎖。 為什么有了GIL鎖多線程使用時還要使用互斥鎖: GIL鎖不能保證一個線程是否執行完成,互斥鎖可以保證一個線程執行完成之后解鎖,讓別的程序再加鎖執行。
19.一行實現對列表a中的下標為偶數的元素進行加3后求和
1 sum([i+3 for i in a[1::2]])
20.對比說明jwt機制和cookie session機制的優缺點
cookie Session:
優點:
簡單方便,通用性好,可以存放敏感信息,可以靈活控制用戶的狀態
缺點:
每個用戶經過我們的應用認證之后,我們的應用都要在服務端做一次記錄,以方便用戶下次請求的鑒別,通常而言
session都是保存在內存中,而隨着認證用戶的增多,服務端的開銷會明顯增大。
擴展性: 用戶認證之后,服務端做認證記錄,如果認證的記錄被保存在內存中的話,這意味着用戶下次請求還必須
要請求在這台服務器上,這樣才能拿到授權的資源,這樣在分布式的應用上,相應的限制了負載均衡器的能力。
這也意味着限制了應用的擴展能力。 CSRF: 因為是基於cookie來進行用戶識別的, cookie如果被截獲,用戶就會很容易受到跨站請求偽造的攻擊。 jwt機制: 優點: 不需要在服務端去保留用戶的認證信息或者會話信息,減少服務器開銷 基於token認證機制的應用不需要去考慮用戶在哪一台服務器登錄了,這就為應用的擴展提供了便利。 缺點: 已頒布分令牌無法主動讓其失效(可以通過后端實現黑名單來實現,但其實黑名單的原理和cookie session其實 是一樣的)
21.談談你對drf的認識快速開發符合restful風格api接口的django擴展。
主要的核心組件:
序列化器、視圖、視圖集,結合django自帶的model和url
使用drf其實已經不再符合django的mvt開發模式了
主要的功能:
分頁、限流、權限、認證等
22.celery的工作流程是什么
celery架構由三個模塊組成:消息中間件(message broker),任務執行單元(worker)和任務執行結果存儲(
taskresult store)組成。
消息中間件(Broker): 消息中間人,是任務調度隊列,是一個獨立的服務,是一個生產者消費者模式,生產者把任務
放入隊列中,消費者(worker)從任務隊列中取出任務執行,任務的執行可以按照順序依次執行也可以按照計划時間進行。
但是Broker本身不提供隊列服務,所以要集成第三方隊列,推薦使用RatbbitMQ或Redis.
任務執行單元(worker):即執行任務的程序,可以有多個並發。它實時監控消息隊列,獲取隊列中調度的任務,並執
行它。
任務執行結果存儲(task result store):由於任務的執行同主程序分開,如果主程序想獲取任務執行的結果,
就必須通過中間件存儲。同消息中間人一樣,存儲也可以使用RabbitMQ、Redis;另外,假如不需要保存執行的結果也
可以不配置這個模塊。

 

23.Django中間件常用的5個方法
 1 中間件:允許開發人員在請求之前或之后進行相應的處理。
 2 
 3 1.10之前,Django中間件注冊`MIDDLEWARE_CLASSES`:
 4        process_request
 5           process_view
 6        process_response
 7        process_template_response
 8        process_exception
 9 
10 1.10及之后,Django中間件注冊`MIDDLWARE`:
11     def simple_middleware(get_response):
12         # 一次性配置和初始化。
13 
14         def middleware(request):
15             # 在調用視圖(以及稍后的中間件)之前
16             # 要為每個請求執行代碼。
17 
18             response = get_response(request)
19 
20             # 為每個請求/響應執行的代碼
21             # 在調用視圖之后
22 
23             return response
24 
25 return middleware
 
 
24.同步和異步有什么區別,Python如何實現異步同步:多個任務之間有先后順序執行,一個執行完下個才能執行。
異步:多個任務之間沒有先后順序,可以同時執行有時候一個任務可能要在必要的時候獲取另一個
同時執行的任務的結果,這個就叫回調!
阻塞:如果卡住了調用者,調用者不能繼續往下執行,就是說調用者阻塞了。
非阻塞:如果不會卡住,可以繼續執行,就是說非阻塞的。
同步異步相對於多任務而言,阻塞非阻塞相對於代碼執行而言
答celery可以 asyncio可以了解一下
25.sql語句中使用limit遇到哪些問題,是如何解決的
日常分頁SQL語句
select id,name,content from users order by id asc limit 100000,20
掃描100020行
如果記錄了上次的最大ID
select id,name,content from users where id>100073 order by id asc limit 20
掃描20行。

 26.Django Signals信號簡單使用

1. 信號的定義
所有信號都是 django.core.signals.Signal的實例。 providing_args是一個列表,由信號將提供給監聽者的參數名稱組成。
from django.core.signals import Signal
# 1. 定義郵件發送信號
email_send = Signal(providing_args=['email'])
2. 信號處理函數的定義
信號處理函數一般定義在定義在子應用下的signals.py文件中。
# 2. 處理函數定義
def send_email(sender, **kwargs):
        """email_send信號處理函數"""
    # TODO: 可以在這里編寫信號的處理代碼
    print('email_send信號處理函數被調用')
3. 信號的連接
信號連接就是將信號和處理函數對應起來,信號連接一般是在子應用配置類的ready方法中進行操作。
class TestAppConfig(object):
        # ...
    def ready(self):
          # 3. 信號連接
        email_send.connect(send_email)
4. 信號發送
發出信號之后,信號連接的處理函數就會被調用。
email_send.send(sender='信號發出者', **kwargs)

 27.django懶加載是什么?

答:懶加載:使用的時候再去加載。
1)數據庫查詢:    
        all,filter, exclude, order_by:返回查詢集QuerySet    
        惰性查詢:只有使用查詢集中數據的時候才會進行數據庫的查詢。    
2)項目配置信息   
     from django.conf import settings

  28.Django請求的生命周期

請求生命周期:客戶端發起請求->服務器響應完整過程

 

   29.列舉Django的內置中間件

SessionMiddleWare:session中間件    
    獲取:request.session['<key>']    
    設置:request.session['<key>'] = '<value>'   
 
CsrfViewMiddleware:csrf保護中間件    
    每次請求之前,進行csrf的驗證    
    process_view    

AuthenticationMiddleware:認證中間件    
    request.user:登錄的用戶對象   
    request.user:匿名用戶類的對象

    30.簡述Django下(內建的)緩存機制

你的緩存配置是通過setting 文件的CACHES 配置來實現的:
        CACHES保存位置:
    1. 服務器內存(默認)
    2. 保存到數據庫的表中
    3. 保存到文件中
    4. 保存到內存型數據庫:redis Memcached

        緩存級別:
    1. 整站緩存
    2. 視圖緩存
    3. 模板片段緩存
    
    底層緩存API:
from django.core.cache import cache
    cache.set('<key>', '<value>'): 設置緩存
    cache.get('<key>'): 獲取緩存
    cache.delete('<key>'): 刪除緩存

 

 

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM