Django中间件,CSRF(跨站请求伪造),缓存,信号,BootStrap(模板)-响应式(栅格)+模板
Django中间件,CSRF(跨站请求伪造),缓存,信号,BootStrap(模板)-响应式(栅格)+模板
1.中间件(重要):
在Django的setting中有个MIDDLEWARE列表,里面的东西可以理解为过滤管道,里面有个安全过滤管道: from django.middleware.csrf import CsrfViewMiddleware里面有四个常用的方法:
- process_request:客户端请求的通道,但当此方法里面有return时就不会再执行后面的方法,直接走process_response方法(表示请求数据被拦截)。注:其中使用return 会拦截掉客户端的所有请求。
- process_views:经过process_request之后再从新从每个管道的此方法执行后面的方法(后面的方法指的是主体URL请求时所走的views方法)。
- process_exception:抛出异常,在process_response方法执行之前,且只抛出URL链接请求的views方法中的异常,不会抛出process_request,process_views中的异常,而且所有的异常抛出后才会从第一个process_response方法返回给客户端请求的内容。
- process_response:请求获取到数据返回的路径。注:必有返回值 且 return 要返回固定参数。
2.CSRF(跨站请求伪造):
默认情况下不使用任何方法或装饰器,在Django项目配置文件setting.py文件的MIDDLEWARE的csrf管道会拦截post请求。
-
在使用form表单发送post请求时要在表单的里面加入
-
在使用Ajax发送post请求时要在Ajax里面的请求投headers加入{'X-CSRFToken'😒.cookie('csrftoken')} ---(要导入Jquery文件和Jq的cookies文件)如果想全局设置headers就可以使用:
//使用此方法就不用再ajax中再设置headers请求头 <script> $(function(){ $.ajaxSetup({ beforeSend:function(xhr){ xhr.setRequestHeader("X-CSRFToken",$.cookie('csrftoken')); } }); }); </script>
-
$.cookie('csrftoken')是cookies的csrftoken随机字符串,csrf原理和cookie相似,他会给经过的信息做标记,携带此标记才不会被拦截,$.cookie('csrftoken')的作用就是获取cookie的那个标记(csrf随机生成的字符串)
-
由于中间件是针对全局操作的,当注释 #'django.middleware.csrf.CsrfViewMiddleware',整个网站的链接都不会执行CSRF验证,如果要针对某个链接请求操作使用CSRF操作可以在Views文件的方法上使用装饰器:@csrf_protect(声名使用CSRF)-- 全局不使用CSRF时,某几个需要使用时 --
-
由于中间件是针对全局操作的,当使用 'django.middleware.csrf.CsrfViewMiddleware',整个网站的链接都会执行CSRF验证,如果要针对某个链接请求禁止通过CSRF操作可以在Views文件的方法上使用装饰器:@csrf_exempt(声名禁止CSRF)-- 全局使用CSRF时,某几个不需要使用时 --
3.缓存
在settings.py文件里面配置:缓存级别
- 全栈缓存:要使用两个特殊的中间件,放在setting的MIDDLEWARE列表里面,最上面一个,最下面一个。转载:https://www.cnblogs.com/wupeiqi/articles/5246483.html(里面包含缓存Session等知识)。
- 单独视图缓存
- 局部视图缓存
Django的六种缓存方式:
-
开发调试:调试时使用,实际内部不做任何操作
-
内存:缓存的内容存在内存中
-
文件:缓存的内容存在文件中
-
数据库:缓存的内容存在数据库中
-
Memcache缓存(python-memcached模块):此缓存使用python-memcached模块连接Memcache(另外一台机器)可以有三种链接方式,链接另一台机器,链接本机,链接多台机器。
-
Memcache缓存(pylibmc模块):此缓存使用pylibmc模块连接Memcache(另外一台机器)可以有三种链接方式,链接另一台机器,链接本机,链接多台机器。
-
关于缓存更详细的内容请看转载链接:https://www.cnblogs.com/wupeiqi/articles/5246483.html
-
关于缓存更详细的内容请看转载链接:https://www.cnblogs.com/wupeiqi/articles/5132791.html
CACHES = { 'default':{ 'BACKEND':'django.core.cache.backends.dummy.DummyCache' #引擎(开发调试的引擎) 'TIMEOUT':300, #缓存超时时间(默认300,None表示永不过期,0表示立即过期) 'OPTIONS':{ 'MAX_ENTRIES':300, #最大缓存个数(默认300) 'CULL_FREQUENCY':3, #缓存到达最大数之后,剔除缓存个数的比例:1/CULL_FREQUENCY:3,只的是分数1/3,三分之一。 }, 'KEY_PREFIX':'', #缓存key的前缀(默认空) 'VERSION':1, #缓存key的版本(默认1) 'KEY_FUNCTION':函数名, #生成key的函数(默认函数会生成为:[前缀:版本号:key]) } }
4.信号(Django预留的钩子)
-
内置信号:在指定信号中注入操作函数
作用:使用Django内部定义的信号,在指定位置 注入 指定操作(触发信号)
-
自定义信号:可应用于任何地方,可动态配置
注:也可以自定义信号
-
大多用于大型程序的可扩展项
Model signals
pre_init #django的modal执行其构造方法前,自动触发
post_init #django的model执行其构造方法后,自动触发
pre_save #django的model对象保存前,自动触发
post_save #django的model对象保存后,自动触发
pre_delete #django的model对象删除前,自动触发
post_delete #django的model对象删除后,自动触发
m2m_changed #django的model中使用m2m字段操作第三张表(add,remove,clear)前后,自动触发
#程序启动时,检测已注册的app中modal类,对于每一个类,自动触发
Management signals
pre_migrate #执行migrate命令前,自动触发
post_migrate #执行migrate命令后,自动触发
Request/resonse signals
request_atarted #请求到来前,自动触发
request_finished #请求结束后,自动触发
got_request_exception #请求异常后,自动触发
Test signals
setting_changed #使用test测试修改配置文件时,自动触发
template_rendered #使用test测试渲染模板时,自动触发
Database Wrappers
connection_created #创建数据库连接时,自动触发
使用方法:
from django.db.models.signals import class_prepared
def callback(sender,**Kwargs):
print("pre_init_callback")
print(sender,kwargs)
pre_init.connect(callback)
#导入方法:钩子函数名.connect(写好的函数)
#要在项目的__init__.py文件中写或导入
5.BootStrap(模板)-响应式(栅格)+ 模板
下载BootStrap,详细操作请看官方文档。