• Django


    一、Cookies和Session

    1、Cookie
    Cookie是保存在浏览器上的键值对。服务端在返回响应的时候设置的

    Django操作Cookies:
    1)、设置Cookie
    req = HttpResponse("OK")
    req.set_cookie("key", "value")
    req.set_signed_cookie("key", "value", salt="shanghais1hao", max_age=秒)        # 设置加盐的cookie

    2)、获取Cookie
    request.COOKIES       --> 大字典
    request.COOKIES["key"]
    request.COOKIES.get("key", "")
    request.get_signed_cookie("key", default="", salt="shanghais1hao")        # 获取加盐的Cookie

    3)、删除Coookie
    req.delete_cookie("key")


    2、Session
    1)、浏览器请求来了之后,服务端给浏览器分配一个序号(口令)
    2)、浏览器收到响应之后,把得到的口令保存在cookie
    3)、浏览器携带着刚才得到的口令,再次发送请求
    4)、服务端拿到口令,去后端根据口令找对应的数据(大字典)

    Django操作Session:
    1)、设置Session
    1. request.session["key"] = "value"
    2. request.session.set_expiry(秒/日期对象/时间间隔对象/0/None)
    3. request.session.setdefault("k1", "v1")

    2)、获取Session数据
    1. request.session.get("k1", "")
    2. request.session["k1"]
    3. request.session.keys()
    4. request.session.values()
    5. request.session.items()
    6. request.session.iterkeys()
    7. request.session.itervalues()
    8. request.session.iteritems()

    3)、删除Session
    1. request.session.flush()       --> 多用于注销
    2. request.session.delete()

    4)、手动清除早已经过期的session数据
    request.session.clear_expired()

    5)、相关配置项(写在settings.py中的)

    1.每次请求都更新Session失效时间
    SESSION_SAVE_EVERY_REQUEST = True
    2. SESSION_COOKIE_AGE = 1209600       # 设置Cookie超时时间
    3. SESSION_COOKIE_NAME = "sessionid"       # Session的cookie保存在浏览器上时的key
    4. 其他:
    SESSION_COOKIE_PATH = "/"       # Session的cookie保存的路径(默认)
    SESSION_COOKIE_DOMAIN = None       # Session的cookie保存的域名(默认)
    SESSION_COOKIE_SECURE = False       # 是否Https传输cookie(默认)
    SESSION_COOKIE_HTTPONLY = True      # 是否Session的cookie只支持http传输(默认)


    二、中间件

    中间件是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出。因为改变的是全局,所以需要谨慎实用,用不好会影响到性能。每个中间件都会负责一个功能。

    中间件本质上就是一个自定义类,类中定义了几个方法,Django框架会在请求的特定的时间去执行这些方法。

    自定义中间件方法:
    1、导入模块:from django.utils.deprecation import MiddlewareMixin
    2、按照格式要求写一个类,类继承MiddlewareMixin
    3、把写好的类在settings.py注册到MIDDLEWARE配置项的列表中
    4、在类中重写方法

    每一个中间件中五个可以被重写的方法:

    1、请求预处理:process_request(self,request)
    1)、执行时间
    在urls.py之前执行
    2)、执行的顺序
    按照在列表中注册的顺序依次执行
    3)、返回值
    1. 返回None, 不做任何处理直接进行下一步
    2. 返回响应对象, 直接跳出(后续中间件的process_request、不执行urls.py和views.py)返回响应

    2、视图预处理:process_view(self, request, view_func, view_args, view_kwargs)
    1)、执行时间:
    在urls.py之后在执行真正的视图函数之前
    2)、执行顺序
    按照在列表中注册的顺序依次执行
    3)、返回值
    1. 返回None, 放行
    2. 返回响应对象,就直接跳出,倒序依次执行所有中间件的process_response方法

    3、process_template_response(self,request,response)

    4、异常后处理:process_exception(self, request, exception)

    5、应答后处理:process_response(self, request, response)
    1)、执行时间
    在views.py返回响应对象之后执行
    2)、执行顺序
    按照在列表中注册的倒序依次执行
    3)、返回值
    必须要有返回值,返回的是响应对象

    三、Ajax

    异步的Javascript和XML,即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML)
    同步交互:客户端发出一个请求后,需要等待服务器响应结束后,才能发出第二个请求;
    异步交互:客户端发出一个请求后,无需等待服务器响应结束,就可以发出第二个请求。

    AJAX 特点:
    1)、局部更新页面
    2)、异步发送请求

    其实AJAX就是在Javascript中多添加了一个对象:XMLHttpRequest对象。所有的异步交互都是使用XMLHttpServlet对象完成的。也就是说,我们只需要学习一个Javascript的新对象即可。

    1、原生JS实现Ajax:

    let a = document.getElementById('b1');
        a.onclick = function () {
            let xmlHttp = new XMLHttpRequest();           生成xmlHttp对象
            xmlHttp.open("POST", "/ajax_js/", true);            打开与服务器的连接,调用xmlHttp的open方法设置请求 相关配置项
            xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");            设置请求头
            xmlHttp.send("");              调用send方法发送请求
            xmlHttp.onreadystatechange = function () {              处理返回的响应
                if (xmlHttp.readyState == 4 && xmlHttp.status==200) {
                    alert(xmlHttp.responseText);
                }
            };
        }

    2、jQuery实现的AJAX

    ajax() 方法用于执行 AJAX(异步 HTTP)请求,所有的 jQuery AJAX 方法都使用 ajax() 方法。
    语法:$.ajax({name:value, name:value, ... })       参数规定了AJAX请求的一个或多个键值对

    $("#b1").click(function () {
            $.ajax({
                url: "/ajax_jQuery/",
                type: "PORT",
                data: {username: "a"},
                success: function (data) {
                    alert(data)
                }
            })
        })

    data参数中的键值对,如果值不为字符串,需要将其转换成字符串类型

    3、提交携带文件类型的数据

    1)、var formData = new FormData();       // 生成一个FormData对象
    2)、var fileObj = $("#f1")[0].files[0]         // 得到用户选中的文件对象
    3)、formData.append("f1", fileObj)      // 向formData对象中添加键值对数据
    4)、$.ajax({
                url: "/index/",        // 往哪里发送请求
                type: "POST",     // 请求的方法
                processData: false,       // 不让jQuery处理我的数据
                contentType: false,      // 不让jQuery设置请求头
                data: formData,
                success:function(data){
                   // 请求被正常响应时自动执行的回调函数
                   console.log(data)
              }
        })

    4、AJAX请求设置csrf_token的方式:

    1)、通过获取隐藏的input标签中的csrfmiddlewaretoken值,放置在data中发送
    data: {
                "username": "li",
                "password": 123,
                "csrfmiddlewaretoken": $("[name = 'csrfmiddlewaretoken']").val()
            },

    2)、通过获取返回的cookie中的字符串 放置在请求头中发送,需要引入一个jquery.cookie.js插件

    <script src="{% static 'js/jquery.cookie.js' %}"></script>
    $.ajax({
    headers:{"X-CSRFToken":$.cookie('csrftoken')},
    })

    3)、使用$.ajaxSetup()方法为ajax请求统一设置

    $.ajaxSetup({
    data: {csrfmiddlewaretoken: '{{ csrf_token }}' },
    });


    5、jQuery.serialize()

    serialize()函数用于序列化一组表单元素,将表单内容编码为用于提交的字符串(快速把ORM对象转换成JSON格式的数据)。serialize()函数常用于将表单内容序列化,以便用于AJAX提交,serialize()函数的返回值为字符串类型

    四、form组件

    1、form组件的主要作用:
    1)、在html中生成表单框架,只能生成获取用户信息的input标签
    2)、对提交过来的数据做校验,返回错误提示信息
    3)、在页面中保留用户原来填写的信息

    2、form组件的用法:

    1)、导入模块from django import forms,自定义一个form类,继承forms.Form

    2)、生成一个form类的实例对象form_obj

    3)、在前端页面(提示性的文本、input标签、响应的错误提示信息)
    {{ form_obj.as_p }}        在<p> 显示表单
    {{ form_obj.as_ul }}       在<ul> 显示表单
    {{ form_obj.as_table }}       在<table>显示表单
    {% for field in form_obj %}      以循环形式显示表单
    {% endfor %}

    4)、在后端做表单验证
    form_obj.is_valid(request.POST)      --> 对数据做有效性校验 ,将表单的数据放到cleaned_data属性
    form_obj.cleaned_data        --> 获取所有经过校验的数据

    3、form常用字段与插件

    字段用于对用户请求数据的验证,插件用于自动生成HTML

    1)、initial     初始值,input框里面的初始值
    2)、error_messages     重写错误信息
    3)、密码     widget=forms.widgets.PasswordInput
    4)、radioSelect     widget=forms.widgets.RadioSelect    单radio值为字符串
    5)、单选Select     widget=forms.widgets.Select
    6)、多选Select     widget=forms.widgets.SelectMultiple
    7)、单选checkbox     widget=forms.widgets.CheckboxInput

    五、Django内置的认证系统

    1、auth

    模块是Django提供的标准权限管理系统,可以提供用户身份认证,用户组和权限管理。
    from django.contrib import auth

    auth可以和admin模块配合使用, 快速建立网站的管理系统。

    1)、authenticate()
    from django.contrib.auth import authenticate

    提供了用户认证,即验证用户名以及密码是否正确,一般需要username password两个关键字参数,若有效则返回代表该用户的user对象, 若无效则返回None

    2)、login(HttpRequest, user)

    此函数使用django的session框架给某个已认证的用户附加上session id等信息。

    3)、logout(request)
    from django.contrib.auth import logout

    该函数接受一个HttpRequest对象,无返回值。当调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错。

    4)、装饰器@login_required
    from django.contrib.auth.decorators import login_required

    1. 用户登陆后才能访问某些页面
    2. 如果用户没有登录就访问该页面的话直接跳到登录页面
    3. 用户在跳转的登陆界面中完成登陆后,自动访问跳转到之前访问的地址

    需要在settings.py中配置,默认跳转的login URl是什么
    LOGIN_URL = '/login/'

    2、User对象

    User是auth模块中维护用户信息的关系模式(继承了models.Model), 数据库中该表被命名为auth_user
    from django.contrib.auth.models import User

    扩展默认的auth_user表:
    1)、通过继承内置的 AbstractUser 类,来定义一个自己的Model类
    from django.contrib.auth.models import AbstractUser

    2)、在settings.py中告诉Django,现在使用新定义的表来做用户认证。
    AUTH_USER_MODEL = "app名.新表名"

    3)、一旦指定了新的认证系统所使用的表,就需要重新在数据库中创建该表,而不能继续使用原来默认的auth_user表了。

    User对象属性:username, password(必填项),password用哈希算法保存到数据库
    is_staff:用户是否拥有网站的管理权限
    is_active:是否允许用户登录, 设置为'False',可以不用删除用户来禁止用户登录

    1)、创建用户
    使用 create_user 辅助函数创建用户:user = User.objects.create_user(username, password,...)
    需要调用save()方法新用户才会写入数据库:user.save()

    2)、is_authenticated()
    在后台用request.user.is_authenticated() 判断用户是否已经登录,如果true则可以向前台展示request.user.name

    3)、检查密码是否正确
    user_obj.check_password(原密码)

    4)、修改密码
    使用 set_password()来修改密码,修改完要保存

    ser_obj.set_password(新密码)
    user_obj.save()

  • 相关阅读:
    Android Studio快速定位当前文件所在的位置
    LeetCode:Search Insert Position
    apk当安装程序将文件复制到手机自带的指定文件夹
    《UNIX级别编程环境》注意读出信号(2)
    iOS:删除小程序
    百度CSND博客在搜索栏中显示图片
    HDU4893:Wow! Such Sequence!(段树lazy)
    Google I/O 2014? No,Android I/O 2014
    Android Push Notifications using Google Cloud Messaging (GCM), PHP and MySQL
    自己动手写CPU 笔记
  • 原文地址:https://www.cnblogs.com/Python1/p/9230748.html
Copyright © 2020-2023  润新知