详解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之集合(set)
Sep 24 Python
在Python的Django框架的视图中使用Session的方法
Jul 23 Python
Python内存管理方式和垃圾回收算法解析
Nov 11 Python
python生成lmdb格式的文件实例
Nov 08 Python
scrapy-redis的安装部署步骤讲解
Feb 27 Python
Python使用到第三方库PyMuPDF图片与pdf相互转换
May 03 Python
python 对字典按照value进行排序的方法
May 09 Python
pyqt5 使用label控件实时显示时间的实例
Jun 14 Python
如何使用Python自动控制windows桌面
Jul 11 Python
python使用turtle库绘制奥运五环
Feb 24 Python
Python读取配置文件(config.ini)以及写入配置文件
Apr 08 Python
将pymysql获取到的数据类型是tuple转化为pandas方式
May 15 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之PHP语法学习笔记1
2006/12/17 PHP
php 数组的指针操作实现代码
2011/02/08 PHP
PHP中对于浮点型的数据需要用不同的方法解决
2014/03/11 PHP
浅谈php错误提示及查错方法
2015/07/14 PHP
浅谈PHP值mysql操作类
2016/06/29 PHP
Yii2中cookie用法示例分析
2016/07/18 PHP
PHP基于方差和标准差计算学生成绩的稳定性示例
2017/07/04 PHP
php实现微信发红包功能
2018/07/13 PHP
详解laravel安装使用Passport(Api认证)
2018/07/27 PHP
PHP PDOStatement::setFetchMode讲解
2019/02/03 PHP
PHP自动生成缩略图函数的源码示例
2019/03/18 PHP
JavaScript中的对象序列化介绍
2014/12/30 Javascript
jQuery实现鼠标滚轮动态改变样式或效果
2015/01/05 Javascript
基于vuejs+webpack的日期选择插件
2020/05/21 Javascript
浅谈jquery选择器 :first与:first-child的区别
2016/11/20 Javascript
JS设计模式之观察者模式实现实时改变页面中金额数的方法
2018/02/05 Javascript
vue判断input输入内容全是空格的方法
2018/03/02 Javascript
Vue中的scoped实现原理及穿透方法
2018/05/15 Javascript
jQuery+CSS实现的标签页效果示例【测试可用】
2018/08/14 jQuery
超轻量级的js时间库miment使用解析
2019/08/02 Javascript
解决vue打包后刷新页面报错:Unexpected token
2019/08/27 Javascript
Vue分页插件的前后端配置与使用
2019/10/09 Javascript
微信小程序实现watch监听
2020/06/04 Javascript
[01:02]DOTA2上海特锦赛SHOWOPEN
2016/03/25 DOTA
python中defaultdict的用法详解
2017/06/07 Python
pandas数据分组和聚合操作方法
2018/04/11 Python
python随机在一张图像上截取任意大小图片的方法
2019/01/24 Python
Python中url标签使用知识点总结
2020/01/16 Python
联想韩国官网:Lenovo Korea
2018/05/10 全球购物
俄罗斯隐形眼镜和眼镜在线商店:Cronos
2020/06/02 全球购物
英国鲜花递送:Blossoming Gifts
2020/07/10 全球购物
领导失职检讨书
2014/02/24 职场文书
烹饪大赛策划方案
2014/05/26 职场文书
南京青奥会口号
2014/06/12 职场文书
伊索寓言读书笔记
2015/06/30 职场文书
导游词之湖州-太湖
2019/10/11 职场文书