通过例子理解Django的session机制

2019-11-12  本文已影响0人  陈某君

Django官方文档写到:

Django 提供对匿名会话(session)的完全支持。这个会话框架让你可以存储和取回每个站点访客任意数据。它在服务器端存储数据, 并以cookies的形式进行发送和接受数据。

下面通过例子理解

第一步,启动SESSION

检查settings.py文件两个地方

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions', #第一个地方,默认开启
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'myapp',
]
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware', #第二个地方,默认开启
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

第二步,配置数据库

同样是在settings.py文件中

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'accountApp',
        'USER': 'root',
        'PASSWORD': '123456',
        'HOST': '127.0.0.1',
        'PORT': 3306,
    }
}

运行迁移,python manage.py migrate
这时,查看数据库可以看到名为django_session的表。

Snipaste_2019-11-12_20-05-30.png

第三步,编写视图函数和url配置器

# myapp/views.py
def login(request):
        if request.session.get('username', None) == '123456':
            return HTTPResponse('登录成功')
        else:
            request.session['username'] = '123456'
            return HTTPResponse('请登录')
# myapp/urls.py
urlpatterns = [
    path('u/login/', views.login),
]

第四步,测试

我们使用httpie工具访问接口

Snipaste_2019-11-12_20-04-39.png

注意响应头中有Set-Cookie: sessionid=oe5c4tclsvq7pn071jnak7481lgqomdp; expires=Tue, 26 Nov 2019 11:42:13 GMT; Max-Age=1209600; Path=/; SameSite=Lax
再来看看数据库中的表**django_session

Snipaste_2019-11-12_19-55-34.png
可以发现session_key和sessionid是一样的。

在django中,HttpRequest.session是一个字典对象,我们可以对他多次编辑,django会自动加密并通过set-cookie响应头返回给浏览器,同时保存到django_session数据库中。这时,浏览器需将set-cookie的内容保存到cookie中并在下一次请求发送给服务端。

使用httpie工具模拟浏览器再一次发送请求并附带cookie


Snipaste_2019-11-12_20-03-45.png
上一篇下一篇

猜你喜欢

热点阅读