django之初学session,中间件,缓存,信号,Form类

一.session

session的原理
在使用cookie的过程中,cookie是保存在用户客户端中,敏感信息不适合放在cookie中。
原理:而session也是虽说基于cookie来做验证,但是当用户请求(登录)过来时,服务端会生成一个随机字符串存放到相应的客户端中,然后将此字符串和用户登录信息以键值对的形式存在在服务端上。当客户端带着随机字符串再来请求时,服务端会进行匹配,从而进行免登录的操纵。
session的存储配置

  • 数据库(默认)
  • 缓存
  • 文件
  • 缓存+数据库
  • 加密cookie

简单的使用(以数据库为主):

1.配置settings.py
     SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默认)
2.使用
    def index(request):
        # 获取、设置、删除Session中数据
        request.session['k1']
        request.session.get('k1',None)
        request.session['k1'] = 123
        request.session.setdefault('k1',123) # 存在则不设置
        del request.session['k1']
        。。。(还有其他语句)

详情可以看老男孩wupeiqi的博客

二.CSRF

目的:

django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成

原理:
当设置了csrf中间件后,当用户进行url的get请求时,服务端给生成一个字符串(csrf_token)给客户端,随后当用户进行表单提交时,必须一同csrf_token,服务端确认正确后才允许提交表单。

全局(在setting.py中设置):

  中间件 django.middleware.csrf.CsrfViewMiddleware
局部(用在程序代码中):

@csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。
@csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。

Form提交

<form action='xx' method='post'>
    {% csrf_token %}
    ...
    </form>

ajax提交

 <script type="text/javascript">
    var csrftoken = $.cookie('csrftoken');//获得csrf——token

    function csrfSafeMethod(method) {
        // these HTTP methods do not require CSRF protection
        return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
    }
    $.ajaxSetup({
        beforeSend: function(xhr, settings) {
            if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
                //set CSRF protect
                xhr.setRequestHeader("X-CSRFToken", csrftoken);
            }
        }
    });
    function Do(){
         //提交ajax,就需要通过CSRF验证。
        $.ajax({
            url:"/app01/test/",
            data:{id:1},
            type:'POST',
            success:function(data){
                console.log(data);
            }
        });

    }
</script>

三.中间件(适合对所有请求进行统一操作)

过程

当一个用户请求到来时,会先经过中间件的处理,经过一定条件后会到达视图函数,然后返回的response也会经过中间件的处理后再返回给客户端。

原理:
中间件就是一个类,内部有些固定的函数处理。而请求的传递和处理都是经过这些固定函数的处理。

自定义中间件:
class ‘name':
    def process_request(self,request):

    def process_view(self, request, callback, callback_args, callback_kwargs)
    # callback是相应的view函数,callback_args是的url传过来的参数(未指明变量), callback_kwargs是url传过来的参数(指明变量)
    def process_response(self,request, response):

    def process_exception(self, request, exception):
    #处理异常的函数

注册中间件:
settings.py:
    IDDLEWARE_CLASSES = (
        。。。
        "name",
        )



4.Form类

django中Form类的几大功能:

  • 生成html标签
  • 验证用户数据(显示错误信息)
  • HTML Form提交保留上次提交数据
  • 初始化页面显示内容

Form的使用过程详解:

1.创建Form类:
from django.forms import Form
from django.forms import widgets
from django.forms import fields

class MyForm(Form):
    # 1.首先同django的内置字段(CharField之类)来声明表单字段
    # 2.然后在内置字段内设置属性(required之类),该属性可以对应到生成的html标签中。
    # 3.wdiget属性是django的内置插件。可以生成样式和html标签属性。
    user = fields.CharField(required=True,
        widget=widgets.TextInput(attrs={'id': 'i1', 'class': 'c1'})
    )

    gender = fields.ChoiceField(
        choices=((1, '男'), (2, '女'),),
        initial=2,
        widget=widgets.RadioSelect
    )

    city = fields.CharField(
        initial=2,
        widget=widgets.Select(choices=((1,'上海'),(2,'北京'),))
    )

    pwd = fields.CharField(
        widget=widgets.PasswordInput(attrs={'class': 'c1'}, render_value=True)
    )

view函数处理:

from django.shortcuts import render, redirect
from .forms import MyForm


def index(request):
    if request.method == "GET":
        # 将指定的Form类的实例传给页面处理,生成相应的表单页面。
        obj = MyForm()
        return render(request, 'index.html', {'form': obj})
    elif request.method == "POST":
        # 在POST请求中,要将request.POST(即用户的请求数据)最为Form类的参数。这样声明的实例便可以处理请求数据了。
        obj = MyForm(request.POST)
        # is_valid()对请求数据处理,True便代表处理成功。
        if obj.is_valid():
            # clean()以字典的方式返回表单中字段的填写数据(user,pwd之类)
            values = obj.clean()
            print(values)
        else:
            # obj.errors:当表单字段的填写数据无效时,便会返回错误信息。
            errors = obj.errors
            print(errors)
        return render(request, 'index.html', {'form': obj})
    else:
        return redirect('http://www.google.com')

生成HTML:

<form action="/" method="POST" enctype="multipart/form-data">
    <p>{{ form.user }} {{ form.user.errors }}</p>
    <p>{{ form.gender }} {{ form.gender.errors }}</p>
    <p>{{ form.city }} {{ form.city.errors }}</p>
    <p>{{ form.pwd }} {{ form.pwd.errors }}</p>
    <input type="submit"/>
</form>

Django的内置字段,属性,插件:

详细资料可以浏览老男孩wupeiqi的博客

五.信号

内置信号

Model signals
    pre_init                    # django的modal执行其构造方法前,自动触发
    post_init                   # django的modal执行其构造方法后,自动触发
    pre_save                    # django的modal对象保存前,自动触发
    post_save                   # django的modal对象保存后,自动触发
    pre_delete                  # django的modal对象删除前,自动触发
    post_delete                 # django的modal对象删除后,自动触发
    m2m_changed                 # django的modal中使用m2m字段操作第三张表(add,remove,clear)前后,自动触发
    class_prepared              # 程序启动时,检测已注册的app中modal类,对于每一个类,自动触发
Management signals
    pre_migrate                 # 执行migrate命令前,自动触发
    post_migrate                # 执行migrate命令后,自动触发
Request/response signals
    request_started             # 请求到来前,自动触发
    request_finished            # 请求结束后,自动触发
    got_request_exception       # 请求异常后,自动触发
Test signals
    setting_changed             # 使用test测试修改配置文件时,自动触发
    template_rendered           # 使用test测试渲染模板时,自动触发
Database Wrappers
    connection_created          # 创建数据库连接时,自动触发

除了内置信号,我们还可以自定义信号。
详细操作可以浏览老男孩wupeiqi的博客

猜你喜欢

转载自blog.csdn.net/qq_33316576/article/details/80001193