美文网首页
(11)Django - 会话控制session

(11)Django - 会话控制session

作者: libdream | 来源:发表于2019-03-13 14:33 被阅读0次

Django内置的会话控制简称Session,可为访问者提供基础的数据存储。数据主要存储在服务器上,并且网站的任意站点都能使用会话数据。
当用户第一次访问网站时,网站的服务器将自动创建一个Session对象,该Session对象相当于该用户在网站的一个身份凭证,而且Session能存储该用户的数据信息。当用户在网站的页面之间跳转时,存储在Session对象中的数据不会丢失,只有Session过期或被清理时,服务器才将Session中存储的数据清空并终止该Session。


在创建Django项目时,Django已默认启用Session功能,Session是通过Django的中间件实现的,可以在配置文件settings.py中找到相关信息。
django中Session默认使用数据库保存相关的数据信息,如果想变更Session的保存方式,可以在settings.py中添加配置信息SESSION_ENGINE,该配置可以指定Session的保存方式。Django提供了5种Session的保存方式:

#settings.py
#数据库保存方式,默认方式,无须在setting.py中配置
SESSION_ENGINE = ‘django.contrib.sessions.backends.db’

#以文件形式保存
SESSION_ENGINE = ‘django.contrib.sessions.backends.file’
#使用文本保存可设置文件保存路径,/mysite 代表项目根目录
SESSION_FILE_PATH = '/mysite'

#以缓存形式保存
SESSION_ENGINE = ‘django.contrib.sessions.backends.cache’
#设置缓存名,默认是内存缓存方式,此处的设置于缓存机制的设置相关
SESSION_CACHE_ALIAS = 'default'

#以数据库 + 缓存形式保存
SESSION_ENGINE = ‘django.contrib.sessions.backends.cached_db’

#以cookies形式保存
SESSION_ENGINE = ‘django.contrib.sessions.backends.signed_cookies’

SESSION_ENGINE用于配置服务器Session的保存方式,如果想要配置Cookie的Session的保存方式,可以在settings.py中添加如下表所示的配置。

配置信息 说明
SESSION_COOKIE_NAME = 'sessionid' 设置Cookie里Session的键,默认为sessionid
SESSION_COOKIE_PATH = '/' 设置Cookie里Session的保存路径,默认为‘/’
SESSION_COOKIE_DOMIN = None 设置Cookie里Session的保存域名,默认为None
SESSION_COOKIE_SECURE = False 是否使用HTTPS传输Cookie,默认为False
SESSION_COOKIE_HTTPONLY = True 是否只支持HTTP传输,默认为True
SESSION_COOKIE_AGE = 1209600 设置Cookie里Session的有效期,默认时间2周
SESSION_EXPIRE_AT_BROWSER_CLOSE = False 是否关闭浏览器使得Session过期,默认为False
SESSION_SAVE_EVERY_REQUEST = False 是否每次发送后保存Session,默认为False

Session的数据类型可理解为Python的字典类型,主要在视图函数中执行读写操作,并且从用户请求对象中获取,即来自视图函数的参数request。Session的读写如下:

#request 为视图函数的参数 request
#获取k1 的值,若 k1 不存在则会报错
request.session['k1']

#获取k1 的值,若k1 不存在则为空值
#get 和 setdefault 所实现的功能一致
request.session.get['k1', '']
request.session.setdefault('k1', '')

#设置session的值,键为k1, 值为123
request.session['k1'] = 123

#删除session中 k1 的数据
del request.session['k1']
#删除整个session
request.session.clear()

#获取session的键
request.session.keys()
#获取session的值
request.session.values()

#获取session的session_key,即数据表django_session的字段session_key
request.session.session_key

这里以一个简单的购物车功能为例来讲解如何使用Session。购物车的实现思路如下:

  • 用户点击“加入购物车”按钮触发一个GET请求,并将商品信息作为请求参数传给视图函数处理
  • 视图函数接收GET请求后,将请求参数保存到Session中并返回首页,即刷新当前页面
  • 当用户进入购物车页面时,程序获取Session里的数据,并将数据展示在购物车列表中。
  • 用户在购物车页面单击某个商品的“移除商品”按钮时,程序在Session中删除该商品信息。
    我们改造mysite项目中的index 的urls.py、views.py、index.html,在templates中添加一个shoppingCar.html模板文件。
    网站的首页主要实现Session的写入,购物车页面实现Session的读取和删除操作。
    首先编写urls.py和views.py文件。
#index 的 urls.py
urlpatterns = [
    path('', views.index, name='index'),
    path('shoppingCar.html', views.shoppingCarView, name='shoppingCar'),
]

#index 的 views.py
from django.shortcuts import render,redirect
from django.contrib.auth.decorators import login_required, permission_required

#使用login_required和permission_required分别对用户登录和用户权限进行验证
@login_required(login_url='/user/login.html')
@permission_required(perm='index.visit_product', login_url='/user/login.html')
def index(request):
    context = {'title':'首页'}
      #获取GET请求参数
    product = request.GET.get('product', '')
    price = request.GET.get('price', '')
    if product:
        #尝试获取存储在Session中的数据,若Session不存在product_info,则返回一个空列表
        product_list = request.session.get('product_info', [])
        #判断当前请求参数是否已存储在Session
        if not product in product_list:
            #将当前参数存储在列表product_list中
            product_list.append({'price':price, 'product':product})
        #更新存储在Session中的数据
        request.session['product_info'] = product_list
        return redirect('/')
    return render(request, 'index.html', context=context) 

@login_required(login_url='/user/login.html')
def shoppingCarView(request):
    #获取存储在Session中的数据,若Session中不存在product_info,则返回一个空列表
    product_list = request.session.get('product_info', [])
    #获取GET请求参数,若没有请求参数,则返回空值
    del_product = request.GET.get('product', '')   
    #判断是否为空,若非空,则删除Session中的商品信息
    if del_product:
        #删除Session中某个商品数据
        for i in product_list:
            if i['product'] == del_product:
                product_list.remove(i)
        #将删除后的数据覆盖原来的Session
        request.session['product_info'] = product_list
        return redirect('/shoppingCar.html')
    return render(request, 'shoppingCar.html', locals()) 

模板文件代码如下:

#index.html
{% load myfilter %}
<title>{{ title | myreplace:'首页:我的首页' }}</title>
{#在模版中使用user变量是一个User或者AnoymousUser对象,该对象由模型MyUser实例化#}
{% if user.is_authenticated %}
    <div >用户名: {{ user.username }}</div>
    <div><a href="{% url 'logout' %}">退出登录</a></div>
{% endif %}
<div><a href="{% url 'shoppingCar' %}">我的购物车</a></div>
<ul>
    <li>手机1</li><div style="position: relative;top:-22px;left:50px"><a href="{% url 'index' %}?product=手机1&price=1999">加入购物车</a></div>
    <li>手机2</li><div style="position: relative;top:-20px;left:50px"><a href="{% url 'index' %}?product=手机2&price=2999">加入购物车</a></div>
    <li>手机3</li><div style="position: relative;top:-18px;left:50px"><a href="{% url 'index' %}?product=手机3&price=3999">加入购物车</a></div>
    <li>手机4</li><div style="position: relative;top:-16px;left:50px"><a href="{% url 'index' %}?product=手机4&price=4999">加入购物车</a></div>
</ul>

#shoppingCar.html
<title>我的购物车</title>

<body>
    <div style="float: right;"><a href="{% url 'index' %}">返回首页</a></div>
        
        <div>
            {% for info in product_list %}
            <ul>
                
                <li>
                    <div><a href="">{{ info.product }}</a></div>
                </li>
                <li>
                    <p>¥{{ info.price }}</p>
                </li>
            
                <li>
                    <p class="del">
                    <a href="{% url 'shoppingCar' %}?product={{ info.product }}" class="delBtn">移除商品</a>
                    </p>
                </li>
            </ul>
            {% endfor %}
        </div>
    </div>
</body>

运行首页如下:


image.png

点击加入购物车,可以重复点击,然后再点击我的购物车。


image.png
点击移除商品可以删除掉购物车的商品。

相关文章

网友评论

      本文标题:(11)Django - 会话控制session

      本文链接:https://www.haomeiwen.com/subject/wvhzpqtx.html