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')