Cookies :是浏览器为 Web 服务器存储的一小段信息。 每次浏览器从某个服务器请求页面时,它收到服务器回发送过来的cookies。它保存在浏览器下的某个文件夹下。
Session:Django的Session机制会向请求的浏览器发送cookie字符串。同时也会保存到本地一份,用来验证浏览器登录是否为同一用户。它存在于服务器,Django默认会把session存入到数据库中。
Session依赖于Cookie,如果浏览器不能保存cookies那么session就失效了。因为它需要浏览器的cookie值(sessionid)去session里做对比。session就是用来在服务器端保存用户的会话状态。
Cookie
1、获取Cookie:
1
2
3
4
|
request.COOKIES[key] request.COOKIES.get(key) # 普通cookie是明文传输的,可以直接在客户端直接打开,所以需要加盐,解盐之后才能查看 request.get_signed_cookie(key, default = RAISE_ERROR, salt = '', max_age = None ) |
参数:
- default: 默认值
- salt: 加密盐
- max_age: 后台控制过期时间
2、设置Cookie:
1
2
3
4
|
rep = HttpResponse(...) 或 rep = render(request, ...) rep.set_cookie(key,value,...) # 给cookie签名 rep.set_signed_cookie(key,value,salt = '加密盐' ,...) |
参数:
- key, 键
- value='', 值
- max_age=None, 超时时间
- expires=None, 超时时间(IE requires expires, so set it if hasn't been already.)
- path='/', Cookie生效的路径,/ 表示根路径,特殊的:跟路径的cookie可以被任何url的页面访问
- domain=None, Cookie生效的域名
- secure=False, https传输
- httponly=False True只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖),防止xss攻击
由于cookie保存在客户端的电脑上,所以,JavaScript和jquery也可以操作cookie。
1
2
|
<script src= '/static/js/jquery.cookie.js' ></script> $.cookie( "list_pager_num" , 30,{ path: '/' }); |
Session
Django中默认支持Session,其内部提供了5种类型的Session供开发者使用:
数据库(默认)
缓存
文件
缓存+数据库
加密cookie
1、数据库Session
Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。
a. 配置 settings.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
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. 使用
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
|
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" ) |
2、缓存Session
a. 配置 settings.py
1
2
3
4
5
6
7
8
9
10
11
12
|
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
a. 配置 settings.py
1
2
3
4
5
6
7
8
9
10
11
12
|
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
数据库用于做持久化,缓存用于提高效率
a. 配置 settings.py
1
|
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎 |
b. 使用
同上
5、加密cookie Session
a. 配置 settings.py
1
|
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎 |
b. 使用
同上
示例:
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
|
from django.shortcuts import render,redirect # Create your views here. import datetime def login(request): print ( "COOKIES" ,request.COOKIES) #打印cookies 一个字典,里面多个键值对 print ( "SESSION" ,request.session) #session为服务器对应客户信息的键 if request.method = = "POST" : name = request.POST.get( "user" ) pwd = request.POST.get( "pwd" ) if name = = "yuan" and pwd = = "123" : # ret=redirect("/index/") # 给对象ret设置cookie 安全性较差 ,设定有效时间max_age,expires, # ret.set_cookie("username",{"11":"22"},max_age=10,expires=datetime.datetime.utcnow()+datetime.timedelta(days=3)) # return ret # COOKIE SESSION一起使用 # session 以字典存放在服务器端,发给客户端的是数据对应的键, request.session[ "is_login" ] = True # 在session中增加键值对 request.session[ "user" ] = name return redirect( "/index/" ) return render(request, "login.html" ) def index(request): if request.COOKIES.get( "username" , None ): # 取不到设置默认值为None name = request.COOKIES.get( "username" , None ) return render(request, "index.html" , locals ()) # session验证 存在数据库中,所以要先makemigrations生成数据库 if request.session.get( "is_login" , None ): name = request.session.get( "user" , None ) return render(request, "index.html" , locals ()) else : return redirect( "/login/" ) ##session获取 request.session.get( "user" , None ) # 设置 request.session[ "user" ] = name # 删除 del request.session.get( "user" ) |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://segmentfault.com/a/1190000016041458