在现代 Web 应用程序中,跨多个请求维护用户状态对于创建个性化体验至关重要。 Django 通过其内置的会话框架简化了这一过程,使开发人员能够安全有效地管理用户数据。
Django 中的内置会话负责管理多个请求上的用户数据。当用户登录 Django 应用程序时,服务器会创建一个会话 ID,通常存储在客户端浏览器上的 cookie 中。该会话 ID 用作检索服务器上存储的数据并将请求链接到特定用户的密钥。这就是身份验证状态将在不同页面上持续存在的原因。
Django 的会话中间件可以自动化会话管理。它处理传入请求以检索会话数据并准备传出响应以更新或设置会话 cookie。要检查会话中间件是否已启用,请查看 MIDDLEWARE 部分下的 settings.py 文件:
# settings.py MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', # Other middleware ]
我们有多种保存会话数据的选项。根据您想要构建的应用程序,每个应用程序都有优点和缺点。
类比:想象剧院有一个安全的储藏室,里面有储物柜,所有外套都存放在那里。每个储物柜都分配有一个与您门票上的号码相匹配的唯一号码。当你拿着票回来时,服务员会在日志中查找储物柜号码并取回你的外套。
数据库支持的会话将会话数据保存在数据库服务器上。因此,用户首选项、登录状态和购物车详细信息等敏感信息仍安全地保存在后端。这种类型的会话可能更安全,但在涉及写入和读取过程时会造成一些不便。与缓存支持的会话相比,数据库支持的会话速度较慢,因此,如果您正在构建流量较高的应用程序,那么您应该再考虑一下。在数据库中存储会话会增加数据库的负载,如果管理不当,会影响整体性能。
如果你想使用数据库支持的会话,你需要将 django.contrib.sessions 添加到你的 INSTALLED_APPS 设置中。请确保运行manage.py migrate来安装存储会话数据的单个数据库表。
类比:在这种情况下,每件外套都存放在剧院后面一个大房间里不同的、贴有标签的储物柜中。每个储物柜都有一个独特的标签或文件,其中包含外套详细信息,当您出示门票时,服务员会前往更衣室,找到相应的标签,并取回您的外套。
基于文件的会话使用服务器的文件系统来保存会话数据。这意味着每个用户会话都存储在服务器上的单独文件中。默认情况下,Django 将会话文件存储在 /tmp 下的 django_session 目录中(在基于 Unix 的系统上)或 Django 设置中指定的目录中。
要启用基于文件的会话,请在 settings.py 文件中将 SESSION_ENGINE 设置为 django.contrib.sessions.backends.file。
# settings.py MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', # Other middleware ]
类比:这里,剧院在入口处使用了一个临时衣帽架,只存放短暂的外套。这使得取外套变得非常快,但如果架子已满,最旧的外套可能会移至二级存储或完全移走。
这种类型的会话存储是缓存系统(例如 Memcached 或 Redis)存储会话数据的地方。将会话保存在内存缓存中将有助于高流量或需要快速响应时间的应用程序,因为写入或读取过程非常快。
要使用缓存支持的会话,请在 settings.py 文件中配置 SESSION_ENGINE 设置。您还必须根据您使用的缓存内存配置缓存。
# settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.file' # Use file-based session storage SESSION_FILE_PATH = '/path/to/session/files/' # Specify a directory for session files (optional)
或者,您可以使用 django.contrib.sessions.backends.cached_db ,它将会话数据存储在缓存和数据库中,如果缓存不可用,则回退到数据库。
使用此类会话的最佳优势是可扩展性和速度。缓存支持的会话不仅速度快,因为将数据保存在内存中,而且还减少了数据库会话的负载。数据可以跨服务器共享,从而使多服务器设置成为可能。
类比:在这里,剧院允许你随身携带外套,而不是把你的外套存放起来,但要求你在门票上盖上特殊的印章,以证明这是你的外套。你随身携带外套(场次数据),每次进入剧院时,服务员都会检查门票上的印章,以确保它没有被篡改。
Django 中的签名 cookie 会话将会话数据直接存储在客户端浏览器上的签名和加密 cookie 中,而不是将其存储在服务器端(数据库或缓存)。
要启用签名 cookie 会话,请在 Django 的 settings.py 文件中设置 SESSION_ENGINE 以使用签名 cookie 后端:
# settings.py MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', # Other middleware ]
签名 Cookie 会话,这可以减少服务器负载并释放服务器资源。但是,由于 Cookie 的大小限制(大约 4 KB),签名 Cookie 会话不适合存储大量会话数据。较大的 cookie 大小可能会导致请求速度变慢,因为 cookie 数据会随每个请求一起发送。
Django 提供了多种设置来配置会话行为:
SESSION_COOKIE_AGE:设置会话过期时间(以秒为单位)。
SESSION_COOKIE_SECURE:需要通过 HTTPS 传输会话。
SESSION_EXPIRE_AT_BROWSER_CLOSE:浏览器关闭时结束会话。
SESSION_COOKIE_HTTPONLY:限制 JavaScript 对会话 cookie 的访问,增强安全性。
这些设置有助于根据特定应用程序需求定制会话行为。有关会话配置的更多信息,请阅读 Django 文档。
要与 Django 视图中的会话进行交互,请使用 request.session 对象,其行为类似于字典。以下是一些基本操作:
存储数据:
# settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.file' # Use file-based session storage SESSION_FILE_PATH = '/path/to/session/files/' # Specify a directory for session files (optional)
检索数据:
# settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # For caching session storage SESSION_CACHE_ALIAS = 'default' # Specify the cache alias if needed (e.g., 'redis' or 'memcached') # Cache configuration (example with Redis) CACHES = { 'default': { 'BACKEND': 'django_redis.cache.RedisCache', 'LOCATION': 'redis://127.0.0.1:6379/1', # Redis URL 'OPTIONS': { 'CLIENT_CLASS': 'django_redis.client.DefaultClient', } } }
删除数据:
# settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' SECRET_KEY = 'your-secret-key' # Make sure this key is kept secure and unique for your app
会话的常见用途是跟踪用户登录状态。以下是如何使用会话实现简单的登录系统:
request.session['username'] = 'Harry Potter'
Django视图中session的方法还是有很多的。如需完整列表,请查看 Django 文档。
Django 定期删除过期的会话。您可以通过配置会话清理过程或运行 django-admin clearsessions 等管理命令来自定义频率。
避免在会话中存储大量数据,因为这可能会增加服务器负载并减慢响应时间。最后启用安全 cookie、HttpOnly 和 HTTPS 设置来保护会话数据。
Django 的会话框架功能强大、灵活且安全,使您可以轻松地在 Web 应用程序中实现会话管理。通过正确的配置和安全实践,您可以利用 Django 会话创建高效、个性化的用户体验,同时保持强大的安全性。
以上是Django 中的身份验证和授权:Django 会话的详细内容。更多信息请关注PHP中文网其他相关文章!