session缓存
基于Cookie做用户验证时,敏感信息不适合放在cookie中,session原理:cookie是保存在用户游览器端的键值对,Session是保存在服务器端的键值对;
django中默认支持Session,其内部提供5种类型Session供开发者使用(redis需自行安装插件):
- 数据库(默认)
- 缓存
- 文件
- 缓存+数据库
- 加密cookie
1、数据库Session
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。 a. 配置 settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认) SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认) SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径(默认) SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默认) SESSION_COOKIE_SECURE = False # 是否Https传输cookie(默认) SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输(默认) SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默认) SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认) SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认) b. 使用 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' ] # 所有 键、值、键值对 request.session.keys() request.session.values() request.session.items() request.session.iterkeys() request.session.itervalues() request.session.iteritems() # 用户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失效策略。 |
2、缓存Session
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
a. 配置 settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎 SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置 SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串 SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径 SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名 SESSION_COOKIE_SECURE = False # 是否Https传输cookie SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输 SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周) SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期 SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存 b. 使用 同上 |
3、文件Session
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
a. 配置 settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎 SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串 SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径 SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名 SESSION_COOKIE_SECURE = False # 是否Https传输cookie SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输 SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周) SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期 SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存 b. 使用 同上 |
4、缓存+数据库Session
1
2
3
4
5
6
7
8
9
|
数据库用于做持久化,缓存用于提高效率 a. 配置 settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎 b. 使用 同上 |
5、加密cookie Session
1
2
3
4
5
6
7
|
a. 配置 settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎 b. 使用 同上 |
扩展:Session用户验证
1
2
3
4
5
6
7
|
def login(func): def wrap(request, * args, * * kwargs): # 如果未登陆,跳转到指定页面 if request.path = = '/test/' : return redirect( 'http://www.baidu.com' ) return func(request, * args, * * kwargs) return wrap |
CSRF(跨站请求伪造)
一、简介
django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成。而对于django中设置防跨站请求伪造功能有分为全局和局部。
全局:
中间件 django.middleware.csrf.CsrfViewMiddleware
局部:
- @csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。
- @csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。
注:from django.views.decorators.csrf import csrf_exempt,csrf_protect
1、from提交
<form action="/login/" method="POST"> {% csrf_token %} <input type="text" name="user" /> <input type="password" name="pwd"/> <input type="submit" value="提交"/> </form>
2、ajax提交(多)
<body> <form action="/login/" method="POST"> {% csrf_token %} <input type="text" name="user" /> <input type="password" name="pwd"/> <input type="submit" value="提交"/> <input id="btn1" type="button" value="ajax提交"> <input id="btn2" type="button" value="ajax提交"> </form> <script src="/static/jquery-1.12.4.js"></script> <script src="/static/jquery.cookie.js"></script> <script> $(function(){ $.ajaxSetup({ beforeSend:function(xhr,setting){ xhr.setRequestHeader('X-CSRFtoken', $.cookie('csrftoken')); } }) }); $('#btn1').click(function() { $.ajax({ url: '/login/', type: 'POST', data: {'user': 'root', 'pwd': '123'}, //headers: {'X-CSRFtoken': $.cookie('csrftoken')}, success: function(arg){ } }) }) $('#btn2').click(function() { $.ajax({ url: '/login/', type: 'POST', data: {'user': 'root', 'pwd': '123'}, //headers: {'X-CSRFtoken': $.cookie('csrftoken')}, success: function(arg){ } }) }) </script> </body>
3、ajax提交
<body> <form action="/login/" method="POST"> {% csrf_token %} <input type="text" name="user" /> <input type="password" name="pwd"/> <input type="submit" value="提交"/> <input id="btn" type="button" value="ajax提交"> </form> <script src="/static/jquery-1.12.4.js"></script> <script src="/static/jquery.cookie.js"></script> <script> $('#btn').click(function() { $.ajax({ url: '/login/', type: 'POST', data: {'user': 'root', 'pwd': '123'}, headers: {'X-CSRFtoken': $.cookie('csrftoken')}, success: function(arg){ } }) }) </script> </body>
4、请求(GET/HEAD/OPTIONS/TRACE)
<!DOCTYPE html> <html> <head lang = "en" > <meta charset = "UTF-8" > <title>< / title> < / head> <body> { % csrf_token % } < input type = "button" onclick = "Do();" value = "Do it" / > <script src = "/static/plugin/jquery/jquery-1.8.0.js" >< / script> <script src = "/static/plugin/jquery/jquery.cookie.js" >< / script> <script type = "text/javascript" > var csrftoken = $.cookie( 'csrftoken' ); 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) { xhr.setRequestHeader( "X-CSRFToken" , csrftoken); } } }); function Do(){ $.ajax({ url: "/app01/test/" , data:{ id : 1 }, type : 'POST' , success:function(data){ console.log(data); } }); } < / script> < / body> < / html> |
更多:https://docs.djangoproject.com/en/dev/ref/csrf/#ajax