63 Django -- cookie和session

63 Django -- cookie和session,第1张

概述目录 1. 装饰器 2. Django生命周期 3. cookie Django获取cookie Django设置cookie 通过js设置cookie Django删除cookie 应用场景 4. session Django设置session值:可以设置多个 Django取session值 Django删除session值 其他 *** 作 django的session存储位置,配置文件 扩展 应用场

目录

1. 装饰器 2. Django生命周期 3. cookie Django获取cookie Django设置cookie 通过js设置cookie Django删除cookie 应用场景 4. session Django设置session值:可以设置多个 Django取session值 Django删除session值 其他 *** 作 django的session存储位置,配置文件 扩展 应用场景 5. cookie和session的区别 1. 装饰器

装饰器中加入funtools.wraps装饰,能够保留函数的元数据(函数名、注释)

import functoolsdef wrapper(f):    @functools.wraps(f)    def inner(*args,**kwargs):        """        这是inner函数        """        return f(*args,**kwargs)    return innerdef index(a1,a2):    """    这是index函数    """    return a1+a2print(index.__name__)   # indexprint(index.__doc__)    # 这是index函数
2. Django生命周期

请求进入Django前,有一个Wsgi,能够接收请求,并将请求信息封装。

Wsgi(Web Server Gateway Interface)就是一种规范,称为web服务网关接口,它定义了使用Python编写的web应用程序与web服务器程序之间的接口格式,实现web应用程序与web服务器程序间的解耦。

常用服务器:wsgiref/uwsgi,本质是一个socket服务端。

过程:

? 客户端发来一个请求,Wsgi进行接收,并且将那个请求信息封装,然后经过路由系统进行路由匹配,到达视图vIEws,进行业务逻辑处理,进行相应的orm *** 作以及模板的渲染。最后通过Wsgi发送到客户端。

3. cookie

? 背景:前面学的django,虽然写了很多页面,但是用户不用登陆都是可以看所有网页的,只要他知道网址就行,但是为了自己的安全机制,需要要做验证,访问哪一个网址,都要验证用户的身份,但是还有保证什么呢,用户登陆过之后,还要保证登陆了的用户不需要再重复登陆,就能够访问我网站的其他的网址的页面。但是http无状态啊,怎么保证这个事情呢?此时就要借助cookie了。

? 定义:cookie是浏览器的技术,cookie具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组键值对,下次访问服务器时浏览器会自动携带这些键值对,以便服务器提取有用信息。

? cookie的工作原理:浏览器访问服务端,带着一个空的cookie,然后由服务器产生内容,浏览器收到响应后保存在本地;当浏览器再次访问时,浏览器会自动带上cookie,这样服务器就能通过cookie的内容来判断这个是“谁”了。

? cookie的覆盖 :如果服务器端发送重复的cookie那么会覆盖原有的cookie,例如客户端的第一个请求服务器端发送的cookie是:Set-cookie: a=A;第二请求服务器端发送的是:Set-cookie: a=AA,那么客户端只留下一个cookie,即:a=AA。

Django获取cookie

Ctrl + Shift + del三个键来清除页面缓存和cookie。

request.cookieS['key']request.cookieS.get('key')      # 常用
Django设置cookie
def index(request):    #data = httpResponse('字符串')    #data = redirect('路径')    data = render(request,'index.HTML')    data.set_cookie('key',values)    return data

参数:

key     # 键value=''    # 值max_age=None    # 超时时间(失效时间),max_age=20意思是这个cookie20秒后就消失;参数是None ,会延续到浏览器关闭为止。expires=None    # 超时时间,值是一个datetime类型的时间日期对象,到这个日期就失效的意思path='/'    # cookie生效的路径,/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问;''只能被当前页面访问;'/index/'能被index以及其子路径访问。domain=None     #cookie生效的域名secure=False    # 如果设置为 True ,浏览器将通过httpS来回传cookie。httponly=False  #只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)
通过Js设置cookie
document.cookie='key=yan;path=/'    # Js设置$.cookie('key','yan',{path:'/'})   # jquery设置注意:path不同会导致设置不同.
Django删除cookie
def logout(request):    rep = redirect("/login/")    rep.delete_cookie("user")  # 删除用户浏览器上之前设置的usercookie值    return rep

示例:cookie版登陆校验示例:

vIEws.py文件:

from django.shortcuts import render,httpResponse,redirect# Create your vIEws here.from app01 import modelsdef login(request):    """    用户登录    :param request:    :return:    """    if request.method == 'GET':        return render(request,'login.HTML')    # 获取登录的用户名和密码    user = request.POST.get('user')    pwd = request.POST.get('pwd')        # 判断用户名与密码是否存在    user_obj = models.UserInfo.objects.filter(username=user,password=pwd).first()        # 用户登录成功    if user_obj:                data = redirect('/index/')        data.set_cookie('xx',user)        return data    # 失败    return render(request,'login.HTML',{'error': '用户名或密码错误'})def index(request):    """    登录成功后跳转的页面    :param request:    :return:    """    user = request.cookieS.get('xx')    if not user:        return render(request,'login.HTML')    return render(request,'index.HTML',{'user': user}
应用场景

? 用户认证、投票、每页默认显示数据

4. session

? 背景:cookie虽然在一定程度上解决了“保持状态”的需求,但是由于cookie本身最大支持4096字节,以及cookie本身保存在客户端,可能被拦截或窃取,因此就需要有一种新的东西,它能支持更多的字节,并且他保存在服务器,有较高的安全性。这就是Session。

? 原理过程:session是一种存储数据的方式,依赖于cookie。实现本质: 用户向服务端发送请求,服务端做两件事:一生成随机字符串;二为此用户开辟一个独立的空间来存放当前用户独有的值。视图函数中的业务 *** 作处理完毕后,给用户响应,在响应时会将随机字符串存储到用户浏览器的cookie中。

强调:session中的数据是根据用户相互隔离.

Django设置session值:可以设置多个
request.session['k1'] = 123        request.session['k2'] = 456
Django取session值
request.session['k1']        request.session.get('k2')       # 常用
Django删除session值
#删除值del request.session['k1']  #django-session表里面同步删除request.session.flush() # 清除session、cookie,多用于退出登录
其他 *** 作
# 所有 键、值、键值对request.session.keys()request.session.values()request.session.items()# 设置会话Session和cookie的超时时间,可用于短信验证request.session.set_expiry(value)    * 如果value是个整数,session会在些秒数后失效。    * 如果value是个datatime或timedelta,session就会在这个时间后失效。    * 如果value是0,用户关闭浏览器session就会失效。    * 如果value是None,session会依赖全局session失效策略。# 会话session的keysession_key = request.session.session_key  获取sessionID的值(随机字符串)
django的session存储位置,配置文件

默认存放在数据库中

小系统:默认放在数据库即可。

大系统:缓存(redis)

文件:
SESSION_ENGINE = 'django.contrib.sessions.backends.file'  # 引擎SESSION_file_PATH = '/文件夹/'
缓存(内存)
SESSION_ENGINE = 'django.contrib.sessions.backends.cache' SESSION_CACHE_AliAS = 'default'CACHES = {'default': {'BACKEND': 'django.core.cache.backends.locmem.Locmem Cache',? ? ?  'LOCATION': 'unique-sNowflake',}}
缓存(redis)
SESSION_ENGINE = 'django.contrib.sessions.backends.cache' SESSION_CACHE_AliAS = 'default' CACHES = { "default": {"BACKEND": "django_redis.cache.RedisCache",? ? ?      "LOCATION": "redis://127.0.0.1:6379","OPTIONS": {"CLIENT_CLASS": "django_redis.clIEnt.DefaultClIEnt","CONNECTION_POol_kwargs": {"max_connections": 100}    # "PASSWORD": "密码",}}}
扩展 django和session相关的配置
SESSION_cookie_name = "sessionID"  # Session的cookie保存在浏览器上时的key,即: sessionID=随机字符串SESSION_cookie_DOMAIN = None  # API.baIDu.com /www.baIDu.com/ xxx.baIDu.com  域名SESSION_cookie_PATH = "/"  # Session的cookie 保存的路径SESSION_cookie_httpONLY = True  # 是否 Session的cookie只支持http传输,Js不能修改SESSION_cookie_AGE = 1209600  # Session的 cookie失效日期(默认2周)SESSION_EXPIRE_AT_broWSER_CLOSE = False  # 是否关闭浏览器使得Session过期SESSION_SAVE_EVERY_REQUEST = False  # 是否每 次请求都保存Session,默认修改之后才保存
django中的session设置过期时间
SESSION_cookie_AGE = 1209600  # Session的 cookie失效日期(2周)

示例:使用装饰器,减少代码重复。

vIEws.py文件

def login(request):    """    用户登录    :param request:    :return:    """    if request.method == 'GET':        return render(request,'login.HTML')    # 获取登录的用户名和密码    user = request.POST.get('user')    pwd = request.POST.get('pwd')    # 判断用户名于密码是否存在    user_obj = models.UserInfo.objects.filter(username=user,password=pwd).first()    # 用户登录成功    if user_obj:        request.session['user_name'] = user_obj.username        request.session['user_ID'] = user_object.pk        return redirect('/index/')    return render(request,{'error': '用户名或密码错误'})def auth(func):    def inner(request,*args,**kwargs):        name = request.session.get('user_name')        if not name:            return redirect('/login/')        return func(request,**kwargs)    return inner@authdef index(request):    """    登录成功后跳转的页面    :param request:    :return:    """    return render(request,'index.HTML')
应用场景

? 用户认证、短信验证过期、权限管理

5. cookie和session的区别
cookie是存储在客户端浏览器上的键值对,发送请求时浏览器会自动携带. session是一种存储数据方式,基于cookie实现,将数据存储在服务端(django默认存储到数据库).其本质是: 用户向服务端发送请求,服务端做两件事:生成随机字符 串;为此用户开辟一个独立的空间来存放当前用户独有的值.  在空间中如何想要设置值:        request.session['x1'] = 123        request.session['x2'] = 456    在空间中取值:        request.session['x2']        request.session.get('x2')    视图函数中的业务 *** 作处理完毕,给用户响应,在响应时会 将随机字符串存储到用户浏览器的cookie中.
总结

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

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

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

原文地址: http://outofmemory.cn/langs/1190598.html

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

发表评论

登录后才能评论

评论列表(0条)

保存