以下用到视图函数、序列化器、模板等在此链接中有定义使用
一、打开会话
会话通过配置一个中间件实现。为了打开会话,需要做下面的操作:
- 通过 django-admin startproject 创建的默认 settings.py 文件
- 确保已经打开了 SessionMiddleware 这项设置的。
- 编辑设置中的 MIDDLEWARE,并确保他包含了 'django.contrib.sessions.middleware.SessionMiddleware'。
如果你不想使用会话功能,可以从配置的 MIDDLEWARE 中删除 `SessionMiddleware,并且从 INSTALLED_APPS 中删除 'django.contrib.sessions'。
二、配置会话(session)引擎
django.conf.globals_settings.SESSION_ENGINE
1、使用数据库支持的会话
默认情况下,Django 在数据库里存储会话。虽然这很方便,但在一些设置里,在其他地方存储会话数据速度更快,因此 Django 还可以在文件系统或缓存中配置存储会话数据。
1)在setting中配置session会话引擎:
SESSION_ENGINE = "django.contrib.sessions.backends.db"
2)配置数据库的支持
如果你想使用数据库支持的会话,你需要在里INSTALLED_APPS中添加 'django.contrib.sessions'
。一旦在安装中配置,该应用,则我们再迁移模型表的时候,就会在配置的数据库中生成存储会话的表
3)如果配置了数据库,且迁移了django自带的模型对象,则有数据库中一个存储session会话的表
4)登录一个用户、查看基于数据库存储的会话
没有登录前
登录后
查看数据是否存储了当前用户的会话记录
2、使用文件存储会话
1)在setting文件中配置文件会话的引擎
SESSION_ENGINE = 'django.contrib.sessions.backends.file'
2)在setting文件中设置会话保存的路径
这里存储在当前项目目录下的tmp/文件夹下
SESSION_FILE_PATH ='tmp/'
3)登录查看
3、使用cookie存储会话
使用cookie存储会话,数据的加密签名将使用 Django 的模块
django.core.signing
和SECRET_KEY进行保存。
1)在setting配置文件中配置cookie后端
SESSION_ENGINE = "django.contrib.sessions.backends.signed_cookies"
2)在setting配置文件中定义密钥
以下是创建项目时django自定义创建的
SECRET_KEY = 'django-insecure-t)4b+p+u6_!0u+ih$&hldk73elfr6&sjsi0s7py(0ao64qec#q'
3)登录查看
二、使用缓存会话
为了得到更好的性能,可以使用基于缓存的会话后端。使用 Django 的缓存系统来存储会话
1、基于Django自带缓存系统使用会话
1)django默认的缓存配置(不用我们配置)
2)配置session会话引擎:
基于django自带的缓存系统,这里有两种配置session会话引擎的方式:
--------django.contrib.sessions.backends.cache:
设置 SESSION_ENGINE为
"
django.contrib.sessions.backends.cache"
用于简单缓存会话存储。会话数据直接被存储在缓存里。然而,会话数据可能不是长久的:因为缓存满了或者缓存服务重启了,所以缓存数据会被收回。
--------django.contrib.sessions.backends.cache_db:
为了持久化缓存数据,设置 SESSION_ENGINE 为
"
django.contrib.sessions.backends.cache_db"
。这使用直写式缓存——每次写入缓存的数据也会被写入到数据库。如果数据不在缓存中,会话仅使用数据库进行读取。
这两种会话存储都会非常快,但简单的缓存会更快,因为它忽视了持久化。在大部分情况下,cached_db后端已经足够快了,但如果你需要最后的一点性能,并且愿意时不时删除会话数据,那么cache后端更适合。
2、基于redis缓存系统使用会话
1)下载django_redis模块
pip install django_redis
2)自定义缓存系统
在setting中配置如下:
CACHES = {
"session": { # 自定义缓存后端名字
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://xxxxxxxxxx:6379/1", redis的地址以及使用第几号库
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"PASSWORD": "xxx" #redis数据的密码
}
},
}
3)配置文件中指定会话缓存
至于django自带的缓存系统,在默认的配置文件中也有通过SESSION_CACHE_ALIAS='defaule'指定
指定我们自己定义的缓存后端
SESSION_CACHE_ALIAS = "session"
4) 指定会话后端
对于redis缓存,一般使用
django.contrib.sessions.backends.cache_db
5)至此,可以我们可以通过redis去存储会话
查看redis,现在没有数据
登录一个用户,可以看到redis中就存储着与当前用户的会话
三、总结
1、django配置会话的后端
SESSION_ENGINE = "django.contrib.sessions.backends.db"
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_ENGINE = "django.contrib.sessions.backends.cached_db"
SESSION_ENGINE = "django.contrib.sessions.backends.signed_cookies"
SESSION_ENGINE = 'django.contrib.sessions.backends.file'
2、cookie的一些相关配置
# Cache to store session data if using the cache session backend.
SESSION_CACHE_ALIAS = "default"
# Cookie name. This can be whatever you want.
SESSION_COOKIE_NAME = "sessionid"
# Age of cookie, in seconds (default: 2 weeks).
SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 2
# A string like "example.com", or None for standard domain cookie.
SESSION_COOKIE_DOMAIN = None
# Whether the session cookie should be secure (https:// only).
SESSION_COOKIE_SECURE = False
# The path of the session cookie.
SESSION_COOKIE_PATH = "/"
# Whether to use the HttpOnly flag.
SESSION_COOKIE_HTTPONLY = True
# Whether to set the flag restricting cookie leaks on cross-site requests.
# This can be 'Lax', 'Strict', 'None', or False to disable the flag.
SESSION_COOKIE_SAMESITE = "Lax"
# Whether to save the session data on every request.
SESSION_SAVE_EVERY_REQUEST = False
# Whether a user's session cookie expires when the web browser is closed.
SESSION_EXPIRE_AT_BROWSER_CLOSE = False
# The module to store session data
SESSION_ENGINE = "django.contrib.sessions.backends.db"
# Directory to store session files if using the file session module. If None,
# the backend will use a sensible default.
SESSION_FILE_PATH = None
# class to serialize session data
SESSION_SERIALIZER = "django.contrib.sessions.serializers.JSONSerializer"