在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通过scapy获取局域网所有主机mac地址示例
May 04 Python
使用Python制作获取网站目录的图形化程序
May 04 Python
Python实现约瑟夫环问题的方法
May 03 Python
老生常谈Python基础之字符编码
Jun 14 Python
pycharm远程开发项目的实现步骤
Jan 20 Python
Python对ElasticSearch获取数据及操作
Apr 24 Python
Python爬取破解无线网络wifi密码过程解析
Sep 17 Python
python实现横向拼接图片
Mar 23 Python
安装多个版本的TensorFlow的方法步骤
Apr 21 Python
pycharm开发一个简单界面和通用mvc模板(操作方法图解)
May 27 Python
python中类与对象之间的关系详解
Dec 16 Python
在 Golang 中实现 Cache::remember 方法详解
Mar 30 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
用PHP实现WEB动态网页静态
2006/10/09 PHP
PHP配置心得包含MYSQL5乱码解决
2006/11/20 PHP
一个PHP操作Access类(PHP+ODBC+Access)
2007/01/02 PHP
php下目前为目最全的CURL中文说明
2010/08/01 PHP
写php分页时出现的Fatal error的解决方法
2011/04/18 PHP
phpmyadmin config.inc.php配置示例
2013/08/27 PHP
Thinkphp模板中截取字符串函数简介
2014/06/17 PHP
php 静态属性和静态方法区别详解
2017/04/09 PHP
js中浮点型运算BUG的解决方法说明
2014/01/06 Javascript
利用JQuery制作符合Web标准的QQ弹出消息
2014/01/14 Javascript
JavaScript实现点击文字切换登录窗口的方法
2015/05/11 Javascript
jQuery+PHP星级评分实现方法
2015/10/02 Javascript
2016年最热门的15 款代码语法高亮工具,美化你的代码
2016/01/06 Javascript
ajax的分页查询示例(不刷新页面)
2017/01/11 Javascript
微信小程序 增、删、改、查操作实例详解
2017/01/13 Javascript
老生常谈js-react组件生命周期
2017/05/02 Javascript
jQuery基于cookie实现换肤功能实例
2017/10/14 jQuery
vue 过滤器filter实例详解
2018/03/14 Javascript
vue-cli 组件的导入与使用教程详解
2018/04/11 Javascript
Node.js实现简单的爬取的示例代码
2019/06/25 Javascript
解决一个微信号同时支持多个环境网页授权问题
2019/08/07 Javascript
Vue SSR 即时编译技术的实现
2020/05/06 Javascript
linux系统使用python监测网络接口获取网络的输入输出
2014/01/15 Python
python获取标准北京时间的方法
2015/03/24 Python
实例说明Python中比较运算符的使用
2015/05/13 Python
浅谈Python中列表生成式和生成器的区别
2015/08/03 Python
Python实现模拟时钟代码推荐
2015/11/08 Python
python读取ini配置的类封装代码实例
2020/01/08 Python
Selenium及python实现滚动操作多种方法
2020/07/21 Python
bareMinerals官网:矿物质化妆品和护肤品
2018/02/04 全球购物
KARATOV珠宝在线商店:俄罗斯珠宝品牌
2019/03/13 全球购物
英国领先的在线鱼贩:The Fish Society
2020/08/12 全球购物
公务员的自我鉴定
2013/10/26 职场文书
《问银河》教学反思
2014/02/19 职场文书
奥巴马经典演讲稿
2014/09/13 职场文书
项目投资意向书范本
2015/05/09 职场文书