Django中的Cookie和Session

目录

HttpRequest和HttpResponse对象

Django中Cookie的设置

Django中Session的设置 

Django中Cookie+Session的设置


关于Cookie和Session,传送门——> Cookie、Session和Token的区别

HttpRequest和HttpResponse对象

Django使用请求和响应对象来通过系统传递状态。

当请求页面时,Django创建一个HttpRequest包含有关请求的元数据的对象。然后Django加载适当的视图,将HttpRequest第一个参数传递给view函数。每个视图都负责返回一个HttpResponse对象。

Django中Cookie的设置

服务端响应设置Cookie

#普通设置
HttpResponse.set_cookie(key,value='',max_age = None,expires = None,path ='/',domain = None,secure = None,httponly = False,samesite = None)

#加盐   普通cookie是明文传输的,可以直接在客户端直接打开,所以需要加盐,解盐之后才能查看
HttpResponse.set_signed_cookie(key,value ='',salt='盐值' ,max_age = None,expires = None,path ='/',domain = None,secure = None,httponly = False,samesite = None)
  • max_age=1 :cookie生效的时间,单位是秒
  • expires:具体过期日期  
  • path='/':指定那个url可以访问到cookie;‘/’是所有; path='/'
  • 4domain=None(None代表当前域名):指定那个域名以及它下面的二级域名(子域名)可以访问这个cookie
  • secure=False:https安全相关
  • httponly=False:限制只能通过http传输,JS无法在传输中获取和修改

客户端获取Cookie

#普通获取
HttpRequest.COOKIES['key']

#获取加盐的cookie
HttpRequest.get_signed_cookie(key,default = RAISE_ERROR,salt ='',max_age = None):返回已签名cookie的cookie值,default是设置默认值(当没有获取到cookie的时候),salt盐值提供加密保护

客户端删除Cookie

HttpResponse.delete_cookie(key,path ='/',domain = None) #删除cookie中的key值,path是指定路径,domain是指定域

Django中Session的设置 

在用session之前,确保你的数据库同步了。即确保你的数据库中有 django_session 这张表。

设置session

 request.session['username']='xie'

获取session 

 username=request.session.get('username','anybody')  #如果没有获取到值的话,则设置默认值anybody

删除session 

del request.session['username']        

其他方法 

# 所有 键、值、键值对

request.session.keys()
request.session.values()
request.session.items()
request.session.iterkeys()
request.session.itervalues()
request.session.iteritems()

# 用户session的随机字符串
request.session.session_key

# 将所有Session失效日期小于当前日期的数据删除
request.session.clear_expired()

# 检查 用户session的随机字符串 在数据库中是否
request.session.exists("session_key")

# 删除当前用户的所有Session数据
request.session.delete("session_key")

# 注销使用
request.session.clear()

#设置超时时间,set_expiry(value)方法是在最后一次刷新开始计算
request.session.set_expiry(value)

Django中Cookie+Session的设置

cookie看似解决了HTTP(短连接、无状态)的会话保持问题,但把全部用户数据保存在客户端,存在安全隐患,于是cookie+session出现了!我们可以把关于用户的数据保存在服务端,在客户端cookie里加一个sessionID(随机字符串),以此来验证用户的身份。

cookie+session的工作流程:

  1. 当用户成功登录网站时,服务端生成了用户的登录信息session,并且该登录信息对应着一个session_id
  2. 服务端把 session_id放在cookie中,发给浏览器(自动过程,无需我们设置)
  3. 客户端下次访问服务端时,服务端取出该session_id对应的登录信息,来判断用户的登录状态

我们现在模拟一个注册登录的页面,假设用户名不能重复,我们将用户成功登录后的状态写入session中。当客户端访问需要权限的页面时,然后服务器再从此次session会话中取出客户端的状态来比较,如果存在,则曾经登录过。

#urls.py

urlpatterns = [
    path('', views.Register.as_view()),
    path('login/',views.Login.as_view()),
    path('index/',views.index),
    path('logout/',views.logout)
]

#views.py

from django.shortcuts import render
from django import forms
from django.http import HttpResponseRedirect,HttpResponse
from django.views.generic import View
from app.models import User

#定义一个form表单
class UserForm(forms.Form):
    username=forms.CharField(label='用户名')
    password=forms.CharField(label='密码',widget=forms.PasswordInput)

#注册
class Register(View):
    def get(self,request):
        form=UserForm()
        return render(request,"register.html",context={"form":form})
    def post(self,request):
        form=UserForm(request.POST)
        if form.is_valid():
            username=form.cleaned_data.get('username')
            password=form.cleaned_data.get('password')
            User.objects.create(username=username,password=password)  #写入数据库中
            return HttpResponseRedirect('/login')         #重定向到登录页面
        else:
            form=UserForm()
            return render(request,"register.html",context={"form":form})
#登录
class Login(View):
    def get(self,request):
        form=UserForm()
        return render(request,"login.html",context={"form":form})
    def post(self,request):
        form=UserForm(request.POST)
        if form.is_valid():
            username=form.cleaned_data.get('username')
            password=form.cleaned_data.get('password')
            users=User.objects.filter(username=username,password=password)  #查询数据库
            if users:
                response=HttpResponseRedirect("/index")
                #如果登录成功,将登录状态is_login设置为True,该此时服务端会自动向客户端返回的Cookie中加入此session_id
                request.session['is_login']=True
                request.session['username']=username
                #设置cookie ,自己可以随便设置字段和值
                response.set_cookie("id","1")
                response.set_cookie("age","20")
                return  response
            else:
                return HttpResponseRedirect("/login")
        else:
            form=UserForm()
            return render(request,"register.html",context={"form":form})
def index(request):
    if request.session.get('is_login',None):
         username=request.session.get('username',None)
         content={'username':username}
         return render(request,"index.html",context=content)
    else:
        form=UserForm
        return render(request, "login.html", context={"form": form})

def logout(request):
    response=HttpResponse('注销成功!')
    try:
        del request.session['username']            #删除Session
    except Exception as e:
        print(e)
    finally:
        return response

原文地址:https://www.cnblogs.com/csnd/p/11807698.html