Django中模式概念
FBV: function basic view
<code>def home(request): return HttpResponse()/<code>
CBV: class basic view
<code>class HomeView(View): def get(self, request): return HttpResponse()/<code>
Django中間件
Django中間件的五個方法方法
- process_request
- process_response
- process_view
- process_exception
- process_render_template
執行順序:請求過來
- 執行所有中間件的process_request
- 執行路由匹配,找到要執行的函數
- 執行所有中間件的process_view
- 執行路由匹配到的函數
- 執行process_response如果響應的執行有異常就執行process_exception如果路由函數中有render渲染HTML,則先執行process_render_template,再執行process_response
Django CSRF驗證
Django的crsf驗證是在中間件CsrfViewMiddleware中進行驗證的,具體來講是在此中間件的process_view中驗證的。那麼為什麼要在process_view中驗證而不是在process_request中呢?我們先了解一個情況,如果我不希望某個路由函數進行csrf驗證,可以加上csrf_exempt,免除csrf驗證,所有必須在process_view中驗證,而不是在process_request中。
<code>from django.views.decorators.csrf import csrf_exempt@csrf_exemptdef home(request): return HttpResponse()/<code>
如果是在CBV中要取消某個路由的csrf驗證呢?
<code>from django.view.decorators.csrf import csrf_exemptfrom django.utils.decorators import method_decoratorclass HomeView(View): @method_decorator(csrf_exempt) def dispatch(self, request, *args, **kwargs): return super().dispatch(request, *args, **kwargs) def post(self, request): return HttpResponse()或者@method_decorator(csrf_exempt, name="dispatch")class HomeView(View): pass/<code>
必須使用method_decorator裝飾器修飾,並且只能添加到dispatch中,加到單獨的函數中是不行的。
rest_framework中的APIView
<code>BaseAuthentication.authenticate方法返回值:None: 執行下一個認證非None: 驗證通過拋出異常:驗證不通過/<code>
閱讀更多 Python集結號 的文章