表单form:
- 对用户请求的数据进行校验
- 生成HTML标签
PS:
- form对象是一个可迭代对象。
- 问题:如何实现choice的数据实时更新?(动态数据,而不是写死)
- 解决:给该字段定义成ModelChoiceField的时候利用好"queryset"参数
class UserForm(Form):
ut_id = ModelChoiceField(queryset=models.UserType.objects.all()) # 从另一张依赖表中提取数据
依赖表:
class UserType(models.Model):
title = models.CharField(max_length=32)
信号signal:
django的信号其实就是django内部为开发者预留的一些自定制功能的钩子。
只要在某个信号中注册了函数,那么django内部执行的过程中就会自动触发注册在信号中的函数。
如:
pre_save & post_save 在ORM模型的save()方法调用之前或之后发送信号
pre_delete & post_delete 在ORM模型或查询集的delete()方法调用之前或之后发送信号
request_started & request_finished 当接收和关闭HTTP请求时发送信号
m2m_changed 当多对多字段被修改时发送信号
场景:
在数据库某些表中添加数据时,可以进行日志记录。
中间件middleware:
对所有的【请求】进行【批量】处理,说得直白一点中间件是帮助我们在视图函数执行之前和执行之后都可以做一些额外的操作,它本质上就是一个自定义类。其影响的是全局,需谨慎使用。
应用:用户登录校验
问题:为甚么不使用装饰器?
如果不使用中间件,就需要给每个视图函数添加装饰器,太繁琐。
权限:
用户登录后,将权限放到session中,然后再每次请求进来在中间件里,根据当前的url去session中匹配,
判断当前用户是否有权限访问当前url,有权限就继续访问,没有就返回,
检查的东西就可以放到中间件中进行统一处理,在process_request方法里面做的,
我们的中间件是放在session后面,因为中间件需要到session里面取数据。
会话session:
cookie与session区别
(a)cookie是保存在浏览器端的键值对,而session是保存的服务器端的键值对,但是依赖cookie。(也可以不依赖cookie,可以放在url,或请求头但是cookie比较方便)
(b)以登录为例,cookie为通过登录成功后,设置明文的键值对,并将键值对发送客户端存,明文信息可能存在泄漏,不安全;
session则是生成随机字符串,发给用户,并写到浏览器的cookie中,同时服务器自己也会保存一份。
(c)在登录验证时,cookie:根据浏览器发送请求时附带的cookie的键值对进行判断,如果存在,则验证通过;
session:在请求用户的cookie中获取随机字符串,根据随机字符串在session中获取其对应的值进行验证
跨域请求cors(场景:前后端分离时,本地测试开发时使用):
如果网站之间存在跨域,域名不同,端口不同会导致出现跨域,但凡出现跨域,浏览器就会出现同源策略的限制。
解决:在我们的服务端给我们响应数据,加上响应头 --> 在中间件加的。
缓存cache:
常用的数据放在缓存里面,就不用走视图函数,请求进来通过所有的process_request,会到缓存里面查数据,有就直接拿,没有就走视图函数。
关键点:1:执行完所有的process_request才去缓存取数据
2:执行完所有的process_response才将数据放到缓存
关于缓存问题
1:为什么放在最后一个process_request才去缓存?
因为需要验证完用户的请求,才能返回数据
2:什么时候将数据放到缓存中?
第一次走中间件,缓存没有数据,会走视图函数,取数据库里面取数据,
当走完process_response,才将数据放到缓存里,因为,走process_response的时候可能给我们的响应加处理。
3:为什么使用缓存?
将常用且不太频繁修改的数据放入缓存。
以后用户再来访问,先去缓存查看是否存在,如果有就返回
否则,去数据库中获取并返回给用户(再加入到缓存,以便下次访问)
CSRF-TOKEN:
目标:防止用户直接向服务端发起POST请求。
对所有的post请求做验证,将jango生成的一串字符串发送给后台,一种是从请求体发过来,一种是放在隐藏的标签里面。
方案:先发送GET请求时,将token保存到:cookie、Form表单中(隐藏的input标签),
以后再发送请求时只要携带过来即可。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。