详解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和shell变量互相传递的几种方法
Nov 20 Python
Python标准库之随机数 (math包、random包)介绍
Nov 25 Python
理解Python中的With语句
Mar 18 Python
详解Python函数作用域的LEGB顺序
May 14 Python
深入理解Django中内置的用户认证
Oct 06 Python
一篇文章读懂Python赋值与拷贝
Apr 19 Python
python 获取页面表格数据存放到csv中的方法
Dec 26 Python
python实现QQ空间自动点赞功能
Apr 09 Python
Python 绘制酷炫的三维图步骤详解
Jul 12 Python
Python性能分析工具Profile使用实例
Nov 19 Python
Python3并发写文件与Python对比
Nov 20 Python
如何在Python对Excel进行读取
Jun 04 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
PHP新手上路(十四)
2006/10/09 PHP
深入mysql_fetch_row()与mysql_fetch_array()的区别详解
2013/06/05 PHP
thinkphp中AJAX返回ajaxReturn()方法分析
2016/12/06 PHP
深入理解PHP中mt_rand()随机数的安全
2017/10/12 PHP
事件冒泡是什么如何用jquery阻止事件冒泡
2013/03/20 Javascript
Flexigrid在IE下不显示数据的处理的解决方法
2013/10/24 Javascript
jquery实现的树形目录实例
2015/06/26 Javascript
Bootstrap和Java分页实例第一篇
2016/12/23 Javascript
jQuery弹出窗口简单实现代码
2017/03/09 Javascript
vue.js删除动态绑定的radio的指定项
2017/06/02 Javascript
node.js实现的装饰者模式示例
2017/09/06 Javascript
vue、react等单页面项目应该这样子部署到服务器
2018/01/03 Javascript
详解vue-meta如何让你更优雅的管理头部标签
2018/01/18 Javascript
微信小程序实现即时通信聊天功能的实例代码
2018/08/17 Javascript
微信小程序实现的3d轮播图效果示例【基于swiper组件】
2018/12/11 Javascript
javascript将16进制的字符串转换为10进制整数hex
2020/03/05 Javascript
[55:11]完美世界DOTA2联赛PWL S2 SZ vs LBZS 第一场 11.26
2020/11/30 DOTA
python中while循环语句用法简单实例
2015/05/07 Python
简单谈谈python中的lambda表达式
2018/01/19 Python
Python生成器以及应用实例解析
2018/02/08 Python
python实现RabbitMQ的消息队列的示例代码
2018/11/08 Python
python2.7实现邮件发送功能
2018/12/12 Python
Django接收照片储存文件的实例代码
2020/03/07 Python
如何在windows下安装Pycham2020软件(方法步骤详解)
2020/05/03 Python
Keras在训练期间可视化训练误差和测试误差实例
2020/06/16 Python
如何利用python生成MD5并去重
2020/12/07 Python
检测浏览器是否支持html5视频的代码
2013/03/28 HTML / CSS
处理HTML5新标签的浏览器兼容版问题
2017/03/13 HTML / CSS
Bealls Florida百货商店:生活服饰、家居装饰和鞋子
2018/02/23 全球购物
节省高达65%的城市景点费用:Go City
2019/07/06 全球购物
2013年保送生自荐信格式
2013/11/20 职场文书
水毁工程实施方案
2014/04/01 职场文书
优秀语文教师事迹
2014/05/18 职场文书
教师实习自我鉴定总结
2019/08/20 职场文书
CSS完成视差滚动效果
2021/04/27 HTML / CSS
spring boot中nativeQuery的用法
2021/07/26 Java/Android