美文网首页
通过例子理解Django的session机制

通过例子理解Django的session机制

作者: 陈某君 | 来源:发表于2019-11-12 20:06 被阅读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

    相关文章

      网友评论

          本文标题:通过例子理解Django的session机制

          本文链接:https://www.haomeiwen.com/subject/agmqictx.html