详解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使用循环实现批量创建文件夹示例
Mar 25 Python
用Python代码来解图片迷宫的方法整理
Apr 02 Python
详解在Python和IPython中使用Docker
Apr 28 Python
python获取文件扩展名的方法
Jul 06 Python
Python实现桶排序与快速排序算法结合应用示例
Nov 22 Python
使用python获取(宜宾市地震信息)地震信息
Jun 20 Python
Python多版本开发环境管理工具介绍
Jul 03 Python
Tensorflow模型实现预测或识别单张图片
Jul 19 Python
Python字典的概念及常见应用实例详解
Oct 30 Python
django 装饰器 检测登录状态操作
Jul 02 Python
python中判断数字是否为质数的实例讲解
Dec 06 Python
python推导式的使用方法实例
Feb 28 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+jQuery 注册模块开发详解
2014/10/14 PHP
PHP比你想象的好得多
2014/11/27 PHP
php实现的简单美国商品税计算函数
2015/07/13 PHP
PHP微信刮刮卡 附微信接口
2016/07/22 PHP
tp5(thinkPHP5框架)时间查询操作实例分析
2019/05/29 PHP
javascript比较文档位置
2008/04/08 Javascript
JQuery中each()的使用方法说明
2010/08/19 Javascript
ExtJS4 组件化编程,动态加载,面向对象,Direct
2011/05/12 Javascript
JS弹出窗口代码大全(详细整理)
2012/12/21 Javascript
jQuery中用dom操作替代正则表达式
2014/12/29 Javascript
JavaScript实现添加及删除事件的方法小结
2015/08/04 Javascript
JavaScript使用FileSystemObject对象写入文本文件内容的方法
2015/08/05 Javascript
JS简单模拟触发按钮点击功能的方法
2015/11/30 Javascript
原生js配合cookie制作保存路径的拖拽
2015/12/29 Javascript
JavaScript数据存储 Cookie篇
2016/07/02 Javascript
ie下js不执行的几种可能
2017/02/28 Javascript
Omi v1.0.2发布正式支持传递javascript表达式
2017/03/21 Javascript
Vue组件模板形式实现对象数组数据循环为树形结构(实例代码)
2017/07/31 Javascript
JS一个简单的注册页面实例
2017/09/05 Javascript
Javascript 严格模式use strict详解
2017/09/16 Javascript
解决vue-cli3 使用子目录部署问题
2018/07/19 Javascript
Vue数据双向绑定的深入探究
2018/11/27 Javascript
[02:08]2018年度CS GO枪械皮肤设计大赛优秀作者-完美盛典
2018/12/16 DOTA
简单讲解Python编程中namedtuple类的用法
2016/06/21 Python
Python将文本去空格并保存到txt文件中的实例
2018/07/24 Python
Django 对IP访问频率进行限制的例子
2019/08/30 Python
使用HTML和CSS3绘制基本卡通图案的示例分享
2015/11/06 HTML / CSS
控制工程专业个人求职信
2013/09/25 职场文书
银行门卫岗位职责
2013/12/29 职场文书
自我鉴定书面格式
2014/01/13 职场文书
五年级英语教学反思
2014/01/31 职场文书
教职工代表大会主持词
2014/04/01 职场文书
党员“四风”方面存在问题及整改措施
2014/09/24 职场文书
幼儿园端午节活动总结
2015/05/05 职场文书
导游词之河姆渡遗址博物馆
2019/10/10 职场文书
Java实现简单小画板
2022/06/10 Java/Android