Django session
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django session相关的知识,希望对你有一定的参考价值。
一、Django中默认支持Session,其内部提供了5种类型的Session供开发者使用:
- 数据库(默认)
- 缓存
- 文件
- 缓存+数据库
- 加密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 #为True时,不再点击页面后,相应时间后session失效,为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
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 = True # 是否每次请求都保存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应用示例:用户登录验证与用户注销
urls.py
from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r‘^admin/‘, admin.site.urls), url(r‘^login/$‘, views.login), url(r‘^index/$‘, views.index), url(r‘^logout/$‘, views.logout), ]
views.py
from django.shortcuts import render,redirect,HttpResponse
def login(request):
if request.method == "GET":
return render(request,‘login.html‘)
elif request.method == "POST":
user = request.POST.get(‘user‘)
pwd = request.POST.get(‘pwd‘)
if user == ‘root‘ and pwd == "123":如果验证成功,则
# session中设置值,其中session是一个字典
request.session[‘username‘] = user
request.session[‘is_login‘] = True#设置是否登录标记
if request.POST.get(‘rmb‘,None) == ‘1‘:#判断界面是否选择10秒免登陆,如果是10秒免登陆,则设置超时时间为10秒
#即10秒后需重新登录
request.session.set_expiry(10)# 超时时间为10秒
return redirect(‘/index/‘)
else:
return render(request,‘login.html‘)
def index(request):
#获取session中的值
if request.session.get(‘is_login‘,None):#如果能获取到已经登录标记,则跳转到数据显示界面
return render(request,‘index.html‘,{‘username‘: request.session[‘username‘]})
else:#否则跳转到错误界面
return HttpResponse(‘gun‘)
def logout(request):#注销,清除session即可
# del request.session[‘username‘] 清除某一个用户的session
request.session.clear() #清空所有的session
return redirect(‘/login/‘)
login.html
<body> <form action="/login/" method="POST"> {% csrf_token %} <input type="text" name="user" /> <input type="text" name="pwd" /> <input type="checkbox" name="rmb" value="1" /> 10秒免登录 <input type="submit" value="提交" /> </form> </body>
三、在不注释settings.py中的csrf时,要用ajax提交的话,必须在提交前用 $.ajaxSetup
login.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <form action="/login/" method="POST"> {% csrf_token %} <input type="text" name="user" /> <input type="text" name="pwd" /> <input type="checkbox" name="rmb" value="1" /> 10秒免登录 <input type="submit" value="提交" /> <input id="btn1" type="button" value="按钮1" /> <input id="btn2" type="button" value="按钮2" /> </form> <script src="/static/jquery-1.12.4.js"></script> <script src="/static/jquery.cookie.js"></script> <script> $(function(){ //在不注释settings.py中的csrf时,要用ajax提交,必须在提交前用下边的$.ajaxSetup,这样无论下边有多少ajax操作, //只写这一个$.ajaxSetup即可 $.ajaxSetup({ beforeSend: function(xhr,settings){ //括号里的都是固定格式 xhr.setRequestHeader(‘X-CSRFtoken‘, $.cookie(‘csrftoken‘)); //固定格式,设置csrftoken } }); $(‘#btn1‘).click(function () { $.ajax({ url: ‘/login/‘, type:"GET", data: {‘user‘: ‘root‘, ‘pwd‘: ‘123‘}, // headers: {‘X-CSRFtoken‘: $.cookie(‘csrftoken‘)}, success:function(arg){ } }) }); }) </script> </body> </html>
views.py 同二
urls.py 同二
以上是关于Django session的主要内容,如果未能解决你的问题,请参考以下文章
django使用session报错:no such table: django_session
django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE的解决办法(转)(代码片段
django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE的解决办法(转)(代码片段