对于Django框架的会话框架的深入研究——在大型项目中使用会话技术【Django】
会话框架
会话是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创建)。我们的超级用户已通过身份验证并拥有所有权限,因此我们需要创建一个测试用户来代表普通网站用户。我们将使用管理站点创建本地库组和网站登录,因为这是最快的方法之一。
- 点赞
- 收藏
- 关注作者
评论(0)