在Django中操作cookie和session
1.操作cookie
1.1 设置cookie
设置cookie是设置值给浏览器的。因此我们需要通过response的对象来设置,设置cookie可以通过response.set_cookie
来设置,这个方法的相关线束如下:
- key:这个cookie的key
- value: 这个cookie的value
- max_age: 最长的生命周期。单位是秒
- expires: 过期时间
- path: 对域名下哪个路径有效。默认是针对主域名下都有效
- domain:针对哪个域名有效。默认是针对主域名下都有效,如果只要针对某个子域名才有效,那么可以设置这个属性.
- secure:是否是安全的,如果设置为True,那么只能在https协议下才可用
- httponly:默认是False。如果为True,那么在客户端不能通过JavaScript进行操作
def index(request):
response = HttpResponse("index")
expires = datetime(year=2019, month=5, day=29, hour=22, minute=30, second=0)
expires = make_aware(expires)
response.set_cookie("username", "sss", max_age=180)
return response
1.2删除cookie
通过delete_cookie即可删除cookie。实际上删除cookie就是将指定的cookie的值设置为空的字符串,然后使用将他的过期时间设置为0,也就是浏览器关闭后就过期。
def delete_cookie(request):
"""删除cookie"""
response = HttpResponse('delete')
response.delete_cookie('username')
return response
1.3获取cookie
获取浏览器发送过来的cookie信息。可以通过request.COOKIES来或者。这个对象是一个字典类型。比如获取所有的cookie,那么示例代码如下:
def my_list(request):
"""视图获取cookie信息"""
cookie = request.COOKIES
username = cookie.get('username')
return HttpResponse(username)
2.操作session
django中的session默认情况下是存储在服务器的数据库中的,在表中会根据sessionid来提取指定的session数据,然后再把这个sessionid放到cookie中发送给浏览器存储,浏览器下次在向服务器发送请求的时候会自动的把所有cookie信息都发送给服务器,服务器再从cookie中获取sessionid,然后再从数据库中获取session数据。但是我们在操作session的时候,这些细节压根就不用管。我们只需要通过request.session即可操作。示例代码如下:
def index(request):
request.session.get('username')
return HttpResponse('index')
2.1设置session
request.session[key] = value
request.session.setdefault(key,value)
2.2获取session
request.session[key]
request.session.get[key]
2.3删除session
del request.session[key] # 删除某一个键值对
request.session.delete() # 删除该用户的所有session数据,不删除cookie
request.session.flush() # 删除该用户的所有session数据,删除cookie
session常用的方法如下:
-
get:用来从session中获取指定值。
-
pop:从session中删除一个值。
-
keys:从session中获取所有的键。
-
items:从session中获取所有的值。
-
clear:清除当前这个用户的session数据。
-
flush:删除session并且删除在浏览器中存储的session_id,一般在注销的时候用得比较多。
-
set_expiry(value):设置过期时间。
- 整形:代表秒数,表示多少秒后过期。
- 0:代表只要浏览器关闭,session就会过期。
- None:会使用全局的session配置。在settings.py中可以设置SESSION_COOKIE_AGE来配置全局的过期时间。默认是1209600秒,也就是2周的时间。
-
clear_expired:清除过期的session。Django并不会清除过期的session,需要定期手动的清理,或者是在终端,使用命令行python manage.py clearsessions来清除过期的session。
修改session的存储机制
默认情况下,session数据是储存在数据中的。当然也可以将session数据储存到其他地方。可以设置SESSION_ENGINE来更改session的储存位置,这个可以配置为以下几种方案:
- django.contrib.sessions.backends.db:使用数据库。默认就是这种方案。
- django.contrib.sessions.backends.file:使用文件来存储session。
- django.contrib.sessions.backends.cache:使用缓存来存储session。想要将数据存储到缓存中,前提是你必须要在settings.py中配置好CACHES,并且是需要使用Memcached,而不能使用纯内存作为缓存。
- django.contrib.sessions.backends.cached_db:在存储数据的时候,会将数据先存到缓存中,再存到数据库中。这样就可以保证万一缓存系统出现问题,session数据也不会丢失。在获取数据的时候,会先从缓存中获取,如果缓存中没有,那么就会从数据库中获取。
- django.contrib.sessions.backends.signed_cookies:将session信息加密后存储到浏览器的cookie中。这种方式要注意安全,建议设置SESSION_COOKIE_HTTPONLY=True,那么在浏览器中不能通过js来操作session数据,并且还需要对settings.py中的SECRET_KEY进行保密,因为一旦别人知道这个SECRET_KEY,那么就可以进行解密。另外还有就是在cookie中,存储的数据不能超过4k
import datetime
from django.shortcuts import render, HttpResponse, redirect
def index(request):
print(request.COOKIES) # 打印cookie
is_login = request.COOKIES.get("is_login") # 从cookie中获取登陆状态
if not is_login: # 判断登陆状态为False
return redirect("/login/login/") # 302重定向到登陆页面
username = request.COOKIES.get("username") # 获取cookie中的用户名
login_time = request.COOKIES.get("login_time") # 获取cookie中的登陆时间
return render(request, 'index.html', {"username": username, "login_time": login_time})
def login(request):
if request.method == "POST":
user = request.POST.get("user")
pwd = request.POST.get("pwd")
if user == "xiao" and pwd == "123":
obj = redirect("/login/index/") # 302重定向到登陆页面
obj.set_cookie("is_login", True) # cookie设置登陆状态
obj.set_cookie("username", user) # cookie设置用户名
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
obj.set_cookie("login_time", now) # cookie设置登陆时间
return obj
return render(request, "login.html")
def login_session(request):
if request.method == "POST":
user = request.POST.get("user")
pwd = request.POST.get("pwd")
if user == "xiao" and pwd == "123":
# 写session
request.session['is_login'] = True # session设置登陆状态
request.session['username'] = user # session设置用户名
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%m:%S")
request.session['login_time'] = now # session设置登陆时间
return redirect("/login/index_session/") # 302重定向到首页
return render(request, "login.html")
def index_session(request):
is_login = request.session.get("is_login") # 从session中获取登陆状态
if not is_login: # 判断状态不是True时
return redirect("/login/login_session/") # 302重定向到登陆页面
username = request.session.get("username") # 从session中获取用户名
login_time = request.session.get("login_time") # 从session中获取登陆时间
return render(request, "index.html", {"username": username, "login_time": login_time})
def logout(request):
request.session.flush() # 清理session
return redirect("/login/login_session/") # 302跳转登录页面