详解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实现从web抓取文档的方法
Sep 26 Python
Python实现抓取城市的PM2.5浓度和排名
Mar 19 Python
Python自定义scrapy中间模块避免重复采集的方法
Apr 07 Python
解析Python中的二进制位运算符
May 13 Python
使用DataFrame删除行和列的实例讲解
Apr 08 Python
Pandas 对Dataframe结构排序的实现方法
Apr 10 Python
基于python指定包的安装路径方法
Oct 27 Python
使用python进行拆分大文件的方法
Dec 10 Python
python实现维吉尼亚算法
Mar 20 Python
openCV提取图像中的矩形区域
Jul 21 Python
Django migrate报错的解决方案
May 20 Python
Python实现Hash算法
Mar 18 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使用PDO操作MySQL数据库实例
2014/12/30 PHP
PHP7新特性之抽象语法树(AST)带来的变化详解
2018/07/17 PHP
详解php反序列化
2020/06/10 PHP
用js实现手把手教你月入万刀(转贴)
2007/11/07 Javascript
setTimeout()与setInterval()方法区别介绍
2013/12/24 Javascript
js实现九宫格图片半透明渐显特效的方法
2015/02/16 Javascript
微信js-sdk分享功能接口常用逻辑封装示例
2016/10/13 Javascript
微信小程序中换行空格(多个空格)写法详解
2018/07/10 Javascript
微信小程序常用赋值方法小结
2019/04/30 Javascript
简单谈谈javascript高级特性
2019/09/04 Javascript
Node.js API详解之 tty功能与用法实例分析
2020/04/27 Javascript
在项目vue中使用echarts的操作步骤
2020/09/07 Javascript
Python中os.path用法分析
2015/01/15 Python
使用Python编写一个模仿CPU工作的程序
2015/04/16 Python
全面了解python中的类,对象,方法,属性
2016/09/11 Python
Python调用服务接口的实例
2019/01/03 Python
Python数据可视化之画图
2019/01/15 Python
在pycharm中设置显示行数的方法
2019/01/16 Python
python 获取毫秒数,计算调用时长的方法
2019/02/20 Python
python实现证件照换底功能
2019/08/20 Python
python中取绝对值简单方法总结
2020/07/24 Python
真正了解CSS3背景下的@font face规则
2017/05/04 HTML / CSS
CSS3关于z-index不生效问题的解决
2020/02/19 HTML / CSS
新西兰最大的品牌运动鞋购物网站:Platypus NZ
2017/10/27 全球购物
澳大利亚宠物食品和药物在线:Jumbo Pets
2018/03/24 全球购物
美国农场商店:Blain’s Farm & Fleet
2020/01/17 全球购物
将"引用"作为函数返回值类型的格式、好处和需要遵守的规则
2016/02/09 面试题
护士实习鉴定范文
2013/12/22 职场文书
学生个人自我鉴定范文
2014/03/28 职场文书
合作意向协议书范本
2014/03/31 职场文书
学生会竞选演讲稿怎么写
2014/08/26 职场文书
违纪开除通知书
2015/04/25 职场文书
创业计划书之寿司
2019/07/19 职场文书
《合作意向书》怎么写?
2019/08/20 职场文书
如何理解及使用Python闭包
2021/06/01 Python
css样式important规则的正确使用方式
2022/06/10 HTML / CSS