对于Django框架的会话框架的深入研究——在大型项目中使用会话技术【Django】

举报
黎燃 发表于 2024/08/14 22:01:47 2024/08/14
【摘要】 会话框架会话是Django(以及大多数互联网)用来跟踪站点和特定浏览器之间的“状态”的机制。会话允许您为每个浏览器存储任意数据,并在浏览器连接时将该数据提供给站点。然后,通过用于存储和检索数据的“键”引用与会话关联的每个数据项。INSTALLED_APPS = [ ... 'django.contrib.sessions', ....MIDDLEWARE = [ ....

会话框架

会话是Django(以及大多数互联网)用来跟踪站点和特定浏览器之间的“状态”的机制。会话允许您为每个浏览器存储任意数据,并在浏览器连接时将该数据提供给站点。然后,通过用于存储和检索数据的“键”引用与会话关联的每个数据项。

INSTALLED_APPS = [
    ...
    'django.contrib.sessions',
    ....

MIDDLEWARE = [
    ...
    'django.contrib.sessions.middleware.SessionMiddleware',
    ....

Django使用包含特殊会话ID的cookie来识别每个浏览器及其与站点的关联会话。默认情况下,实际会话数据存储在站点数据库中(这比将数据存储在cookie中更安全,因为它们更容易受到恶意用户的攻击)。您可以将Django配置为将会话数据存储在其他位置(缓存、文件、“安全”cookie),但默认位置是一个不错且相对安全的选项。

使用会话技术

可以从请求请求参数(HttpRequest作为视图的第一个参数传入)访问视图中的会话会话属性。此会话属性表示与当前用户的特定连接(或更具体地说,与当前浏览器的连接,由站点的浏览器cookie中的会话ID标识)。

# Get a session value by its key (e.g. 'my_car'), raising a KeyError if the key is not present
my_car = request.session['my_car']

# Get a session value, setting a default if it is not present ('mini')
my_car = request.session.get('my_car', 'mini')

# Set a session value
request.session['my_car'] = 'mini'

# Delete a session value
del request.session['my_car']

会话会话属性是一个类似于字典的对象。您可以多次读取和写入视图,并根据需要对其进行修改。您可以执行所有常规字典操作,包括清除所有数据、测试是否有密钥、循环数据等。在大多数情况下,您只需要使用标准字典API来获取和设置值。
下面的代码片段显示了如何使用与当前会话(浏览器)关联的键“my_car”来获取、设置和删除一些数据。

# This is detected as an update to the session, so session data is saved.
request.session['my_car'] = 'mini'

# Session object not directly modified, only data within the session. Session changes not saved!
request.session['my_car']['wheels'] = 'alloy'

# Set session as modified to force data updates/cookie to be saved.
request.session.modified = True

作为一个简单的现实世界示例,我们将更新我们的库,以告诉当前用户他们访问LocalLibrary主页的次数。
打开/locallibrary/cacatalog/views。py并在下面以粗体显示更改。

def index(request):
    ...

    num_authors=Author.objects.count()  # The 'all()' is implied by default.

    # Number of visits to this view, as counted in the session variable.
    num_visits=request.session.get('num_visits', 0)
    request.session['num_visits'] = num_visits+1

    # Render the HTML template index.html with the data in the context variable.
    return render(
        request,
        'index.html',
        context={'num_books':num_books,'num_instances':num_instances,'num_instances_available':num_instances_available,'num_authors':num_authors,
            'num_visits':num_visits}, # num_visits appended
    )

在这里,我们首先获得“num_访问的值”会话密钥。如果之前未设置,请将值设置为0。每次收到请求时,我们都会增加值并将其保存回会话(用户下次访问页面时)。然后添加num_访问变量被传递到上下文变量中的模板。

<h2>Dynamic content</h2>

<p>The library has the following record counts:</p>
<ul>
<li><strong>Books:</strong> {{ num_books }}</li>
<li><strong>Copies:</strong> {{ num_instances }}</li>
<li><strong>Copies available:</strong> {{ num_instances_available }}</li>
<li><strong>Authors:</strong> {{ num_authors }}</li>
</ul>

<p>You have visited this page {{ num_visits }}{% if num_visits == 1 %} time{% else %} times{% endif %}.</p>

认证系统非常灵活。您可以根据需要从头开始构建URL、表单、视图和模板。您可以通过调用提供的API来登录用户。然而,在本文中,我们将在登录和注销页面上使用Django的“库存”身份验证视图和表单。我们仍然需要创建一些模板,但这很简单。

from django.contrib.auth.models import User

# Create user and save to the database
user = User.objects.create_user('myusername', 'myemail@crazymail.com', 'mypassword')

# Update fields and then save again
user.first_name = 'John'
user.last_name = 'Citizen'
user.save()

当我们查看Django管理站点时,您已经创建了第一个用户(这是一个超级用户,使用命令python manage.py createsuperuser创建)。我们的超级用户已通过身份验证并拥有所有权限,因此我们需要创建一个测试用户来代表普通网站用户。我们将使用管理站点创建本地库组和网站登录,因为这是最快的方法之一。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。