問csrftoken在Django裏面是基於什麼實現的?------>中間件。django
若是是Django表示每次發請求過來的時候,要檢驗有沒有帶隨機字符串。當在執行視圖函數以前,前面還有一道屏障,這個屏障就是用來判斷帶沒帶這個隨機字符串,帶了就能夠繼續往下走,沒帶就直接讓它返回。根本到不了要請求的那裏。json
csrftoken在view方法裏面。爲何呢?(中間件裏作判斷,若是加了免除csrf免除認證裝飾器,它得作個判斷得找到那個函數找到它上面的那個裝飾器。而對於process_view而言,根本沒到達路由匹配根本沒找到函數,只有到process_view以後才能找到函數才能作判斷。)cookie
發過來請求,拿到token,驗證這個token是否是我以前發的,若是帶了就讓繼續執行,沒帶就直接返回。 函數
加這個裝飾器,意味着這個函數免除csrtoken認證。post
from django.views.decorators.csrf import csrf_exempt # Create your views here. @csrf_exempt def users(request): user_list = ['zgr', 'oldboy'] return HttpResponse(json.dumps(user_list))
來作csrftoken認證的時候作兩件事(process_view作的):網站
第一件事先判斷加沒加這個裝飾器spa
第二件事獲取請求過來的token(請求體或cookie中)並進行驗證是否遵循csrftoken規則,若是驗證經過則繼續執行,若是驗證不經過則返回。code
Django最多能夠寫幾個方法?csrf
process_request中間件
process_response
process_view
process_exception (異常以後執行)
process_render_template (這個返回的對象視圖函數永遠不執行,由於沒有render方法。)
中間件的執行流程是什麼樣子的?
看Django版本。
Django1.10 以上版本。
請求進來先執行Django中間件全部的request,執行路由匹配,意味着找到函數,但不執行。
跳回來在執行view,都執行完,執行視圖函數。
視圖函數在執行response再返回。
若是報錯exception執行。
若是返回的對象有render方法,render_tempate方法也會被執行。
中間件作過什麼?
權限
用戶登陸認證(以前是在每一個視圖函數以前加裝飾器)爲了省事不須要再每一個函數加裝飾器了,只要在中間件作一次判斷就能夠了。
csrftoken
若是不註釋 'django.middleware.csrf.CsrfViewMiddleware', 意味着全局全棧整個網站只要髮指定請求都是遵循csrftoken的要求。
不想要csrftoken認證的時候能夠給他加個裝飾器。
from django.views.decorators.csrf import csrf_exempt # Create your views here. @csrf_exempt def users(request): user_list = ['zgr', 'oldboy'] return HttpResponse(json.dumps(user_list))
還能夠中間件注視了都不用,可是就想讓他用怎麼辦?也是加個裝飾器
rom django.views.decorators.csrf import csrf_protect # Create your views here. @csrf_protect def users(request): user_list = ['zgr', 'oldboy'] return HttpResponse(json.dumps(user_list))
對csrft如今有兩種設置方式了,一種是中間件,一種是裝飾器。
若是cbv裏面不想用csrftoken怎麼辦?
若是在cbv加裝飾器導入
from django.utils.decorators import method_decorator
把@method_decorator(csrf_exempt)這個裝飾器,並把csrf_exempt當作參數傳進來。
到dispatch中就能夠了。免除csrftoken認證。
class StudentsView(MyBaseView,View): @method_decorator(csrf_exempt) def dispatch(self, request,*args, **kwargs): print('before') ret = super(StudentsView, self).dispatch(request, *args, **kwargs) print('after') return ret def get(self, request, *args, **kwargs): print('get方法') return HttpResponse('GET') def post(self, request, *args, **kwargs): return HttpResponse('POST') def delete(self, request, *args, **kwargs): return HttpResponse('DELETE')
還有一種dispatch方法不用寫,加到類裏面去。這樣也能夠。
@method_decorator(csrf_exempt,name='dispatch') #name是裏面的方法名。 找到這個對象StudentsView的dispatch這個方法並給這個方法加上裝飾器。
class StudentsView(View):
def get(self, request, *args, **kwargs):
print('get方法')
return HttpResponse('GET')
def post(self, request, *args, **kwargs):
return HttpResponse('POST')