github或者官網上找專案的開發壓縮包、原始碼包、jar包
阿新 • • 發佈:2022-02-17
Django中介軟體簡介
Django 中介軟體是修改 Django request 或者 response 物件的鉤子,可以理解為是介於 HttpRequest 與 HttpResponse 處理之間的一道處理過程。
瀏覽器從請求到響應的過程中,Django 需要通過很多中介軟體來處理,可以看如下圖所示:
Django 中介軟體作用:
- 修改請求,即傳送到 view 中的 HttpRequest 物件。
- 修改響應,即 view 返回的 HttpResponse 物件。
自定義中間鍵
① 在專案名或者應用名下建立一個任意名稱的資料夾
② 在該資料夾內建立一個任意名稱的py檔案
③ 在該py檔案內需要書寫類(這個類必須繼承MiddlewareMixin)
在該檔案下就可以定義方法了
④ 需要將類的路徑以字串的形式註冊到配置檔案中才能生效
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', '你自己寫的中介軟體的路徑1', '你自己寫的中介軟體的路徑2', '你自己寫的中介軟體的路徑3', ]
在py檔案中
class SessionMiddleware(MiddlewareMixin): def process_request(self, request): session_key= request.COOKIES.get(settings.SESSION_COOKIE_NAME) request.session = self.SessionStore(session_key) def process_response(self, request, response): return response class CsrfViewMiddleware(MiddlewareMixin): def process_request(self, request): csrf_token = self._get_token(request) if csrf_token is not None: # Use same token next time. request.META['CSRF_COOKIE'] = csrf_token def process_view(self, request, callback, callback_args, callback_kwargs): return self._accept(request) def process_response(self, request, response): return response class AuthenticationMiddleware(MiddlewareMixin): def process_request(self, request): request.user = SimpleLazyObject(lambda: get_user(request))
process_request 1.請求來的時候需要經過每一箇中間件裡面的process_request方法 結果的順序是按照配置檔案中註冊的中介軟體從上往下的順序依次執行 2.如果中介軟體裡面沒有定義該方法,那麼直接跳過執行下一個中介軟體 3.如果該方法返回了HttpResponse物件,那麼請求將不再繼續往後執行 而是直接原路返回(校驗失敗不允許訪問...) process_request方法就是用來做全域性相關的所有限制功能 process_response 1.響應走的時候需要結果每一箇中間件裡面的process_response方法 該方法有兩個額外的引數request,response 2.該方法必須返回一個HttpResponse物件 1.預設返回的就是形參response 2.你也可以自己返回自己的 3.順序是按照配置檔案中註冊了的中介軟體從下往上依次經過 如果你沒有定義的話 直接跳過執行下一個 process_view 路由匹配成功之後執行檢視函式之前,會自動執行中介軟體裡面的該放法 順序是按照配置檔案中註冊的中介軟體從上往下的順序依次執行 process_template_response 返回的HttpResponse物件有render屬性的時候才會觸發 順序是按照配置檔案中註冊了的中介軟體從下往上依次經過 process_exception 當檢視函式中出現異常的情況下觸發 順序是按照配置檔案中註冊了的中介軟體從下往上依次經過
csrf校驗
form表單
<form action="" method="post"> {% csrf_token %} <p>username:<input type="text" name="username"></p> <p>target_user:<input type="text" name="target_user"></p> <p>money:<input type="text" name="money"></p> <input type="submit"> </form>View Code
ajax
// 第一種 利用標籤查詢獲取頁面上的隨機字串 {#data:{"username":'jason','csrfmiddlewaretoken':$('[name=csrfmiddlewaretoken]').val()},#} // 第二種 利用模版語法提供的快捷書寫 {#data:{"username":'jason','csrfmiddlewaretoken':'{{ csrf_token }}'},#} // 第三種 通用方式直接拷貝js程式碼並應用到自己的html頁面上即可 data:{"username":'jason'}View Code
js程式碼
function getCookie(name) { var cookieValue = null; if (document.cookie && document.cookie !== '') { var cookies = document.cookie.split(';'); for (var i = 0; i < cookies.length; i++) { var cookie = jQuery.trim(cookies[i]); // Does this cookie string begin with the name we want? if (cookie.substring(0, name.length + 1) === (name + '=')) { cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); break; } } } return cookieValue; } var csrftoken = getCookie('csrftoken'); function csrfSafeMethod(method) { // these HTTP methods do not require CSRF protection return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); } $.ajaxSetup({ beforeSend: function (xhr, settings) { if (!csrfSafeMethod(settings.type) && !this.crossDomain) { xhr.setRequestHeader("X-CSRFToken", csrftoken); } } });View Code
csrf相關裝飾器
FBV
from django.views.decorators.csrf import csrf_protect,csrf_exempt from django.utils.decorators import method_decorator """ csrf_protect 需要校驗 針對csrf_protect符合我們之前所學的裝飾器的三種玩法 csrf_exempt 忽視校驗 針對csrf_exempt只能給dispatch方法加才有效 """ # @csrf_exempt # @csrf_protect def transfer(request): if request.method == 'POST': username = request.POST.get('username') target_user = request.POST.get('target_user') money = request.POST.get('money') print('%s給%s轉了%s元'%(username,target_user,money)) return render(request,'transfer.html')
CBV
cbv在csrf中只能將裝飾器裝在dispatch方法上,以下兩種方式其實是同一種方式
from django.views import View # 方式1 @method_decorator(csrf_exempt,name='dispatch') class MyCsrfToken(View): def get(self,request): return HttpResponse('get') def post(self,request): return HttpResponse('post') # 方式2 class MyCsrfToken(View):
@method_decorator(csrf_exempt) def dispatch(self, request, *args, **kwargs): return super(MyCsrfToken, self).dispatch(request,*args,**kwargs) def get(self,request): return HttpResponse('get') def post(self,request): return HttpResponse('post')