在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实现在线程里运行scrapy的方法
Apr 07 Python
Python解惑之整数比较详解
Apr 24 Python
Python金融数据可视化汇总
Nov 17 Python
python如何使用socketserver模块实现并发聊天
Dec 14 Python
Pycharm内置终端及远程SSH工具的使用教程图文详解
Mar 19 Python
哪些是python中web开发框架
Jun 17 Python
Python实现删除某列中含有空值的行的示例代码
Jul 20 Python
Numpy实现卷积神经网络(CNN)的示例
Oct 09 Python
如何用Python提取10000份log中的产品信息
Jan 14 Python
Python列表的深复制和浅复制示例详解
Feb 12 Python
Django 如何实现文件上传下载
Apr 08 Python
Python中OpenCV实现简单车牌字符切割
Jun 11 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
BBS(php & mysql)完整版(二)
2006/10/09 PHP
PHP 存储文本换行实现方法
2010/01/05 PHP
微信公众号开发客服接口实例代码
2016/10/21 PHP
php解析mht文件转换成html的实例
2017/03/13 PHP
Jquery实现无刷新DropDownList联动实现代码
2010/03/08 Javascript
各情景下元素宽高的获取实现代码
2011/09/13 Javascript
JavaScript遍历table表格中的某行某列并打印其值
2014/07/08 Javascript
使用JQuery实现的分页插件分享
2015/11/05 Javascript
jQuery遍历DOM节点操作之filter()方法详解
2016/04/14 Javascript
js简单获取表单中单选按钮值的方法
2016/08/23 Javascript
js正则表达式最长匹配(贪婪匹配)和最短匹配(懒惰匹配)用法分析
2016/12/27 Javascript
使用AngularJS2中的指令实现按钮的切换效果
2017/03/27 Javascript
React Native中导航组件react-navigation跨tab路由处理详解
2017/10/31 Javascript
Angular利用内容投射向组件输入ngForOf模板的方法
2018/03/05 Javascript
WebPack配置vue多页面的技巧
2018/05/15 Javascript
详解Express笔记之动态渲染HTML(新手入坑)
2018/12/13 Javascript
Vue安装浏览器开发工具的步骤详解
2019/05/12 Javascript
jQuery实现鼠标拖拽登录框移动效果
2020/09/13 jQuery
[30:51]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#1Liquid VS MVP.Phx第一局
2016/03/04 DOTA
在Python中使用dict和set方法的教程
2015/04/27 Python
基于python实现雪花算法过程详解
2019/11/16 Python
python通过移动端访问查看电脑界面
2020/01/06 Python
TensorFlow tensor的拼接实例
2020/01/19 Python
解决python图像处理图像赋值后变为白色的问题
2020/06/04 Python
如何在vscode中安装python库的方法步骤
2021/01/06 Python
加拿大女包品牌:Matt & Nat
2017/05/12 全球购物
Nip + Fab官网:英国美容品牌
2019/08/26 全球购物
竞选演讲稿范文
2013/12/28 职场文书
遥感技术与仪器求职信
2014/02/22 职场文书
环保倡议书300字
2014/05/15 职场文书
社区领导班子四风问题原因分析及整改措施
2014/09/28 职场文书
2014幼儿园保育员工作总结
2014/11/10 职场文书
护士求职简历自我评价
2015/03/10 职场文书
军训新闻稿范文
2015/07/17 职场文书
Java框架入门之简单介绍SpringBoot框架
2021/06/18 Java/Android
详解Java实践之适配器模式
2021/06/18 Java/Android