1. 程式人生 > 實用技巧 >Django學習10

Django學習10

django請求生命週期

請求 -- wsgi封裝socket和http協議解包 -- 順序執行中介軟體 -- url控制器 -- view檢視函式 -- 倒序執行中介軟體 -- wsgi按http協議封裝響應資料 -- 響應

中介軟體

自定義中介軟體

1.應用下建立一個資料夾,資料夾下面建立一個xx.py檔案
from django.utils.deprecation import MiddlewareMixin
class MD1(MiddlewareMixin):
	def process_request(self,request):
		...
	def process_response(self,request,response):
		...
		return response
2.在settings.py  MIDDLEWARE 中寫入自定義中介軟體的路徑(多箇中間件的話注意擺放順序)

中介軟體方法

1.process_request方法(*):
    def process_request(self,request):
		...
# 它的返回值為None或者HttpResponse物件.返回值如果為None,交給下一個中介軟體處理,流程正常.如果是HttpResponse物件,則直接開始返回流程,並將該HttpResponse作為response返回給瀏覽器.
# 多箇中間件中的process_request方法是按照MIDDLEWARE中的註冊順序 順序 執行的.
        
2.process_response方法(*):
    def process_response(self,request,response):
		...
		return response
# response是檢視函式返回的HttpResponse物件.該方法必須返回HttpResponse物件.
# 多箇中間件中的process_response方法是按照MIDDLEWARE中的註冊順序 倒序 執行的.

3.process_view方法:
    def process_view(self, request, view_func, view_args, view_kwargs):
        ...
# view_func是Django即將使用的檢視函式

4.process_exception方法:
    def process_exception(self, request, exception):
        ...
# 檢視函數出錯才會執行

5.process_template_response方法(用的比較少):
    def process_template_response(self, request, response):
        ...
# 它的引數,request是HttpRequest物件,response是TemplateResponse物件(由檢視函式或者中介軟體產生).
# process_template_response是在檢視函式執行完成後立即執行,但是它有一個前提條件,那就是檢視函式返回的物件有一個render()方法.注意!此render()不是我們平時模板渲染的方法!
views.py:
    def index(request):
        print('我是index檢視函式')
		def render():
            print('我是自定義的render')
            return HttpResponse('我是自定義的render方法的返回值')	# 最後頁面拿到的結果是這個
        ret = HttpResponse('我是index檢視函式的返回值')   # 這個HttpRequest物件的內容沒有意義,會被覆蓋
        ret.render = render		# 將自定義的render方法作為屬性封裝給了HttpRequest物件
        return ret
自定義中介軟體:
    def process_template_response(self, request, response):
        ...
        return response		# 這個方法也必須要返回response

小結:搞清楚整個django請求的生命週期是重點,這樣才能知道哪個環節可以拓展.中介軟體的學習重點在於搞清楚中介軟體的執行順序,以及其方法的執行順序,在做這方面專案或練習的時候最好畫個草圖,這樣邏輯會更加清晰.