一、装饰器
鉴权装饰器函数
def auth(func): # 用户验证的装饰器 def inner(request, *args, **kwargs): u = request.COOKIES.get("username") if not u: return redirect("/a/login") return func(request, *args, **kwargs) return inner
1、FBV
@auth def admin(request): u = request.COOKIES.get("username") return render(request, "admin.html", {"user": u})
2、CBV
from django.views import View from django.utils.decorators import method_decorator # 方式三,类上加认证装饰器 @method_decorator(auth, name="dispatch") class Order(View): # 方式二,入口处加认证装饰器 # @method_decorator(auth) def dispatch(self, request, *args, **kwargs): return super(Order, self).dispatch(request, *args, **kwargs) # 方式一,方法上加认证装饰器 # @method_decorator(auth) def get(self, request): u = request.COOKIES.get("username") return render(request, "admin.html", {"user": u}) def post(self, request): u = request.COOKIES.get("username") return render(request, "admin.html", {"user": u})
二、cookie
客户端浏览器上的一个文件
基于cookie做用户验证
1、Django后台
(1)普通cookie
# 获取: request.COOKIES.get("pre_count", 10) # 设置: rep = HttpResponse(...) 或 rep = render(request, ...) rep.set_cookie(key,value,...) """ 参数: key, 键 value='', 值 max_age=None, 超时时间长度 expires=None, 到期时间点 path='/', Cookie生效的路径,/ 表示根路径,特殊的:跟路径的cookie可以被任何url的页面访问 domain=None, Cookie生效的域名 secure=False, https传输 httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖) """
(2)加密cookie
# 设置: ret.set_signed_cookie(key="username", value=username, expires=t, salt="ppyy") # 获取: u = request.get_signed_cookie("username", salt="ppyy") # 备注:设置和获取的salt参数要一致,相当于钥匙
2、前端获取
(1)浏览器console查看 :
document.cookie
(2)通过jQuery获取
//jquery插件:http://plugins.jquery.com/cookie/ //获取: var v = $.cookie("pre_count"); //设置: $.cookie("pre_count", v);
三、session
基于cookie做用户验证时,敏感信息不适合放在cookie中
1、session原理
cookie 是保存在用户浏览器端的键值对 session 是保存在服务端的键值对
2、流程:
(1)设置session
生成随机字符串 写到用户浏览器cookie 保存到session中 在随机字符串字典中设置相关内容 后台需要建立初始化数据库,系统自动建立表 django_session
(2)获取session
获取用户的随机字符串 根据随机字符串获取对应值
3、cookie 和 session 对比
session依赖于cookie
4、session配置(缺少cache)
5、示例: 实现两周自动登录
request.session.set_expiry(60*10)
6、操作:
# 获取、设置、删除Session中数据 request.session['k1'] request.session.get('k1',None) request.session['k1'] = 123 request.session.setdefault('k1',123) # 存在则不设置 del request.session['k1'] # 所有 键、值、键值对 request.session.keys() request.session.values() request.session.items() request.session.iterkeys() request.session.itervalues() request.session.iteritems() request.session.clear() # 用户session的随机字符串 request.session.session_key # 将所有Session失效日期小于当前日期的数据删除 request.session.clear_expired() # 检查 用户session的随机字符串 在数据库中是否 request.session.exists("session_key") # 删除当前用户的所有Session数据 request.session.delete("session_key") request.session.set_expiry(value) """ * 如果value是个整数,session会在些秒数后失效。 * 如果value是个datatime或timedelta,session就会在这个时间后失效。 * 如果value是0,用户关闭浏览器session就会失效。 * 如果value是None,session会依赖全局session失效策略。 """
7、配置 settings.py
(1)种类:
数据库(默认) 缓存 文件 缓存+数据库 加密cookie
(2)默认配置
# 引擎(默认) SESSION_ENGINE = 'django.contrib.sessions.backends.db' # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认) SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存的路径(默认) SESSION_COOKIE_PATH = "/" # Session的cookie保存的域名(默认) SESSION_COOKIE_DOMAIN = None # 是否Https传输cookie(默认) SESSION_COOKIE_SECURE = False # 是否Session的cookie只支持http传输(默认) SESSION_COOKIE_HTTPONLY = True # Session的cookie失效日期(2周)(默认) SESSION_COOKIE_AGE = 1209600 # 是否关闭浏览器使得Session过期(默认) SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否每次请求都保存Session,默认修改之后才保存(默认) SESSION_SAVE_EVERY_REQUEST = False
四、Form验证
1、功能:
生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容
2、自定义:
类 字段(校验数据) 插件(生成html)
3、初始化:
fm = FM(initial=dct)
五、缓存
1、5种配置:
开发调试 内存 文件 数据库 Memcache缓存(python-memcached模块) Memcache缓存(pylibmc模块)
2、保存至文件示例
# 此缓存将内容保存至文件 # 配置: CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', 'LOCATION': '/tmp/django_cache', } }
3、3种应用:
(1)全局
MIDDLEWARE = [ 'django.middleware.cache.UpdateCacheMiddleware', # 其他中间件... 'django.middleware.cache.FetchFromCacheMiddleware', ] CACHE_MIDDLEWARE_ALIAS = "" CACHE_MIDDLEWARE_SECONDS = "" CACHE_MIDDLEWARE_KEY_PREFIX = ""
(2)视图函数
from django.views.decorators.cache import cache_page @cache_page(10) def my_view(request): pass 或者: urlpatterns = [ url(r'^foo/([0-9]{1,2})/$', cache_page(10)(my_view)), ]
(3)模板局部
{% load cache %} {% cache 5000 缓存key %} 缓存内容 {% endcache %}
六、中间件(管道)
1、基类:
from django.utils.deprecation import MiddlewareMixin
2、四个方法:
process_request(self,request) process_view(self, request, callback, callback_args, callback_kwargs) process_template_response(self,request,response) process_exception(self, request, exception) process_response(self, request, response)
3、自定义:
class RequestExeute(object): def process_request(self,request): pass def process_view(self, request, callback, callback_args, callback_kwargs): i =1 pass def process_exception(self, request, exception): pass def process_response(self, request, response): return response
4、注册:MIDDLEWARE
七、信号
1、内置信号
(1)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类,对于每一个类,自动触发
(2)Management signals
pre_migrate # 执行migrate命令前,自动触发 post_migrate # 执行migrate命令后,自动触发
(3)Request/response signals
request_started # 请求到来前,自动触发 request_finished # 请求结束后,自动触发 got_request_exception # 请求异常后,自动触发
(4)Test signals
setting_changed # 使用test测试修改配置文件时,自动触发 template_rendered # 使用test测试渲染模板时,自动触发
(5)Database Wrappers
connection_created # 创建数据库连接时,自动触发
2、使用:
from django.db.models.signals import pre_save, post_save def callback(sender, **kwargs): pass pre_save.connect(callback) # xxoo指上述导入的内容
3、自定义信号
(1)定义信号
import django.dispatch pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])
(2)注册信号
def callback(sender, **kwargs): print("callback") print(sender,kwargs) # 信号中注册函数 pizza_done.connect(callback)
(3)触发信号
from 路径 import pizza_done pizza_done.send(sender='seven',toppings=123, size=456)
八、CSRF
(Cross-site request forgery)跨站请求伪造
1、CSRF原理
post的时候进行验证,无csrf时存在的隐患
2、使用token
(1)form提交(csrf)
{% csrf_token %}
(2)ajax提交(csrf)
$.ajaxSetup({ beforeSend: function (xhr, settings) { xhr.setRequestHeader("X-CSRFtoken", $.cookie("csrftoken")) } }); //csrf请求头 X-CSRFtoken,全局生效
(3)全局:
中间件 django.middleware.csrf.CsrfViewMiddleware
(4)局部:
@csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。
@csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。
注:from django.views.decorators.csrf import csrf_exempt,csrf_protect
九、分页(自定义分页)pagination
避免xss攻击
1、模板语言
{{ html|safe }}
2、后台views
from django.utils.safestring import mark_safe tag = mark_safe(tag) # 解析网页标签
参考:
1. Django之Form组件