在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实现每次处理一个字符的三种方法
Oct 09 Python
Linux下编译安装MySQL-Python教程
Feb 02 Python
在Python中使用全局日志时需要注意的问题
May 06 Python
Python中的探索性数据分析(功能式)
Dec 22 Python
Python断言assert的用法代码解析
Feb 03 Python
在PyCharm中三步完成PyPy解释器的配置的方法
Oct 29 Python
Python实现的IP端口扫描工具类示例
Feb 15 Python
PyQt5重写QComboBox的鼠标点击事件方法
Jun 25 Python
详解python statistics模块及函数用法
Oct 27 Python
浅谈python print(xx, flush = True) 全网最清晰的解释
Feb 21 Python
30行Python代码实现高分辨率图像导航的方法
May 22 Python
Python实现寻找回文数字过程解析
Jun 09 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
简单实现限定phpmyadmin访问ip的方法
2013/03/05 PHP
手把手教你打印出PDF(关于fpdf的简单应用)
2013/06/25 PHP
php中的比较运算符详解
2013/10/28 PHP
ThinkPHP3.1新特性之多数据库操作更加完善
2014/06/19 PHP
在Mac OS上搭建PHP的Yii框架及相关测试环境
2016/02/14 PHP
Zend Framework动作助手Url用法详解
2016/03/05 PHP
总结PHP中DateTime的常用方法
2016/08/11 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
2017/09/22 PHP
firefox下jquery iframe刷新页面提示会导致重复之前动作
2012/12/17 Javascript
Jquery如何实现点击时高亮显示代码
2014/01/22 Javascript
JavaScript来实现打开链接页面的简单实例
2016/06/02 Javascript
JavaScript之WebSocket技术详解
2016/11/18 Javascript
Angular2 PrimeNG分页模块学习
2017/01/14 Javascript
js分页之前端代码实现和请求处理
2017/08/04 Javascript
js HTML5 canvas绘制图片的方法
2017/09/08 Javascript
node前端模板引擎Jade之标签的基本写法
2018/05/11 Javascript
jQuery实现的中英文切换功能示例
2019/01/11 jQuery
mpvue实现微信小程序快递单号查询代码
2020/04/03 Javascript
vue 如何使用递归组件
2020/10/23 Javascript
Python实现的排列组合计算操作示例
2017/10/13 Python
opencv-python 读取图像并转换颜色空间实例
2019/12/09 Python
python实现翻译word表格小程序
2020/02/27 Python
英国第一蛋白粉品牌:Myprotein
2016/09/14 全球购物
Europcar西班牙:全球汽车租赁领域的领导者
2018/09/17 全球购物
如何用Python输出一个Fibonacci数列
2016/08/28 面试题
接受捐赠答谢词
2014/01/27 职场文书
《雨霖铃》教学反思
2014/02/22 职场文书
《生命 生命》教学反思
2014/04/19 职场文书
护理专业毕业生自荐书
2014/05/24 职场文书
承诺书样本
2014/08/30 职场文书
个人批评与自我批评范文
2014/10/17 职场文书
破坏寝室公物检讨书
2014/11/17 职场文书
幼儿园辞职书
2015/02/26 职场文书
2015年业务工作总结范文
2015/04/10 职场文书
nginx 多个location转发任意请求或访问静态资源文件的实现
2021/03/31 Servers
java Nio使用NioSocket客户端与服务端交互实现方式
2021/06/15 Java/Android