django框架cookie和session用法实例详解
本文实例讲述了django框架cookie和session用法。分享给大家供大家参考,具体如下:
首先知道http协议
http协议它是无状态的协议,验证的信息不会保留
基于请求响应,短连接
cookie
指一段小信息,内部是一组组的键值对,保存在客户端
访问一个地址时,服务器生成一个cookie,由浏览器保留在本地,再次访问地址时就会携带这个cookie,一般用于用户信息的验证
cookie的设置:
obj.set_cookie(key,value,...)
下面来看一个简单的例子
#设置cookie
deflogin(request):
ifrequest.method=="POST":
user=request.POST.get("user")
pwd=request.POST.get("pwd")
user=UserInfo.objects.filter(user=user,pwd=pwd).first()
ifuser:
obj=HttpResponse("登陆成功")
obj.set_cookie("is_login",True)
returnobj
returnrender(request,"login.html")
#获取cookie并进行判断
defindex(request):
ret=request.COOKIES.get("is_login")
ifnotret:
returnredirect("/login/")
returnrender(request,"index.html")
其他参数
参数:
key,键
value='',值
max_age=None,超时时间
expires=None,超时时间(IErequiresexpires,sosetitifhasn'tbeenalready.)
path='/',Cookie生效的路径,/表示根路径,特殊的:根路径的cookie可以被任何url的页面访问
domain=None,Cookie生效的域名
secure=False,https传输
httponly=True只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)
cookie的删除
obj.delete_cookie("is_login")
下面来看一个登陆和注销页面
defbooks(request):
is_login=request.COOKIES.get("is_login")
ifnotis_login:
return_url=request.path_info#判断是否有cookies没有则记录到return_url
ifreturn_url:
returnredirect("{}?return_url={}".format("/login/",return_url))#将return_url加到路径后面返回到login页面,等到用户验证登陆后直接跳转到这个页面
book_list=Book.objects.all()
returnrender(request,"books.html",locals())
deflogin(request):
error_msg=''
ifrequest.method=="POST":
user=request.POST.get("user")
pwd=request.POST.get("pwd")
user_au=UserInfo.objects.filter(user=user,pwd=pwd).first()#从数据库中验证用户
ifuser_au:
return_url=request.GET.get('return_url')
ifreturn_url:#判断是否有return_url
ret=redirect(return_url)
else:
ret=HttpResponse("进入其他页面")
ret.set_cookie("is_login",True)#验证成功则设置cookies
returnret
error_msg="用户名或者密码错误"
returnrender(request,"login.html",locals())
deflogout(request):
ret=redirect("/login/")
ret.delete_cookie('is_login')
returnret
验证第一种情况
#####################################################################################################################################################################################
验证第二种情况
session
由于cookies保存在客户端上面,存在不安全因素,并且有长度限制---4096
进而引入了session
session的用法
#获取、设置、删除Session中数据
request.session['k1']#获取
request.session.get('k1',None)#获取
request.session['k1']=123#设置
request.session.setdefault('k1',123)#存在则不设置
delrequest.session['k1']
#所有键、值、键值对
request.session.keys()
request.session.values()
request.session.items()
request.session.iterkeys()
request.session.itervalues()
request.session.iteritems()
#会话session的key
request.session.session_key
#将所有Session失效日期小于当前日期的数据删除
request.session.clear_expired()
#检查会话session的key在数据库中是否存在
request.session.exists("session_key")
#删除当前会话的所有Session数据
request.session.delete()#删除reponsesessionid,用户已经访问不了了,但是可以看到requestsessionid
#删除当前的会话数据并删除会话的Cookie。
request.session.flush()#reponse和requestsessionid都看不到
这用于确保前面的会话数据不可以再次被用户的浏览器访问
例如,django.contrib.auth.logout()函数中就会调用它。
#设置会话Session和Cookie的超时时间
request.session.set_expiry(value)
*如果value是个整数,session会在些秒数后失效。
*如果value是个datatime或timedelta,session就会在这个时间后失效。
*如果value是0,用户关闭浏览器session就会失效。
*如果value是None,session会依赖全局session失效策略。
下面来看一个例子
defbooks(request):
#is_login=request.COOKIES.get("is_login")
is_login=request.session.get("is_login")
ifnotis_login:
return_url=request.path_info
ifreturn_url:
returnredirect("{}?return_url={}".format("/login/",return_url))
book_list=Book.objects.all()
returnrender(request,"books.html",locals())
deflogin(request):
error_msg=''
ifrequest.method=="POST":
user=request.POST.get("user")
pwd=request.POST.get("pwd")
user_au=UserInfo.objects.filter(user=user,pwd=pwd).first()
ifuser_au:
return_url=request.GET.get('return_url')
ifreturn_url:
ret=redirect(return_url)
else:
ret=HttpResponse("进入其他页面")
#ret.set_cookie("is_login",True)
request.session['is_login']=True
returnret
error_msg="用户名或者密码错误"
returnrender(request,"login.html",locals())
deflogout(request):
ret=redirect("/login/")
#ret.delete_cookie('is_login')
request.session.delete()#删除ReponsesessionID
#request.session.flush()#删除ReponsesessionID和RequestsessionID
returnret
设置了session之后,数据库会自动生成一个表,表名:django_session
我们来查看session的默认设置
fromdjango.confimportsettings,global_settings 通过global_settings查看到下面信息 ############ #SESSIONS# ############ #Cachetostoresessiondataifusingthecachesessionbackend. SESSION_CACHE_ALIAS='default' #Cookiename.Thiscanbewhateveryouwant. SESSION_COOKIE_NAME='sessionid' #Ageofcookie,inseconds(default:2weeks). SESSION_COOKIE_AGE=60*60*24*7*2 #Astringlike".example.com",orNoneforstandarddomaincookie. SESSION_COOKIE_DOMAIN=None #Whetherthesessioncookieshouldbesecure(https://only). SESSION_COOKIE_SECURE=False #Thepathofthesessioncookie. SESSION_COOKIE_PATH='/' #Whethertousethenon-RFCstandardhttpOnlyflag(IE,FF3+,others) SESSION_COOKIE_HTTPONLY=True #Whethertosavethesessiondataoneveryrequest. SESSION_SAVE_EVERY_REQUEST=False #Whetherauser'ssessioncookieexpireswhentheWebbrowserisclosed. SESSION_EXPIRE_AT_BROWSER_CLOSE=False #Themoduletostoresessiondata SESSION_ENGINE='django.contrib.sessions.backends.db' #Directorytostoresessionfilesifusingthefilesessionmodule.IfNone, #thebackendwilluseasensibledefault. SESSION_FILE_PATH=None #classtoserializesessiondata SESSION_SERIALIZER='django.contrib.sessions.serializers.JSONSerializer'
1.数据库Session
SESSION_ENGINE='django.contrib.sessions.backends.db'#引擎(默认)
2.缓存Session
SESSION_ENGINE='django.contrib.sessions.backends.cache'#引擎 SESSION_CACHE_ALIAS='default'#使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
3.文件Session
SESSION_ENGINE='django.contrib.sessions.backends.file'#引擎 SESSION_FILE_PATH=None#缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()
4.缓存+数据库
SESSION_ENGINE='django.contrib.sessions.backends.cached_db'#引擎
5.加密CookieSession
SESSION_ENGINE='django.contrib.sessions.backends.signed_cookies'#引擎
其他公用设置项:
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,默认修改之后才保存(默认)
希望本文所述对大家基于Django框架的Python程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。