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()

 

posted @ 2018-06-26 18:55  字符编码  阅读(729)  评论(0编辑  收藏  举报