Cookie和Session

Cookie和Session,第1张

概述老师的博客:https://www.cnblogs.com/liwenzhou/p/8343243.html  Cookie 什么是cookie 它是服务器发送出来存储在浏览器上的一组组键值对,下次访问服务器时浏览器会自动携带这些键值对,以便服务器提取有用信息。 查看Cookie 输出上面的cookie print(request.COOKIRES){‘csrftoken‘: ‘Jm5yoqv

老师的博客:https://www.cnblogs.com/liwenzhou/p/8343243.html

 cookie 什么是cookie

它是服务器发送出来存储在浏览器上的一组组键值对,下次访问服务器时浏览器会自动携带这些键值对,以便服务器提取有用信息。

查看cookie

输出上面的cookie

print(request.COOKIRES){csrftoken: Jm5yoqvBHgCN5ejKIUB2auRqamtBtQHCnmWzNXALTHIa49LJDJTIP7uO4cPTHGOx}得到的是个字典

 request cookies是得到的键值对

response cookies是在函数中放生了调用,删除,改变的等 *** 作的键值对

Django中 *** 作cookie 获取cookie
request.cookieS[key]request.get_signed_cookie(key,default=RAISE_ERROR,salt=‘‘,max_age=None)

参数:

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 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖) 设置cookie

已登陆页面为例

def login(request):    if request.method=="POST":        user=request.POST.get(user)        psd=request.POST.get("password")        print(request.POST)        print(request.cookieS)        if user=="lhy" and psd=="mmd":
        #验证成功 rep
=redirect("/main/")#跳转到一个相应对象 rep.set_cookie("xpg","mmd",max_age=None)#给对象设置个cookie
       
return rep return render(request,"login.HTML")

 取得方法:

ret = request.cookieS.get("xpg",None)

 

然后你就可以查看里面的cookie有你添加的键值对了

 当然还有种添加cookie的方法:(加盐的)

rep.set_signed_cookie("alex","teacher",salt="大苹果",max_age=None)
max_age表示cookie保存的时间,默认是关闭浏览器就删除键值对

 取值得方法:

ret = request.get_signed_cookie("xpg",salt=大苹果,max_age=None)

 

这种方法多了个加盐的过程,我看了下代码,还是return到上面的那种方法

当然一个可以对于一个相应对象,可以添加多个键值对。

注意:

如果向一个网站多次添加键值对是,这是键值对的键不一样就会一直存在(如果没有时间限制),如果键一样则覆盖 键值对有时间的限制,如果没有时间限制的话,就会一直保存在这个页面,默认值是表示在关闭浏览器是删除 加盐时或者不加盐是取得键值对的值得方法有点不一样 resquest cookies是访问此网站是所传过来的 本页面的cookies都会传给你你下个访问的页面 删除cookie:
rep=render(request,"buy.HTML")rep.delete_cookie(xpg)return rep
 登录检验的装饰器
from functools import wraps

def check_login(function):
@wraps(function)
def inner(request):
ret = request.cookieS.get("xpg",None)
if ret == "mmd":
return function(request) #校验成功的函数
else:
return redirect("/login/")

return inner
 session session的优点

session是存在服务端的,所以比较安全,而且可以储存的数据比较大。

session的相关的 *** 作
# 获取、设置、删除Session中数据request.session[k1]request.session.get(k1,None)request.session[k1] = 123request.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的keyrequest.session.session_key# 将所有Session失效日期小于当前日期的数据删除request.session.clear_expired()# 检查会话session的key在数据库中是否存在request.session.exists("session_key")# 删除当前会话的所有Session数据,# 删除当前会话的所有Session数据,但是数据库里面没有,如果设置同样的键值对,其sessiondID会发生改变request.session.delete()  # 删除当前的会话数据并删除会话的cookie。request.session.flush()     这用于确保前面的会话数据不可以再次被用户的浏览器访问    例如,django.contrib.auth.logout() 函数中就会调用它。# 设置会话Session和cookie的超时时间request.session.set_expiry(value)    * 如果value是个整数,session会在些秒数后失效。    * 如果value是个datatime或timedelta,session就会在这个时间后失效。    * 如果value是0,用户关闭浏览器session就会失效。    * 如果value是None,session会依赖全局session失效策略。
Session流程解析

Session版登陆验证

from functools import wrapsdef check_login(func):    @wraps(func)    def inner(request,*args,**kwargs):        next_url = request.get_full_path()        if request.session.get("user"):            return func(request,*args,**kwargs)        else:            return redirect("/login/?next={}".format(next_url))    return innerdef login(request):    if request.method == "POST":        user = request.POST.get("user")        pwd = request.POST.get("pwd")        if user == "alex" and pwd == "alex1234":            # 设置session            request.session["user"] = user            # 获取跳到登陆页面之前的URL            next_url = request.GET.get("next")            # 如果有,就跳转回登陆之前的URL            if next_url:                return redirect(next_url)            # 否则默认跳转到index页面            else:                return redirect("/index/")    return render(request,"login.HTML")@check_logindef logout(request):    # 删除所有当前请求相关的session    request.session.delete()    return redirect("/login/")@check_logindef index(request):    current_user = request.session.get("user",None)    return render(request,"index.HTML",{"user": current_user})
session登录验证 Django中的Session配置

Django中默认支持Session,其内部提供了5种类型的Session供开发者使用。

1. 数据库SessionSESSION_ENGINE = django.contrib.sessions.backends.db   # 引擎(默认)2. 缓存SessionSESSION_ENGINE = django.contrib.sessions.backends.cache  # 引擎SESSION_CACHE_AliAS = default                            # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置3. 文件SessionSESSION_ENGINE = django.contrib.sessions.backends.file    # 引擎SESSION_file_PATH = None                                    # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() 4. 缓存+数据库SESSION_ENGINE = django.contrib.sessions.backends.cached_db        # 引擎5. 加密cookie SessionSESSION_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,默认修改之后才保存(默认)

注意

在session默认是存在数据库里面的 session在数据库里面的数据,如果超时的话一般需要request.session.clear_expired()来进行清除 session比较的安全,在数据库里面可以查看的到,一般在Django.session里面可以看见的 session是基于cookie的 CBV中加装饰器相关

CBV实现的登录视图

from django.vIEws import VIEw
class
LoginVIEw(VIEw): def get(self,request): """ 处理GET请求 """ return render(request,login.HTML) def post(self,request): """ 处理POST请求 """ user = request.POST.get(user) pwd = request.POST.get(pwd) if user == alex and pwd == "alex1234": next_url = request.GET.get("next") # 生成随机字符串 # 写浏览器cookie -> session_ID: 随机字符串 # 写到服务端session: # { # "随机字符串": {user:alex} # } request.session[user] = user if next_url: return redirect(next_url) else: return redirect(/index/) return render(request,login.HTML)

要在CBV视图中使用我们上面的check_login装饰器,有以下三种方式:

from django.utils.decorators import method_decorator

1. 加在CBV视图的get或post方法上

from django.utils.decorators import method_decoratorclass HomeVIEw(VIEw):    def dispatch(self,request,**kwargs):        return super(HomeVIEw,self).dispatch(request,**kwargs)    def get(self,request):        return render(request,"home.HTML")        @method_decorator(check_login)    def post(self,request):        print("Home VIEw POST method...")        return redirect("/index/")

 

 check_login是检测登录的函数的名字

2. 加在dispatch方法上

from django.utils.decorators import method_decoratorclass HomeVIEw(VIEw):    @method_decorator(check_login)    def dispatch(self,"home.HTML")    def post(self,request):        print("Home VIEw POST method...")        return redirect("/index/")

因为CBV中首先执行的就是dispatch方法,所以这么写相当于给get和post方法都加上了登录校验。

3. 直接加在视图类上,但method_decorator必须传 name 关键字参数

如果get方法和post方法都需要登录校验的话就写两个装饰器。

from django.utils.decorators import method_decorator@method_decorator(check_login,name="get")@method_decorator(check_login,name="post")class HomeVIEw(VIEw):    def dispatch(self,request):        print("Home VIEw POST method...")        return redirect("/index/")
补充

CSRF Token相关装饰器在CBV只能加到dispatch方法上,或者加在视图类上然后name参数指定为dispatch方法。

备注:

csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。 csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。
from django.vIEws.decorators.csrf import csrf_exempt,csrf_protectfrom django.utils.decorators import method_decoratorclass HomeVIEw(VIEw):    @method_decorator(csrf_exempt)    def dispatch(self,request):        print("Home VIEw POST method...")        return redirect("/index/")

 

或者

from django.vIEws.decorators.csrf import csrf_exempt,csrf_protectfrom django.utils.decorators import method_decorator@method_decorator(csrf_exempt,name=dispatch)class HomeVIEw(VIEw):       def dispatch(self,request):        print("Home VIEw POST method...")        return redirect("/index/")
分页

见老师的博客

需要自己一步一步的弄懂,写好的在自己的桌面上。

 

 

 

 

 

.

总结

以上是内存溢出为你收集整理的Cookie和Session全部内容,希望文章能够帮你解决Cookie和Session所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1081710.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存