首页 >> 大全

django:session会话控制

2023-07-13 大全 28 作者:考证青年

一,

当用户第一次访问某网站时,网站服务器就在内存中开辟一块空间来创建对象,用于在“无状态”的HTTP的长会话中存储用户信息。能使用户在同一浏览器的不同页面间跳转时保持信息一致。会在失效或过期时被清理。主要的原理性内容可以参考网络爬虫基础知识:HTTP和HTTPS、和这篇博客。

二,中的 1,默认的设置

默认开启 ,由 .py 中 的'....'进行状态判断,并根据判断结果调用 .py中 的'..' 进行相关处理。

默认情况下,将会话存储在数据库中(使用模型 ....),如下:

尽管这样做很方便,但在某些设置中,将会话数据存储在其他地方会更快,比如可以配置将会话数据存储在文件系统或缓存中。通过在 .py 中设置 来使用 提供多种保存 的方式:

1,默认使用数据库保存:

SESSION_ENGINE = 'django.contrib.sessions.backends.db'

2,使用文件保存:

SESSION_ENGINE = 'django.contrib.sessions.backends.file'
SESSION_FILE_PATH = '/MyProject'

3,使用缓存保存:

要使用的缓存系统存储会话数据,首先需要确保已经配置了缓存。

SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
SESSION_CACHE_ALIAS = 'default' #设置缓存别名,默认内存缓存

4,使用缓存+数据库保存:

SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'

总之,只有在使用缓存后端时,才应该使用基于缓存的会话。本地内存缓存后端保存数据的时间不够长,因此不是一个好的选择,直接使用文件或数据库会话比通过文件或数据库缓存后端发送所有内容更快。此外,本地内存缓存后端不是多进程安全的,因此可能不是生产环境的好选择。

5,使用形式保存:

SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'

6,与相关的其他配置:

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,默认修改之后才保存(默认)

2,中的运行机制

1,以游客身份访问站点而未登录时,在的“检查”中可以发现,当前并没有生成对应的,说明一般情况下不会为游客创建。

2,当登陆之后,被创建并保存在默认的数据表中:

3,复制网站地址,用新窗口打开,即在登录状态下再次访问该网址,还是登陆状态,期间,浏览器先将本地发送到,获取其中的后与默认数据表中的进行比较,确定当前用户信息:

3,的读写操作

可理解为从中获取的一段dict格式的数据。

1,获取:

获取session中VCode的数据,若VCode不存在则报错:
request.session.['VCode']获取session中VCode的数据,若VCode不存在则为空:
request.session.get('VCode', '')
request.session.setdefault('VCode', '')

2,向写入数据:

request.session['VCode'] = VCode

3,删除中的数据:

del request.session['VCode']

4,获取键或值

request.session.keys()
request.session.values()

5,获取:

request.session.session_key

简单的应用,已在:使用邮箱获取验证码中有所体现:

			# 判断验证码是否已发送if not request.session.get('VCode', ''):# 发送验证码并将验证码写入sessionbutton = '重置密码'tips = '验证码已发送'password = TrueVCodeInfo = TrueVCode = str(random.randint(000000, 999999))request.session['VCode'] = VCodeuser[0].email_user('找回密码', VCode)# 匹配输入的验证码是否正确elif VCode == request.session.get('VCode'):# 密码加密处理并保存到数据库dj_ps = make_password(p, None, 'pbkdf2_sha256')user[0].password = dj_psuser[0].save()del request.session['VCode']tips = '密码已重置'

中对的简单操作可以看看反爬虫应用与绕过原理。

会话控制所使用的全局数组是_会话控制session_

三,实战:使用实现商品抢购 1,创建开发环境

使用.7与.2.14,项目结构如下:

2,创建商品模型与数据

index/models.py:
from django.db import modelsclass Product(models.Model):id = models.AutoField('序号', primary_key=True)name = models.CharField('名称', max_length=50)slogan = models.CharField('简介', max_length=50)sell = models.CharField('宣传', max_length=50)price = models.IntegerField('价格')photo = models.CharField('相片', max_length=50)# 设置返回值def __str__(self):return self.nameclass Meta:verbose_name = '商品信息'verbose_name_plural = verbose_name

迁移数据后,添加商品信息:

3,模板文件

templates/index.html:
DOCTYPE html>
<html>
<head><title>商城首页title>{% load static %}
head>
<body>
<div id="top_main"><div class="lf" id="my_hw">当前用户:{{ user.username }}div><div class="lf" id="settle_up"><a href="{% url 'index:order' %}">订单信息a>div>
div>
<section id="main"><div class="layout"><div class="fl u-4-3 lf"><ul>{% for p in products %}<li class="channel-pro-item"><div class="p-img"><img src="{% static p.photo %}">div><div class="p-name lf"><a href="#">{{ p.name }}a>div><div class="p-shining"><div class="p-slogan">{{ p.slogan }}div><div class="p-promotions">{{ p.sell }}div>div><div class="p-price"><em>¥em><span>{{ p.price }}span>div><div class="p-button lf"><a href="{% url 'index:index' %}?id={{ p.id }}">立即抢购a>div>li>{% if forloop.counter == 2 %}<div class="hr-2">div>{% endif %}{% endfor %}ul>div>div>
section>
body>
html>templates/order.html:
DOCTYPE html>
<html lang="en">
<head>
<title>订单信息title>
{% load static %}
<link rel="stylesheet" href="{% static 'css/reset.css' %}">
<link rel="stylesheet" href="{% static 'css/carts.css' %}">
<script src="{% static 'js/jquery.min.js' %}">script>
<script src="{% static 'js/carts.js' %}">script>
head>
<body>
<section class="cartMain"><div class="cartMain_hd"><ul class="order_lists cartTop"><li class="list_chk"><input type="checkbox" id="all" class="whole_check"><label for="all">label>全选li><li class="list_con">商品信息li><li class="list_price">单价li><li class="list_amount">数量li><li class="list_sum">金额li><li class="list_op">操作li><li class="list_op"><a href="{% url 'index:index' %}">返回首页a>li>ul>div><div class="cartBox"><div class="shop_info"><div class="all_check"><input type="checkbox" id="shop_b" class="shopChoice"><label for="shop_b" class="shop">label>div><div class="shop_name">店铺:<a href="javascript:;">MyDjangoa>div>div><div class="order_content">{% for p in products %}<ul class="order_lists"><li class="list_chk"><input type="checkbox" id="checkbox_4" class="son_check"><label for="checkbox_4">label>li><li class="list_con"><div class="list_text"><a href="javascript:;">{{ p.name }}a>div>li><li class="list_price"><p class="price">¥{{ p.price }}p>li><li class="list_amount"><div class="amount_box"><a href="javascript:;" class="reduce reSty">-a><input type="text" value="1" class="sum"><a href="javascript:;" class="plus">+a>div>li><li class="list_sum"><p class="sum_price">¥{{ p.price }}p>li><li class="list_op"><p class="del"><a href="{% url 'index:order' %}?id={{ p.id }}" class="delBtn">移除商品a>p>li>ul>{% endfor %}div>div><div class="bar-wrapper"><div class="bar-right"><div class="piece">已选商品<strong class="piece_num">0strong>div><div class="totalMoney">共计: <strong class="total_text">0.00strong>div><div class="calBtn"><a href="javascript:;">结算a>div>div>div>
section>
body>
html>

4,功能实现

from django.shortcuts import render, redirect
from .models import Product
from django.contrib.auth.decorators import login_required# 商品信息展示
@login_required(login_url='/admin/login')
def index(request):# 用户抢购时,获取商品idid = request.GET.get('id', '')if id:# 获取存储在Session的idListidList = request.session.get('idList', [])# 判断当前请求参数是否已存储在Sessionif not id in idList:# 将商品的主键id存储在idListidList.append(id)# 更新Session的idListrequest.session['idList'] = idListreturn redirect('/')# 查询所有商品信息products = Product.objects.all()return render(request, 'index.html', locals())# 订单确认
def orderView(request):idList = request.session.get('idList', [])del_id = request.GET.get('id', '')# 判断是否为空,若非空,删除Session里的商品信息if del_id in idList:# 删除Session里某个商品的主键idList.remove(del_id)# 将删除后的数据覆盖原来的Sessionrequest.session['idList'] = idList# 根据idList查询商品的所有信息products = Product.objects.filter(id__in=idList)return render(request, 'order.html', locals())

5,运行

登录后进入商品信息页,就会会产生信息:

点击商品的立即抢购后,会将商品id加入到的中,可以打印出信息进行查看:

print(request.session.values())
# 在抢购了两件商品之后:
dict_values(['1', 'django.contrib.auth.backends.ModelBackend', '7f4dfdaf193f6c0f7e62792ab67eb835a0c86168', ['1', '3']])

进入订单界面:

当选择新窗口登录并打开订单信息界面时,直接跳过了登陆页面,还会发现之前加入的商品都还在,也就是说,我们通过成功保存了用户相关信息,实现了用户在不同窗口间的信息一致功能。但如果用另一个浏览器进行访问,则还是需要重新登陆,这也是/原理的体现。

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了