Django 状态保持3.5

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: Django 状态保持3.5

状态保持



http协议是无状态的:每次请求都是一次新的请求,不会记得之前通信的状态


客户端与服务器端的一次通信,就是一次会话


实现状态保持的方式:在客户端或服务器端存储与会话有关的数据


存储方式包括cookie、session,会话一般指session对象


使用cookie,所有数据存储在客户端,注意不要存储敏感信息


推荐使用sesison方式,所有数据存储在服务器端,在客户端cookie中存储session_id

状态保持的目的是在一段时间内跟踪请求者的状态,可以实现跨页面访问当前请求者的数据


注意:不同的请求者之间不会共享这个数据,与请求者一一对应


启用session



使用django-admin startproject创建的项目默认启用


在settings.py文件中


项INSTALLED_APPS列表中添加:


'django.contrib.sessions',


项MIDDLEWARE_CLASSES列表中添加:


'django.contrib.sessions.middleware.SessionMiddleware',


禁用会话:删除上面指定的两个值,禁用会话将节省一些性能消耗


使用session



启用会话后,每个HttpRequest对象将具有一个session属性,它是一个类字典对象

  • get(key, default=None):根据键获取会话的值
  • clear():清除所有会话
  • flush():删除当前的会话数据并删除会话的Cookie
  • del request.session['member_id']:删除会话


用户登录示例


操作效果如下图:


20190914155411459.gif


在views.py文件中创建视图


from django.shortcuts import render, redirect
from django.core.urlresolvers import reverse
def index(request):
    uname = request.session.get('uname')
    return render(request, 'booktest/index.html', {'uname': uname})
def login(request):
    return render(request, 'booktest/login.html')
def login_handle(request):
    request.session['uname'] = request.POST['uname']
    return redirect(reverse('main:index'))
def logout(request):
    # request.session['uname'] = None
    # del request.session['uname']
    # request.session.clear()
    request.session.flush()
    return redirect(reverse('main:index'))


配置url


主url:


from django.conf.urls import include, url
urlpatterns = [
    url(r'^', include('booktest.urls', namespace='main'))
]


应用url:


from django.conf.urls import url
from . import views
urlpatterns = [
    url(r'^$', views.index, name='index'),
    url(r'login/$', views.login, name='login'),
    url(r'login_handle/$', views.login_handle, name='login_handle'),
    url(r'logout/$', views.logout, name='logout')
]


创建模板index.html


<!DOCTYPE html>
<html>
<head>
    <title>首页</title>
</head>
<body>
你好:{{uname}}
<hr/>
<a href="{%url 'main:login'%}">登录</a>
<hr/>
<a href="{%url 'main:logout'%}">退出</a>
</body>
</html>


创建模板login.html


<!DOCTYPE html>
<html>
<head>
    <title>登录</title>
</head>
<body>
<form method="post" action="/login_handle/">
    <input type="text" name="uname"/>
    <input type="submit" value="登录"/>
</form>
</body>
</html>


会话过期时间



set_expiry(value):设置会话的超时时间


  • 如果没有指定,则两个星期后过期
  • 如果value是一个整数,会话将在values秒没有活动后过期
  • 若果value是一个imedelta对象,会话将在当前时间加上这个指定的日期/时间过期
  • 如果value为0,那么用户会话的Cookie将在用户的浏览器关闭时过期
  • 如果value为None,那么会话永不过期



修改视图中login_handle函数,查看效果


def login_handle(request):
    request.session['uname'] = request.POST['uname']
    # request.session.set_expiry(10)
    # request.session.set_expiry(timedelta(days=5))
    # request.session.set_expiry(0)
    # request.session.set_expiry(None)
    return redirect(reverse('main:index'))


存储session



使用存储会话的方式,可以使用settings.py的SESSION_ENGINE项指定


基于数据库的会话:这是django默认的会话存储方式,需要添加django.contrib.sessions到的INSTALLED_APPS设置中,运行manage.py migrate在数据库中安装会话表,可显示指定为


SESSION_ENGINE='django.contrib.sessions.backends.db'


基于缓存的会话:只存在本地内在中,如果丢失则不能找回,比数据库的方式读写更快


SESSION_ENGINE='django.contrib.sessions.backends.cache'

可以将缓存和数据库同时使用:优先从本地缓存中获取,如果没有则从数据库中获取


SESSION_ENGINE='django.contrib.sessions.backends.cached_db'


使用Redis缓存session



  • 会话还支持文件、纯cookie、Memcached、Redis等方式存储,下面演示使用redis存储
  • 安装包


pip install django-redis-sessions


修改settings中的配置,增加如下项


SESSION_ENGINE = 'redis_sessions.session'
SESSION_REDIS_HOST = 'localhost'
SESSION_REDIS_PORT = 6379
SESSION_REDIS_DB = 0
SESSION_REDIS_PASSWORD = ''
SESSION_REDIS_PREFIX = 'session'


管理redis的命令



启动:sudo redis-server /etc/redis/redis.conf
停止:sudo redis-server stop
重启:sudo redis-server restart
redis-cli:使用客户端连接服务器
keys *:查看所有的键
get name:获取指定键的值
del name:删除指定名称的键
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
NoSQL 调度 Redis
33 Django高级 - celery
33 Django高级 - celery
48 0
|
8月前
|
Python 数据库 Linux
使用django创建和配置应用
【6月更文挑战第2天】本文介绍在Linux环境下,安装Python3和Django,创建名为`library`的项目。创建超级用户并注册应用到`admin.py`。配置URL路由,创建模板文件`book_list.html`展示书籍列表。访问查看结果,确保已更新`ALLOWED_HOSTS`。如果遇到问题,如admin访问错误,可运行管理 shell 调整站点设置。
61 0
|
9月前
|
Python
Django项目怎么关闭CFRS
Django项目怎么关闭CFRS
57 1
|
存储 缓存 安全
14-Django-基础篇-状态保持
14-Django-基础篇-状态保持
|
9月前
|
Python
如何快速创建一个Django项目
如何快速创建一个Django项目
55 0
|
Python
如何在 Django 中创建应用程序?
如何在 Django 中创建应用程序?
91 0
|
存储 缓存 NoSQL
17 Django视图 - 状态保持
17 Django视图 - 状态保持
48 0
|
SQL Shell 数据库
Django开发中常用的命令总结
Django开发中常用的命令总结
|
SQL 关系型数据库 MySQL
Django入门-2:创建第一个Django项目
Django入门-2:创建第一个Django项目
339 0
Django入门-2:创建第一个Django项目
|
存储 缓存 NoSQL
Django入门-6:视图-状态保持
Django入门-6:视图-状态保持
163 0