day79

时间:2022-09-21 20:07:44

昨日回顾

昨日回顾:
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依次返回到达用户。

day79

    -def process_exception(self, request, exception)

    day79

    -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 == '':
return HttpResponse('登陆成功')
return HttpResponse('登陆失败')