一.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的博客