• Django(五)


    知识点概要
      - Session
      - CSRF
      - Model操作
      - Form验证(ModelForm)
      - 中间件
      - 缓存
      - 信号



    一、 Session
      基于Cookie做用户验证时:敏感信息不适合放在cookie中

        a. Session原理
          Cookie是保存在用户浏览器端的键值对
          Session是保存在服务器端的键值对

        b. Cookie和Session对比

        c. Session配置(缺少cache)

        d. 示例:实现两周自动登陆
        - request.session.set_expiry(60*60*24*14)
        - SESSION_SAVE_EVERY_REQUEST = True

        PS: cookie中不设置超时时间,则表示关闭浏览器自动清除


      - session依赖于cookie
      - 服务器session
        request.session.get()
        request.session[x] = x
        request.session.clear()

      - 配置文件中设置默认操作(通用配置):
        SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
        SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径(默认)
        SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默认)
        SESSION_COOKIE_SECURE = False # 是否Https传输cookie(默认)
        SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输(默认)
        SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默认)
        SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认)
        # set_cookie('k',123)
        SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认)

      - 引擎的配置

    二、 CSRF
      a. CSRF原理

      b. 无CSRF时存在隐患

      c. Form提交(CSRF)

      d. Ajax提交(CSRF)
        CSRF请求头 X-CSRFToken

    三、 Model操作

      a. 字段类型 + 参数

      b. 连表字段 + 参数

      c. Meta

      d. SQL操作:
        - 基本增删改查
        - 进阶操作
        - 正反查询
        - 其他操作

      e. 验证(弱)

    四、 Form操作
      完成:
        - 验证用户请求
        - 生成HTML
        (保留上一次提交的数据)

      自定义:
        - 类
        - 字段(校验)
        - 插件(生成HTML)

      初始化操作:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <form action="/fm/" method="POST">
            {% csrf_token %}
            <p>{{ obj.user.label }} {{ obj.user }} {{ obj.errors.user.0 }}</p>
            <p>{{ obj.pwd }} {{ obj.errors.pwd.0 }}</p>
            <p>{{ obj.email }}{{ obj.errors.email.0 }}</p>
            <p>{{ obj.f }}{{ obj.errors.f.0 }}</p>
            {{ obj.city1 }}
            {{ obj.city2 }}
            <input type="submit" value="提交" />
        </form>
    </body>
    </html>
    form.html
    from django.shortcuts import render,redirect,HttpResponse
    from django import forms
    from django.forms import widgets
    from django.forms import fields
    class FM(forms.Form):
        # 字段本身只做验证
        user = fields.CharField(
            error_messages={'required': '用户名不能为空.'},
            widget=widgets.Textarea(attrs={'class': 'c1'}),
            label="用户名",
            )
        pwd = fields.CharField(
            max_length=12,
            min_length=6,
            error_messages={'required': '密码不能为空.', 'min_length': '密码长度不能小于6', "max_length": '密码长度不能大于12'},
            widget=widgets.PasswordInput(attrs={'class': 'c2'})
        )
        email = fields.EmailField(error_messages={'required': '邮箱不能为空.','invalid':"邮箱格式错误"})
    
        f = fields.FileField()
    
        # p = fields.FilePathField(path='app01')
    
        city1 = fields.ChoiceField(
            choices=[(0,'上海'),(1,'广州'),(2,'东莞')]
        )
        city2 = fields.MultipleChoiceField(
            choices=[(0,'上海'),(1,'广州'),(2,'东莞')]
        )
    
    from app01 import models
    def fm(request):
        if request.method == "GET":
            # 从数据库中吧数据获取到
            dic = {
                "user": 'r1',
                'pwd': '123123',
                'email': 'sdfsd',
                'city1': 1,
                'city2': [1,2]
            }
            obj = FM(initial=dic)
            return render(request,'fm.html',{'obj': obj})
        elif request.method == "POST":
            # 获取用户所有数据
            # 每条数据请求的验证
            # 成功:获取所有的正确的信息
            # 失败:显示错误信息
            obj = FM(request.POST)
            r1 = obj.is_valid()
            if r1:
                # obj.cleaned_data
                models.UserInf.objects.create(**obj.cleaned_data)
            else:
                # ErrorDict
                # print(obj.errors.as_json())
                # print(obj.errors['user'][0])
                return render(request,'fm.html', {'obj': obj})
            return render(request,'fm.html')
    view.py

    五、中间件

      1、中间件创建

      (1)创建一目录Middle下创建一py文件

      

      (2)配置文件中添加中间件

        

      2、中间件生命周期

      (1)正常流程 

    from django.utils.deprecation import MiddlewareMixin
    from django.shortcuts import HttpResponse
    
    class Row1(MiddlewareMixin):
        def process_request(self,request):
            print('第一层第一列')
        #注意下面的request和response的顺序
        def process_response(self, request,response):
            print('第一层第二列')
            return response
    
    class Row2(MiddlewareMixin):
        def process_request(self,request):
            print('第二层第一列')
            #如果到这里请求直接返回的话,10版的会直接从同一层response返回
            #10版以前的会到最后一个中间键开始返回response
            # return HttpResponse('请求截胡')
    
        def process_response(self, request, response):
            print('第二层第二列')
            return response
    
    class Row3(MiddlewareMixin):
        def process_request(self,request):
            print('第三层第一列')
        def process_response(self, request, response):
            print('第三层第二列')
            return response
    View Code

        效果图

        

          

      (2)提前截胡,在同一层的request直接响应请求,不会往下一层走了

    from django.utils.deprecation import MiddlewareMixin
    from django.shortcuts import HttpResponse
    
    class Row1(MiddlewareMixin):
        def process_request(self,request):
            print('第一层第一列')
        #注意下面的request和response的顺序
        def process_response(self, request,response):
            print('第一层第二列')
            return response
    
    class Row2(MiddlewareMixin):
        def process_request(self,request):
            print('第二层第一列')
            #如果到这里请求直接返回的话,10版的会直接从同一层response返回
            #10版以前的会到最后一个中间键开始返回response
            return HttpResponse('请求截胡')
    
        def process_response(self, request, response):
            print('第二层第二列')
            return response
    
    class Row3(MiddlewareMixin):
        def process_request(self,request):
            print('第三层第一列')
        def process_response(self, request, response):
            print('第三层第二列')
            return response
    View Code

        效果图

        

        

       总结:

        

        也就是说,每一个请求都是先通过中间件中的 process_request 函数,这个函数返回 None 或者 HttpResponse 对象,如果返回前者,继续处理其它中间件,如果返回一个 HttpResponse,就处理中止,返回到网页上。

    六、 缓存
      5种配置
      3种应用:
        全局
        视图函数
        模板

    七、 信号
      - 内置信号
      - 自定义
      - 定义信号
      - 出发信号
      - 信号中注册函数

  • 相关阅读:
    dirname basename 截取路径中的目录以及文件名
    Singleton 单例模板
    人生最后一个10年-白银时代
    自动填充英文字母序列
    关于最近使用文档的几个技巧
    关于最近使用文档的几个技巧
    The King of Excel Geek 0.1版本
    Tkinter 学习
    test
    检测电话号码的python程序(一)
  • 原文地址:https://www.cnblogs.com/manger/p/6281595.html
Copyright © 2020-2023  润新知