在Python的Django框架的视图中使用Session的方法


Posted in Python onJuly 23, 2015

SessionMiddleware 激活后,每个传给视图(view)函数的第一个参数``HttpRequest`` 对象都有一个 session 属性,这是一个字典型的对象。 你可以象用普通字典一样来用它。 例如,在视图(view)中你可以这样用:

# Set a session value:
request.session["fav_color"] = "blue"

# Get a session value -- this could be called in a different view,
# or many requests later (or both):
fav_color = request.session["fav_color"]

# Clear an item from the session:
del request.session["fav_color"]

# Check if the session has a given key:
if "fav_color" in request.session:
 ...

其他的映射方法,如 keys() 和 items() 对 request.session 同样有效:

下面是一些有效使用Django sessions的简单规则:

    用正常的字符串作为key来访问字典 request.session , 而不是整数、对象或其它什么的。

    Session字典中以下划线开头的key值是Django内部保留key值。 框架只会用很少的几个下划线 开头的session变量,除非你知道他们的具体含义,而且愿意跟上Django的变化,否则,最好 不要用这些下划线开头的变量,它们会让Django搅乱你的应用。

    比如,不要象这样使用`` _fav_color`` 会话密钥(session key):

request.session['_fav_color'] = 'blue' # Don't do this!

    不要用一个新对象来替换掉 request.session ,也不要存取其属性。 可以像Python中的字典那样使用。 例如:

request.session = some_other_object # Don't do this!

request.session.foo = 'bar' # Don't do this!

我们来看个简单的例子。 这是个简单到不能再简单的例子:在用户发了一次评论后将has_commented设置为True。 这是个简单(但不很安全)的、防止用户多次评论的方法。

def post_comment(request):
 if request.method != 'POST':
  raise Http404('Only POSTs are allowed')

 if 'comment' not in request.POST:
  raise Http404('Comment not submitted')

 if request.session.get('has_commented', False):
  return HttpResponse("You've already commented.")

 c = comments.Comment(comment=request.POST['comment'])
 c.save()
 request.session['has_commented'] = True
 return HttpResponse('Thanks for your comment!')

下面是一个很简单的站点登录视图(view):

def login(request):
 if request.method != 'POST':
  raise Http404('Only POSTs are allowed')
 try:
  m = Member.objects.get(username=request.POST['username'])
  if m.password == request.POST['password']:
   request.session['member_id'] = m.id
   return HttpResponseRedirect('/you-are-logged-in/')
 except Member.DoesNotExist:
  return HttpResponse("Your username and password didn't match.")

下面的例子将登出一个在上面已通过`` login()`` 登录的用户:

def logout(request):
 try:
  del request.session['member_id']
 except KeyError:
  pass
 return HttpResponse("You're logged out.")

注意

在实践中,这是很烂的用户登录方式,稍后讨论的认证(authentication )框架会帮你以更健壮和有利的方式来处理这些问题。 这些非常简单的例子只是想让你知道这一切是如何工作的。 这些实例尽量简单,这样你可以更容易看到发生了什么
设置测试Cookies

就像前面提到的,你不能指望所有的浏览器都可以接受cookie。 因此,为了使用方便,Django提供了一个简单的方法来测试用户的浏览器是否接受cookie。 你只需在视图(view)中调用 request.session.set_test_cookie(),并在后续的视图(view)、而不是当前的视图(view)中检查 request.session.test_cookie_worked() 。

虽然把 set_test_cookie() 和 test_cookie_worked() 分开的做法看起来有些笨拙,但由于cookie的工作方式,这无可避免。 当设置一个cookie时候,只能等浏览器下次访问的时候,你才能知道浏览器是否接受cookie。

检查cookie是否可以正常工作后,你得自己用 delete_test_cookie() 来清除它,这是个好习惯。 在你证实了测试cookie已工作了之后这样操作。

这是个典型例子:

def login(request):

 # If we submitted the form...
 if request.method == 'POST':

  # Check that the test cookie worked (we set it below):
  if request.session.test_cookie_worked():

   # The test cookie worked, so delete it.
   request.session.delete_test_cookie()

   # In practice, we'd need some logic to check username/password
   # here, but since this is an example...
   return HttpResponse("You're logged in.")

  # The test cookie failed, so display an error message. If this
  # were a real site, we'd want to display a friendlier message.
  else:
   return HttpResponse("Please enable cookies and try again.")

 # If we didn't post, send the test cookie along with the login form.
 request.session.set_test_cookie()
 return render_to_response('foo/login_form.html')

注意

再次强调,内置的认证函数会帮你做检查的。

 

Python 相关文章推荐
在Django的模板中使用认证数据的方法
Jul 23 Python
python获取当前用户的主目录路径方法(推荐)
Jan 12 Python
Python如何生成树形图案
Jan 03 Python
Python实现的用户登录系统功能示例
Feb 05 Python
利用TensorFlow训练简单的二分类神经网络模型的方法
Mar 05 Python
对python3新增的byte类型详解
Dec 04 Python
Django使用消息提示简单的弹出个对话框实例
Nov 15 Python
Pycharm远程连接服务器并实现代码同步上传更新功能
Feb 25 Python
python opencv实现图片缺陷检测(讲解直方图以及相关系数对比法)
Apr 07 Python
在keras中model.fit_generator()和model.fit()的区别说明
Jun 17 Python
记一次Django响应超慢的解决过程
Sep 17 Python
python实现MySQL指定表增量同步数据到clickhouse的脚本
Feb 26 Python
详解Python的Django框架中的Cookie相关处理
Jul 22 #Python
在Django中使用Sitemap的方法讲解
Jul 22 #Python
用Python的Django框架来制作一个RSS阅读器
Jul 22 #Python
利用Python的Django框架生成PDF文件的教程
Jul 22 #Python
在Python的Django框架中生成CSV文件的方法
Jul 22 #Python
在主机商的共享服务器上部署Django站点的方法
Jul 22 #Python
在Lighttpd服务器中运行Django应用的方法
Jul 22 #Python
You might like
S900/ ETON E1-XM 收音机
2021/03/02 无线电
PHP入门
2006/10/09 PHP
PHP原生模板引擎 最简单的模板引擎
2012/04/25 PHP
php获取目标函数执行时间示例
2014/03/04 PHP
php格式文件打开的四种方法
2018/02/24 PHP
thinkphp5.1 文件引入路径问题及注意事项
2018/06/13 PHP
Laravel 自带的Auth验证登录方法
2019/09/30 PHP
escape、encodeURI 和 encodeURIComponent 的区别
2009/03/02 Javascript
深入理解JavaScript系列(41):设计模式之模板方法详解
2015/03/04 Javascript
JavaScript通过select动态更换图片的方法
2015/03/23 Javascript
JavaScript基本语法学习教程
2016/01/14 Javascript
原生JS实现-星级评分系统的简单实例
2016/08/21 Javascript
Vue.js每天必学之方法与事件处理器
2016/09/06 Javascript
利用vscode编写vue的简单配置详解
2017/06/17 Javascript
vue项目优化之通过keep-alive数据缓存的方法
2017/12/11 Javascript
javascript与PHP动态往类中添加方法对比
2018/03/21 Javascript
layui表格 列自动适应大小失效的解决方法
2019/09/06 Javascript
JS实现简单tab选项卡切换
2019/10/25 Javascript
JS highcharts动态柱状图原理及实现
2020/10/16 Javascript
浅谈Vue static 静态资源路径 和 style问题
2020/11/07 Javascript
[08:29]DOTA2每周TOP10 精彩击杀集锦vol.7
2014/06/25 DOTA
python django 增删改查操作 数据库Mysql
2017/07/27 Python
Python2.7 实现引入自己写的类方法
2018/04/29 Python
pycharm创建scrapy项目教程及遇到的坑解析
2019/08/15 Python
解决python DataFrame 打印结果不换行问题
2020/04/09 Python
基于Keras的格式化输出Loss实现方式
2020/06/17 Python
AmazeUI框架搭建的方法步骤(图文)
2020/08/17 HTML / CSS
size?瑞典:英国伦敦的球鞋精品店
2018/03/01 全球购物
俄罗斯电子产品在线商店:UltraTrade
2020/01/30 全球购物
nohup的用法
2014/08/10 面试题
股东合作协议书
2014/04/14 职场文书
医疗器械售后服务承诺书
2014/05/21 职场文书
运动员获奖感言
2014/08/15 职场文书
运动会演讲稿200字
2014/08/25 职场文书
任命书格式范文
2015/09/22 职场文书
JavaScript前端面试扁平数据转tree与tree数据扁平化
2022/06/14 Javascript