csrf補充

問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')
相關文章
相關標籤/搜索