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

2022-12-13 18:30:58 浏览数 (1)

会话框架

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

代码语言:javascript复制
INSTALLED_APPS = [
    ...
    'django.contrib.sessions',
    ....

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

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

使用会话技术

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

代码语言:javascript复制
# 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”来获取、设置和删除一些数据。

代码语言:javascript复制
# This is detected as an update to the session, so session data is saved.
request.session['my_car'] = 'mini'
代码语言:javascript复制
# 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并在下面以粗体显示更改。

代码语言:javascript复制
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_访问变量被传递到上下文变量中的模板。

代码语言:javascript复制
<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的“库存”身份验证视图和表单。我们仍然需要创建一些模板,但这很简单。

代码语言:javascript复制
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创建)。我们的超级用户已通过身份验证并拥有所有权限,因此我们需要创建一个测试用户来代表普通网站用户。我们将使用管理站点创建本地库组和网站登录,因为这是最快的方法之一。

0 人点赞