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过来
                -域:在某个域下有效
                -其他的
View Code

今日内容

  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)
View Code
定义过程:
    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>
View Code

导入

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('登陆失败')
原文地址:https://www.cnblogs.com/yaoxiaofeng/p/10009313.html