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