Cookie的由來html
由於HTTP協議是無狀態的,就是說你沒次訪問一個網站就像是第一次訪問.所以就誕生的Cookie.程序員
什麼是Cookie
Cookie具體指的是一小段信息,它是由服務器發出來的存儲在瀏覽器上的一組組的鍵值對,當你的瀏覽器下次再訪問時,就會攜帶這些信息,以便服務器來提取有用的信息.ajax
Cookiedjango
cookie的工做原理: 由服務器產生的內容,瀏覽器收到請求後保存在本地,當瀏覽器再次訪問時,瀏覽器會自動的帶上cookie,這樣服務器經過cookie來斷定,你是否是來過.瀏覽器
獲取Cookie安全
request.COOKIES['key'] request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
參數:服務器
設置Cookiecookie
rep = HttpResponse(...) rep = render(request, ...) rep.set_cookie(key,value,...) rep.set_signed_cookie(key,value,salt='加密鹽', max_age=None,...)
參數:session
刪除Cookie函數
def logout(request): rep = redirect("/login/") rep.delete_cookie("user") #刪除用戶瀏覽器上以前設置的usercookie值 return rep
Cookie實現登陸認證
def login(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') if username == 'kang' and password == '123': old_path = request.GET.get('next') # 拿到要訪問的頁面 if old_path: obj = redirect(old_path) #若是有就返回那個頁面 else: obj = redirect('/home/') obj.set_cookie('name','kang') # 讓客戶端瀏覽器記錄一個鍵值對 return obj return render(request, 'login.html') # 登陸裝飾器 from functools import wraps def login_auth(func): @wraps(func) def inner(request,*args, **kwargs): if request.COOKIES.get('name'): #判斷有沒有cookie,有的話直接返回 res = func(request,*args, **kwargs) return res else: target_url = request.path_info # 沒有的跳轉到登陸頁,而且附帶上想要訪問的 return redirect('/login/?next=%s'%target_url) return inner @login_auth def home(request): return HttpResponse('我是主頁面,登陸後查看') @login_auth def index(request): return HttpResponse('我是買東西頁面') @login_auth def play(request): return HttpResponse('我是玩遊戲頁面') @login_auth def logout(request): obj = redirect('/login/') obj.delete_cookie('name') return obj
Session的由來
Django中的Session相關方法
# 設置,獲取,刪除session中的數據 #設置 request.session['username'] = 'kang' #獲取 request.session.get('username') #刪除 request.session.flush() #設置會話Session和Cookie的超時時間 request.session.set_expiry(value) 若是value是個整數,session會在這些秒數後失效 若是value是0,用戶關閉瀏覽器就會失效.
Session實現登陸認證
中間件的做用
django中間件暴露給程序員的五個能夠自定義的方法(五個方法都是在特定的條件下自定觸發的)
1.你要新建一個文件夾, 裏面能夠創建任意名稱的py文件 裏面寫類固定繼承 from django.utils.deprecation import MiddlewareMixin class MyThink(MiddlewareMixin): #五個方法: 須要掌握的: 1. process_request(******):請求來的時候 會從上往下依次通過每個中間件裏面process_request,一旦裏面返回了HttpResponse對象那麼就再也不日後執行了,會執行同一級別的process_response def process_request(self,request): print('我是第一個自定義中間件裏面的process_request方法') return HttpResponse("我是第一個自定義中間件裏面的HttpResponse對象返回值") # 直接原地返回 2.process_response(***):響應走的時候 會從下往上依次進過每個中間件裏面的process_response def process_response(self,request,response): # response就是要返回給用戶的數據 print("我是第一個自定義中間件裏面的process_response方法") return response 瞭解的: process_view:路由匹配成功以後執行視圖函數以前觸發 process_exception:當視圖函數出現異常(bug)的時候自動觸發 process_template_response:當視圖函數執行完畢以後而且返回的對象中含有render方法的狀況下才會觸發
就至關於你搭建了一個和充Q幣如出一轍的網站,用戶在你的網站進行充值的時候輸入的是本身的結果充給了你.
簡單的原理
解決釣魚網站的策略
form表單
你在寫form表單的時候只須要加上 {% csrf_token %}
ajax
第一種: 本身在頁面上先經過{% cstf_token %}獲取到隨機字符串,而後利用標籤查找 data: {'username':'kang','csrfmiddlewaretoke:$([name="csrfmiddlewaretoken"]').val()} 第二種: data:{'username':'kang', 'csrfmiddlewaretoken':'{{ csrf_token }}'} 第三種 拷貝js文件
如何不校驗使用裝飾器
from django.views.decorators.csrf import csrf_exempt, csrf_protect from django.utils.decorators import method_decorator # 它做用於CBV @csrf_exempt # 避免校驗 def exem(request): return HttpResponse('exempt') @csrf_protect # 可單獨校驗 def pro(request): return HttpResponse('pro') CBV from django.views import View # 第一種 # @method_decorator(csrf_exempt,name='dispatch') @method_decorator(csrf_protect,name='post') class MyCsrf(View): # 第二種 # @method_decorator(csrf_exempt) @method_decorator(csrf_protect) def dispatch(self, request, *args, **kwargs): return super().dispatch(request,*args,**kwargs) def get(self,request): return HttpResponse('hahaha') @method_decorator(csrf_protect) def post(self,request): return HttpResponse('post')