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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。