[TOC]html
HttpResponse
對象,但如今,咱們操做cookie,則須要使用HttpResponse
對象來設置cookieHttpResponse對象.set_cookie('key','value')
語句來設置cookiedef login(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') if username == 'jason' and password == '123': # 登陸成功 old_path = request.GET.get('next') # 登錄成功後要跳轉的url(使用登錄認證裝飾器在登錄的url後面攜帶get請求參數——》 ?next=url) if old_path: # 防止用戶直接訪問的login頁面 obj = redirect(old_path) else: obj = redirect('/home/') # 默認跳轉到首頁 當用戶沒有想要訪問的網址 obj.set_cookie('whoami','jason') # 告訴瀏覽器保存一個鍵值對 return obj return render(request,'login.html')
經過request.COOKIES.get(key)
語句來獲取cookie前端
實例:設計登錄認證裝飾器python
from functools import wraps def login_auth(func): @wraps(func) # wraps做用是 修復被裝飾的函數 def inner(request,*args,**kwargs): # 判斷當前用戶是否登陸 # print('request.path_info:',request.path_info) # 只獲取url # print('request.get_full_path():',request.get_full_path()) # url+get請求的參數 if request.COOKIES.get('whoami'): res = func(request,*args,**kwargs) return res else: target_path = request.path_info return redirect('/login/?next=%s'%target_path) return inner
HttpResponse對象.set_cookie('key','value',max_age=n)
HttpResponse對象.set_cookie('key','value',expires=n)
expires
刪除cookie會讓瀏覽器立馬清楚其保存的響應的鍵值對程序員
刪除語法:HttpResponse對象.delete_cookie(key)
算法
實例:登出/註銷功能數據庫
@login_auth def logout(request): obj = redirect('/home/') obj.delete_cookie('whoami') return obj
sessionid:session的鍵生產的隨機字符串
django_session
表中(固然也能夠經過修改一些設置,讓session保存在其餘本地文本文件中或內存中)。設置session語法:request.session[key] = value
django
django默認的session失效時間是14天後端
當執行request.session[key] = value
這句語句時發生的事:瀏覽器
注意:一個項目中,其數據庫的django_session表中,不管有多少個session,經過同一種瀏覽器設置的session只會保存在一行記錄中。不一樣瀏覽器設置的session纔會保存在不一樣的行中。cookie
request.session.get(key)
。key
是咱們以前設置session時,指定的key,不是生成的那個隨機字符串。request.session.get(key)
時發生的事:
語法:request.session.set_expiry(value)
失效時間是指到了這個時間,保存在服務端的django_session表中的這個session數據就沒用了。以後會被刪除。且客戶端瀏覽器上的sessionid的這個cookie也會失效。
request.session.delete()
request.session.flush()
MIDDLEWARE
中書寫的各個中間件——》MIDDLEWARE
中書寫的各個中間件。process_request
方法返回了一個HttpResponse對象,那麼請求會馬上中止日後面走(下面的中間件和以後的視圖函數都不走),當即原路返回process_request
和 process_response
方法request
形參,放在self
以後process_request
請求來的時候會按照settings配置文件中從上往下的順序,依次執行每個中間件內部定義的process_request
方法
當請求數據走到中間件時,會執行該方法。若該中間件沒有該方法,則會跳過該中間件繼續走下一個中間件
該方法一旦返回了HttpResponse對象,那麼請求會馬上中止日後走,當即原路返回(當process_request
方法直接返回HttpResponse對象以後,會直接從當前中間件裏面的process_respone
往回走)
方法參數:
def process_request(self,request):
process_response
視圖函數返回的響應數據走的時候,會按照settings配置文件中從下往上的順序,依次執行每個中間件內部定義的process_response
方法
該方法必須有兩個形參request,response
,而且必須返回response
形參,不返回直接報錯
該方法返回什麼(HttpResponsed對象) 前端就能得到什麼,即該方法返回的數據會覆蓋掉以前視圖函數返回的響應數據。而且若該中間件上面的中間件的process_response
方法也返回了HttpResponsed對象,則會再把該中間件的返回數據再覆蓋掉。
方法參數:
def process_response(self,request,response):
process_view
路由匹配成功以後執行視圖函數以前觸發該方法
若是該方法返回了HttpResponse對象 那麼會從下往上一次通過每個中間件裏面的process_response
方法
方法參數:
def process_view(self,request,view_name,*args,**kwargs): # view_name 是要執行的視圖函數的內存地址
process_template_response
當你返回的對象中含有render
屬性指向的是一個render方法的時候纔會觸發,從下往上的順序
方法參數:
def process_template_response(self, request, response):
實例
# 讓後端視圖函數中返回的對象含有render屬性的方式 def mdzz(request): print('我是視圖函數mdzz') def render(): return HttpResponse('你好呀 我是奇葩') obj = HttpResponse('我很好 好的像個傻逼同樣') obj.render = render return obj # 響應數據變成了: 我是視圖函數mdzz
process_exception
當視圖函數中出現錯誤,會自動觸發,順序是從下往上
方法參數:
def process_exception(self, request, exception):
在應用文件下(如:app01)新建一個任意名字的文件夾(如:mymddleware)
在mymddleware文件下新建一個任意名字的py文件(如:mymdd.py)
導入方法
from django.utils.deprecation import MiddlewareMixin from django.shortcuts import HttpResponse,render,redirect
在mymdd文件中自定義類,一個類就是一箇中間件。類內部寫上面提到的5個django中間件中經常使用的方法
在settings文件的MIDDLEWARE
變量值中添加自定義的中間件路徑
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', 'app01.mymiddleware.mymdd.MyMdd1', # 添加自定義中間件 'app01.mymiddleware.mymdd.MyMdd2', # 添加自定義中間件 ]
class MyMdd1(MiddlewareMixin): def process_request(self,request): print('我是第一個中間件裏面的process_request方法') # return HttpResponse("我是中間件一里面的") def process_response(self,request,response): """ :param request: :param response: 就是後端返回給前端的數據 :return: """ print('我是第一個中間件裏面的process_response方法') return response # return HttpResponse("我是中間件一里面的") def process_view(self,request,view_name,*args,**kwargs): print(view_name) print(args) print(kwargs) print('我是第一個中間件裏面的process_view方法') # return HttpResponse("我是中間件一里面的process_view") def process_exception(self,request,exception): print('我是第一個中間件裏面的process_exception') print(exception) def process_template_response(self, request, response): print('我是第一個中間件裏面的奇葩方法') return response class MyMdd2(MiddlewareMixin): def process_request(self,request): print('我是第二個中間件裏面的process_request方法') # return HttpResponse('我是中間件二里面的') def process_response(self,request,response): """ :param request: :param response: 就是後端返回給前端的數據 :return: """ print('我是第二個中間件裏面的process_response方法') return response # return HttpResponse("我是中間件二里面的") def process_view(self,request,view_name,*args,**kwargs): print(view_name) print(args) print(kwargs) print('我是第二個中間件裏面的process_view方法') # return HttpResponse("我是中間件二里面的process_view") def process_exception(self, request, exception): print('我是第二個中間件裏面的process_exception') print(exception) def process_template_response(self, request, response): print('我是第二個中間件裏面的奇葩方法') return response