day79
昨日回顾
昨日回顾: cookie: -是什么?存储在客户端浏览器上的键值对 -干啥用的?记录状态 -django中使用: -设置值: -HttpResponse对象,obj.set_cookie(key,value,超时时间) -JsonResponse也可以用 -取值 request.COOKIES 字典,然后把要取的值取出来,推荐用get -删除值 -HttpResponse对象,obj.delete_cookie('key'),从客户浏览器中删除 -其他一些属性: -加盐的cookie -超时时间 -路径:如果是根路径,说明,以后所有的请求,都会携带cookie过来 -域:在某个域下有效 session: -是什么?存在服务器上的键值对:key是一个随机字符串,value是个字典 -有什么作用:安全性,客户端浏览器不再存储敏感信息 -django中使用: -设置值 -request.session['name']=lqz -1 生成一个随机字符串 -2 存到数据库 随机字符串 {'name':lqz} -3 向cookie中写入:sessionid 随机字符串 -如果:再设置一次值 request.session['age']=18 只在随机字符串对应的字典内部添加,{'name':lqz,'age':18} -取值 -request.session.get('name') -先取出cooki中的随机字符串 -取数据库根据随机字符串查询,拿到data的值 -从字典中取出name对应的值 -删除值 -request.session.delete()------>只是删除数据库的内容 -request.session.flush()------>删除数据库的内容,又删除浏览器的cookie -其他的属性: -默认session存在数据库,可以存在缓存,文件 -超时时间 -路径:如果是根路径,说明,以后所有的请求,都会携带cookie过来 -域:在某个域下有效 -其他的
今日内容
1.什么是中间件?
中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出。因为改变的是全局,所以需要谨慎实用,用不好会影响到性能
作用:可以控制请求和响应
django中内置有几个中间件
自定义一个中间件
# 自定义中间件 class FirstMyMid(MiddlewareMixin): # 请求过来时,中间响应的方法 def process_request(self, request): print('----' * 50) print('this is request') # 如果 return 一个HttpResponse那么将直接从这个中间件开始往浏览器端返回(跳过后面所有的过程) # 如果 return 一个None那么将会往下一个中间件继续传递。 # return HttpResponse('Is MyMid') # return 'asd' #出错,源码判断 is Not None 就返回 response # 请求回去时,中间响应的方法 def process_response(self, request, response): print('----' * 50) print('this is response') return response # 经过路由控制来到process_view 可以获取到本次请求的视图函数地址 def process_view(self, request, view_func, view_args, view_kwargs): print('----' * 50) # res = view_func(request) print('view_func:', view_func) print('view_args:', view_args) print('view_kwargs', view_kwargs) # 一旦视图函数报错这里的exception可以接收到错误信息(执行完视图函数之后才会执行该函数) def process_exception(self, request, exception): return HttpResponse(exception)
定义过程: 1.-from django.utils.deprecation import MiddlewareMixin 先导入 2.-定义一个类,随意命名,继承MiddlewareMixin def process_request(self, request):(-请求来的时候,会响应它) def process_response(self, request, response):(-响应回去的时候,会走它) 3.在在setting中注册,是有顺序的 MIDDLEWARE = [ 'app01.mymiddelware.MyMiddleware1', ]
def process_view(self, request, view_func, view_args, view_kwargs):
当最后一个中间的process_request到达路由关系映射之后,返回到中间件1的process_view,然后依次往下,到达views函数,最后通过process_response依次返回到达用户。
-def process_exception(self, request, exception)
-def process_template_response(self, request, response):
该方法对视图函数返回值有要求,必须是一个含有render方法类的对象,才会执行此方法
class Test: def __init__(self,status,msg): self.status=status self.msg=msg def render(self): import json dic={'status':self.status,'msg':self.msg} return HttpResponse(json.dumps(dic)) def index(response): return Test(True,'测试')
csrf:跨站请求伪造
比如:转账请求:transfer?to=lqz&count=1000
-是什么?攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的
-如何防范:
-通过refer
-加一个随机字符串校验(加载请求的路径里,加载请求体中)
-在请求头中加字符串校验
django中的应用:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>index</title> <script src="/static/jquery-3.3.1.js"></script> </head> <body> <form action="" method="post"> {% csrf_token %} <input type="text" name="name"> <input type="text" name="pwd"> </form> <input type="button" value="登陆" id="btn"> </body> <script> $('#btn').click(function () { $.ajax({ url: '/index/', type: 'post', data: { 'name': $('[name="name"]').val(), 'pwd': $('[name="pwd"]').val(), 'csrfmiddlewaretoken': '{{ csrf_token }}', {#'csrfmiddlewaretoken': $('[name="csrfmiddlewaretoken"]').val()#} }, success:function (data) { alert(data) } }) }) </script> </html>
导入
from django.views.decorators.csrf import csrf_exempt, csrf_protect
from django.views import View
from django.utils.decorators import method_decorator
全站禁用:注释掉中间件 'django.middleware.csrf.CsrfViewMiddleware',
局部禁用:用装饰器(在FBV中使用)
CBV
@method_decorator(csrf_exempt, name='dispatch') class index(View): def get(self, request): if request.GET.get('next'): return render(request, 'index.html') return render(request, 'index.html') def post(self, request): name = request.POST.get('name') pwd = request.POST.get('pwd') if name == 'yxf' and pwd == '123': return HttpResponse('登陆成功') return HttpResponse('登陆失败')