经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Redis » 查看文章
django之状态保持-使用redis存储session的例子
来源:jb51  时间:2019/7/29 8:48:24  对本文有异议

关于redis安装,pip install django-redis-sessions,按照提示进行安装相关的服务端

和客户端.

django版本1.8.2, Python版本2.7.12

1 进入虚拟环境h1

  1. workon h1

2 创建一个项目test应用booktest

  1. django-admin startproject test

3 创建应用booktest

  1. 进入项目test目录,创建应用booktest,这个booktest应用目录和manage.py
  2.  
  3. 同级目录下
  4.  
  5. python manage.py startapp booktest

4 定义一个session1视图来匹配url /booktest/session1/时,使用templates/booktest

目录下的,模板session1.html来展示页面.

1 视图session1的代码如下:

  1. from django.shortcuts import render
  2.  
  3.  
  4. def session1(request):
  5.  
  6. uname = None
  7.  
  8. context = {'uname':uname}
  9.  
  10. return render(request, 'booktest/session1.html', context)
  11.  

2 配置url

1 根级url配置文件test/urls.py代码如下:

  1. from django.conf.urls import include, url
  2. from django.contrib import admin
  3.  
  4. urlpatterns = [
  5.  
  6. url(r'^admin/', include(admin.site.urls)),
  7.  
  8. url(r'^booktest/', include('booktest.urls')),
  9.  
  10. ]

2 应用booktest下面的url配置文件booktest/urls.py代码如下:

  1. from django.conf.urls import url
  2. import views
  3.  
  4.  
  5. urlpatterns = [
  6.  
  7. url(r'^session1/$', views.session1),
  8.  
  9. ]

5 创建模板并进行设置路径,在项目目录test下面新建一个templates目录作为模板目录

,在templates目录下面创建booktest目录,在booktest目录下面创建一个模板文件

session1.html,

1 模板session1.html里面的body代码如下:

  1. 你好:{{uname}}
  2. <br>
  3. <a href="/booktest/session2/" rel="external nofollow" >登录</a>
  4. <br>
  5. <a href="/booktest/session3/" rel="external nofollow" >退出</a>

2 对模板在settings.py进行路径设置

  1. 'DIRS': [os.path.join(BASE_DIR, 'templates')],

6 此时可以进行开发测试 ,终端输入python manage.py runserver,按住ctrl键的同时

点击 http://127.0.0.1:8000进入一个页面,在浏览器输入以下url http://127.0.0.1:8000/booktest/session1/ 回车后结果如下

  1. 你好:None
  2. 登录
  3. 退出

7 创建点击登录链接对应的视图session2及对url进行配置

  1. 1 视图session2代码如下:
  2.  
  3. def session2(request):
  4.  
  5. return render(request, 'booktest/session2.html')
  6.  
  7. 2 booktest/urls.py的应用url配置,添加如下代码:
  8.  
  9. url(r'^session2/$', views.session2),
  10.  
  11. 3 templates/booktest目录下创建登录表单对应的模板文件session2.html
  12.  
  13. body代码如下:
  14.  
  15. <form action="/booktest/session2_handle/" method="post">
  16.  
  17. 用户名: <input type="text" name="uname">
  18. <br>
  19. <input type="submit" value="提交">
  20. </form>
  21.  

8 点击登录链接,进入表单页面,填写用户名提交,发现会以下报错:

  1. 1 OperationalError at /booktest/session2_handle/
  2. no such table: django_session
  3.  
  4. 解决办法:在test/settins.py添加以下代码,以保证session数据保存到redis
  5.  
  6. # SESSION_ENGINE = 'redis_sessions.session'
  7. # SESSION_REDIS_HOST = 'localhost'
  8. # SESSION_REDIS_PORT = '6379'
  9. # SESSION_REDIS_DB = '0'
  10. # SESSION_REDIS_PASSWORD = ''
  11. # SESSION_REDIS_PREFIX = 'session'
  12.  
  13. 使用django-admin startproject test默认会开启session.
  14.  
  15.  
  16.  
  17. 2 Forbidden (403)
  18.  
  19. CSRF verification failed. Request aborted.
  20.  
  21. 解决方法:在test/settins.py里面把 MIDDLEWARE_CLASSES的值里面以下代码注释
  22.  
  23. 'django.middleware.csrf.CsrfViewMiddleware',

9 创建对表单提交处理的视图session2_handle,并进行相关的url配置

1 session2_handle视图代码如下,要导入redirect

  1. from django.shortcuts import redirect
  2.  
  3. def session2_handle(request):
  4.  
  5. uname = request.POST['uname']
  6.  
  7. request.session['myname'] = uname
  8.  
  9. return redirect('/booktest/session1/')
  10.  
  11. 由于http协议是无状态的,所以利用session来完成状态保持,把表单里面
  12.  
  13. 用户名输入的值赋值给类字典对象request.session里面的键 'myname'
  14.  
  15. 修改视图session2对应的代码,把session类字典里面的键赋值给uname,使用
  16.  
  17. get方法可以避免uname = request.session['maname']在点击退出时报错.
  18.  
  19. KeyError at /booktest/session1/
  20. 'myname'
  21.  
  22. uname = request.session.get('myname', '未登录')

2 booktest应用下的视图session2_handel对应的url配置如下

  1. url(r'^session2_handle/$', views.session2_handle),

10 创建点击退出链接对应的视图session3,并对相关的url进行配置

  1. 1 视图session3代码如下,作用删除session回话,并重定向到/booktest/session1/
  2.  
  3. def session3(request):
  4.  
  5. del request.session['myname']
  6.  
  7. return redirect('/booktest/session1/')
  8.  
  9. 2 应用下视图session3对应的url配置如下:
  10.  
  11. url(r'^session3', views.session3)

11 终端输入python manage.py runserver 进行开发测试

1 当输入url是http://127.0.0.1:8000/booktest/session1/时 ,显示如下

  1. 你好:未登录
  2. 登录
  3. 退出

2 点击登录链接,进入到表单页面http://127.0.0.1:8000/booktest/session2/

  1. 用户名:
  2. 提交

3 输入用户名ff,点击提交按钮,则重定向到

  1. http://127.0.0.1:8000/booktest/session1/
  2.  
  3. 你好:ff
  4. 登录
  5. 退出

4 点击退出链接,也重定向到/booktest/session1/对应的页面,同时删除会话

  1. 你好:未登录
  2. 登录
  3. 退出

5 在redis观察session类字典里面的键值对

  1. sudo service redis-server start
  2.  
  3. sudo ps ajx|grep redis
  4.  
  5. redis-cli
  6.  
  7. keys * 查看所有的键
  8.  
  9. get 'myname' 查看键myname对应值,
  10.  
  11. get mcp20n5r2lcbzb1rqjw2mpqe2lakjnpc
  12.  
  13. 查看该键对应的值如下,拿到在线base64进行解码,即可
  14.  
  15. "NzI4MzA2MmJlY2UxOWI2YWFlNjc2ZWZjMTY3NDE0OTJiMWFlMzgyNTp7Im15bmFtZSI6ImZmIn0="
  16.  
  17. 解码后7283062bece19b6aae676efc16741492b1ae3825:{"myname":"ff"}
  18.  
  19. 由此可见,可以使用redis来存储session,可以实现http状态保持.

以上这篇django之状态保持-使用redis存储session的例子就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号