在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 相关文章推荐
python元组操作实例解析
Sep 23 Python
跟老齐学Python之使用Python查询更新数据库
Nov 25 Python
30分钟搭建Python的Flask框架并在上面编写第一个应用
Mar 30 Python
分享Python文本生成二维码实例
Jan 06 Python
详解Python中open()函数指定文件打开方式的用法
Jun 04 Python
Python爬取qq music中的音乐url及批量下载
Mar 23 Python
python Tcp协议发送和接收信息的例子
Jul 22 Python
Python迷宫生成和迷宫破解算法实例
Dec 24 Python
浅谈Python中的继承
Jun 19 Python
Python 如何定义匿名或内联函数
Aug 01 Python
利用Pycharm + Django搭建一个简单Python Web项目的步骤
Oct 22 Python
python里反向传播算法详解
Nov 22 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
基于数据库的在线人数,日访问量等统计
2006/10/09 PHP
mac下使用brew配置环境的步骤分享
2011/05/23 PHP
PHP中使用crypt()实现用户身份验证的代码
2012/09/05 PHP
php采集神器cURL使用方法详解
2016/02/19 PHP
在php的yii2框架中整合hbase库的方法
2018/09/20 PHP
Javascript 陷阱 window全局对象
2008/11/26 Javascript
基于jquery的Repeater实现代码
2010/07/17 Javascript
Js注册协议倒计时的小例子
2013/06/24 Javascript
javascript break指定标签打破多层循环示例
2014/01/20 Javascript
javascript函数重载解决方案分享
2014/02/19 Javascript
详解Javascript 装载和执行
2014/11/17 Javascript
jQuery中each()方法用法实例
2014/12/27 Javascript
javascript中Math.random()使用详解
2015/04/15 Javascript
jQuery实现Flash效果上下翻动的中英文导航菜单代码
2015/09/22 Javascript
jQuery实现form表单基于ajax无刷新提交方法详解
2015/12/08 Javascript
JavaScript中Number对象的toFixed() 方法详解
2016/09/02 Javascript
AngularJS通过ng-Img-Crop实现头像截取的示例
2017/08/17 Javascript
Vue2 监听属性改变watch的实例代码
2018/08/27 Javascript
浅析vue中的MVVM实现原理
2019/03/04 Javascript
如何从零开始手写Koa2框架
2019/03/22 Javascript
在vue项目中使用codemirror插件实现代码编辑器功能
2019/08/27 Javascript
Js实现粘贴上传图片的原理及示例
2020/12/09 Javascript
JavaScript 中的六种循环方法
2021/01/06 Javascript
python正则表达式re之compile函数解析
2017/10/25 Python
numpy实现合并多维矩阵、list的扩展方法
2018/05/08 Python
对Python闭包与延迟绑定的方法详解
2019/01/07 Python
python实现日志按天分割
2019/07/22 Python
CSS3属性box-shadow使用详细教程
2012/01/21 HTML / CSS
Reebonz中国官网:新加坡奢侈品购物网站
2017/03/17 全球购物
在印度上传处方,在线订购药品:Medlife
2019/03/28 全球购物
澳大利亚个性化儿童礼品网站:Bright Star Kids
2019/06/14 全球购物
数据库什么时候应该被重组
2012/11/02 面试题
2015年教学管理工作总结
2015/05/20 职场文书
婚礼双方父亲致辞
2015/07/27 职场文书
Vue ECharts实现机舱座位选择展示功能
2022/05/15 Vue.js
JS轻量级函数式编程实现XDM二
2022/06/16 Javascript