Django session方法实战案例
session的作用和cookie类似,都是存储与用户相关的信息。不同的是cookie存储在本地浏览器中,而session是存储授权信息的一种思想、概念和服务器解决方案。不同的服务器、不同的系统、不同的语言有不同的实现。尽管应用程序不同,但它们的目的都是为了在服务器上轻松存储数据。会议的焦点是解决cookie在数据存储方面不安全的问题。
使用cookie和session
随着Web开发发展至今,使用cookie和session已经出现了非常严肃的解决方案。在当今的市场或业务中,一般有两种存储方式:
- 服务器端存储:通过cookie存储sessionid,然后存储在个人数据的session中。如果用户登录,服务器会在cookie中保存sessionid。下次发出请求时,将检索 sessionid。服务器会根据sessionid在session数据库中获取用户的session数据。您可以查明用户是谁以及之前保存的状态信息。这个专业术语叫做服务器端会话。 Django 默认将会话信息存储在数据库中。当然,也可以存储在其他地方,比如缓存、文件系统等。存储在服务器上的数据将更加安全并且不太可能被盗。但是,存储在服务器上有一些缺点,那就是会占用服务器的资源。但现在服务器已经发展至今,一些session信息已经绰绰有余了。
- 输入会话数据并保存在 cookie 中。这个专业术语称为客户端会话。 jar系统默认使用此方法,但也可以替换为其他格式。 ? 默认情况下,会话数据存储在数据库中。我们怎么知道?这可以从 Django 的默认配置中获得。 Django配置路径来自django.conf import global_settings。我们可以打开查看默认配置。这是代码:
# Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认) SESSION_COOKIE_NAME = 'sessionid' # Session的cookie失效日期(2周)(默认) SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 2 # Session的cookie保存的域名(默认) SESSION_COOKIE_DOMAIN = None # 是否Https传输cookie(默认) SESSION_COOKIE_SECURE = False # Session的cookie保存的路径(默认) SESSION_COOKIE_PATH = '/' # 是否Session的cookie只支持http传输(默认) SESSION_COOKIE_HTTPONLY = True # 是否每次请求都保存Session,默认修改之后才保存(默认) SESSION_SAVE_EVERY_REQUEST = False # 是否关闭浏览器使得Session过期(默认) SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 存储session数据默认使用的模块 SESSION_ENGINE = 'django.contrib.sessions.backends.db' # session数据的序列化类 SESSION_SERIALIZER = 'django.contrib.sessions.serializers.JSONSerializer'
在这里我们看到SESSION_ENGINE = 'django.contrib。 session.backends.db'Django默认使用数据库,这只是存储系统之一。下面我们分别通知您
1。方法
使用数据。这是默认解决方案。
# 数据库方式(默认): SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 数据库类型的session引擎需要开启此应用,启用 sessions 应用 INSTALLED_APPS = [ 'django.contrib.sessions', ]
2。缓存
使用缓存来保存会话。如果要将数据存储在缓存中,必须在settings.py中配置CACHES,并且需要使用Memcached而不是纯内存作为缓存。
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
3。缓存+数据库
存储数据时,数据会先存储在缓存中,然后存储在数据库中。这样可以保证如果缓存系统出现问题,会话数据不会丢失。检索数据时,首先从缓存中获取数据。如果缓存中没有,则从数据库中获取。
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'
4。文件
使用文件保存会话。
SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 设置文件位置, 默认是 tempfile.gettempdir(), # linux下是:/tmp # windows下是: C:\Users\51508\AppData\Local\Temp SESSION_FILE_PATH = 'd:\session_dir'
5。 cookie加密
基于cookie的会话,所有数据都存储在cookie中。一般不推荐这种方法,冒充cookie的用户已经出局了。继续访问网站
- SECRET_KEY这个加密元素绝对不能泄露,否则攻击者可以执行任意代码
- cookie太大了,会影响用户登录的速度
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'
3.操作会话
- get:用于从会话中获取指定值。
- pop:删除会话值。
- keys:获取所有会话密钥。
- item:获取会话中的所有值。
- clear:删除当前用户的会话数据。
- flush:清除session,删除浏览器中存储的session_id。外出时经常使用。
- set_expiry(value):设置过期时间。
- Shaping:代表秒数,表示已经过去了多少秒。
- 0:表示会话在浏览器关闭时结束。
- 无:将使用全球会议应用程序。可以在settings.py中设置SESSION_COOKIE_AGE来调整全局过期时间。默认值为 1209600 秒,即 2 周。
- clear_expired:清除过期会话。 Django 不会删除过期的会话。您需要定期清除它们,或者在终端中使用 python manage.pyclearsessions 命令删除过期的会话。 ?打开F12,输入url地址http://127.0.0.1:8000/session/set_session/。我们可以看到后台返回的set-cookie响应的头部有一个sessionid。这个sessionid是从前端传递到后端的。经过一系列的加密操作后,密钥返回到前端浏览器
由于Django中存储Session的默认机制是数据库,因此数据库也会与数据库中的django_session表具有相同的密钥然后在浏览器中访问http://127.0.0.1:8000/session/get_session/。 session值会在浏览器页面以jkc的形式返回,表明session key有效并且没有过期。 。
最后访问http://127.0.0.1:8000/session/clear_session/,浏览器页面返回session已成功清除。如何证明呢?我们可以再次访问http://127.0.0.1:8000/session/get_session/。我们会看到这次没有返回session值。 None 值表示会话已删除。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。