详解Django中Request对象的相关用法


Posted in Python onJuly 17, 2015

从Request对象中获取数据

我们在第三章讲述View的函数时已经介绍过HttpRequest对象了,但当时并没有讲太多。 让我们回忆下:每个view函数的第一个参数是一个HttpRequest对象,就像下面这个hello()函数:

from django.http import HttpResponse

def hello(request):
  return HttpResponse("Hello world")

HttpRequest对象,比如上面代码里的request变量,会有一些有趣的、你必须让自己熟悉的属性和方法,以便知道能拿它们来做些什么。 在view函数的执行过程中,你可以用这些属性来获取当前request的一些信息(比如,你正在加载这个页面的用户是谁,或者用的是什么浏览器)。
URL相关信息

HttpRequest对象包含当前请求URL的一些信息:

详解Django中Request对象的相关用法

在view函数里,要始终用这个属性或方法来得到URL,而不要手动输入。 这会使得代码更加灵活,以便在其它地方重用。 下面是一个简单的例子:

# BAD!
def current_url_view_bad(request):
  return HttpResponse("Welcome to the page at /current/")

# GOOD
def current_url_view_good(request):
  return HttpResponse("Welcome to the page at %s" % request.path)

有关request的其它信息

request.META 是一个Python字典,包含了所有本次HTTP请求的Header信息,比如用户IP地址和用户Agent(通常是浏览器的名称和版本号)。 注意,Header信息的完整列表取决于用户所发送的Header信息和服务器端设置的Header信息。 这个字典中几个常见的键值有:

  •     HTTP_REFERER,进站前链接网页,如果有的话。 (请注意,它是REFERRER的笔误。)
  •     HTTP_USER_AGENT,用户浏览器的user-agent字符串,如果有的话。 例如: "Mozilla/5.0 (X11; U; Linux i686; fr-FR; rv:1.8.1.17) Gecko/20080829 Firefox/2.0.0.17" .
  •     REMOTE_ADDR 客户端IP,如:"12.345.67.89" 。(如果申请是经过代理服务器的话,那么它可能是以逗号分割的多个IP地址,如:"12.345.67.89,23.456.78.90" 。)

注意,因为 request.META 是一个普通的Python字典,因此当你试图访问一个不存在的键时,会触发一个KeyError异常。 (HTTP header信息是由用户的浏览器所提交的、不应该给予信任的“额外”数据,因此你总是应该好好设计你的应用以便当一个特定的Header数据不存在时,给出一个优雅的回应。)你应该用 try/except 语句,或者用Python字典的 get() 方法来处理这些“可能不存在的键”:

# BAD!
def ua_display_bad(request):
  ua = request.META['HTTP_USER_AGENT'] # Might raise KeyError!
  return HttpResponse("Your browser is %s" % ua)

# GOOD (VERSION 1)
def ua_display_good1(request):
  try:
    ua = request.META['HTTP_USER_AGENT']
  except KeyError:
    ua = 'unknown'
  return HttpResponse("Your browser is %s" % ua)

# GOOD (VERSION 2)
def ua_display_good2(request):
  ua = request.META.get('HTTP_USER_AGENT', 'unknown')
  return HttpResponse("Your browser is %s" % ua)

我们鼓励你动手写一个简单的view函数来显示 request.META 的所有数据,这样你就知道里面有什么了。 这个view函数可能是这样的:

def display_meta(request):
  values = request.META.items()
  values.sort()
  html = []
  for k, v in values:
    html.append('<tr><td>%s</td><td>%s</td></tr>' % (k, v))
  return HttpResponse('<table>%s</table>' % '\n'.join(html))

做为一个练习,看你自己能不能把上面这个view函数改用Django模板系统来实现,而不是上面这样来手动输入HTML代码。 也可以试着把前面提到的 request.path 方法或 HttpRequest 对象的其它方法加进去。

Python 相关文章推荐
Python实现的数据结构与算法之快速排序详解
Apr 22 Python
python下MySQLdb用法实例分析
Jun 08 Python
Python实现爬取马云的微博功能示例
Feb 16 Python
Python操作rabbitMQ的示例代码
Mar 19 Python
django表单的Widgets使用详解
Jul 22 Python
在django中实现页面倒数几秒后自动跳转的例子
Aug 16 Python
python使用python-pptx删除ppt某页实例
Feb 14 Python
python实现Oracle查询分组的方法示例
Apr 30 Python
pycharm中使用request和Pytest进行接口测试的方法
Jul 31 Python
Python爬取股票信息,并可视化数据的示例
Sep 26 Python
python实现三次密码验证的示例
Apr 29 Python
浅谈Python中对象是如何被调用的
Apr 06 Python
Python实现SVN的目录周期性备份实例
Jul 17 #Python
Python的Django框架中设置日期和字段可选的方法
Jul 17 #Python
Python的Django框架下管理站点的基本方法
Jul 17 #Python
Django中更新多个对象数据与删除对象的方法
Jul 17 #Python
Django框架中数据的连锁查询和限制返回数据的方法
Jul 17 #Python
Django中对数据查询结果进行排序的方法
Jul 17 #Python
在Python的Django框架中获取单个对象数据的简单方法
Jul 17 #Python
You might like
MSN消息提示类
2006/09/05 Javascript
为数据添加append,remove功能
2006/10/03 Javascript
url地址自动加#号问题说明
2010/08/21 Javascript
ASP.NET jQuery 实例5 (显示CheckBoxList成员选中的内容)
2012/01/13 Javascript
javascript垃圾收集机制与内存泄漏详细解析
2013/11/11 Javascript
JQuery中serialize() 序列化
2015/03/13 Javascript
开启BootStrap学习之旅
2016/05/04 Javascript
Bootstrap基本布局实现方法详解
2016/11/25 Javascript
Bootstrap禁用响应式布局的实现方法
2017/03/09 Javascript
Require.JS中的几种define定义方式示例
2017/06/01 Javascript
详解Angular4中路由Router类的跳转navigate
2017/06/09 Javascript
BootStrap下的弹出框加载select2框架失败的解决方法
2017/08/31 Javascript
vue.js 底部导航栏 一级路由显示 子路由不显示的解决方法
2018/03/09 Javascript
weui上传多图片,压缩,base64编码的示例代码
2020/06/22 Javascript
[56:46]Liquid vs IG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
使用Python操作excel文件的实例代码
2017/10/15 Python
Python实现随机生成手机号及正则验证手机号的方法
2018/04/25 Python
Python matplotlib的使用并自定义colormap的方法
2018/12/13 Python
python初学者,用python实现基本的学生管理系统(python3)代码实例
2019/04/10 Python
PYQT5实现控制台显示功能的方法
2019/06/25 Python
python简单实现矩阵的乘,加,转置和逆运算示例
2019/07/10 Python
python爬虫 批量下载zabbix文档代码实例
2019/08/21 Python
python 3.7.4 安装 opencv的教程
2019/10/10 Python
Python.append()与Python.expand()用法详解
2019/12/18 Python
Python reduce函数作用及实例解析
2020/05/08 Python
pytorch 多分类问题,计算百分比操作
2020/07/09 Python
NFL加拿大官方网上商店:NHLShop.ca
2019/03/12 全球购物
俄罗斯金苹果网上化妆品和香水商店:Goldapple
2019/12/01 全球购物
试述DBMS的主要功能
2016/11/13 面试题
Linux面试题LINUX系统类
2014/11/19 面试题
成人大专自我鉴定范文
2013/10/19 职场文书
医务人员自我评价
2014/01/26 职场文书
差生评语大全
2014/05/04 职场文书
学校募捐倡议书
2014/05/14 职场文书
2015中秋节晚会主持词
2015/07/01 职场文书
《最终幻想14》6.01版本4月5日推出 追加新任务新道具
2022/04/03 其他游戏