详解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自动化部署工具Fabric的简单上手指南
Apr 19 Python
Python selenium文件上传方法汇总
Nov 19 Python
详解Django中六个常用的自定义装饰器
Jul 04 Python
python dataframe向下向上填充,fillna和ffill的方法
Nov 28 Python
python 实现将txt文件多行合并为一行并将中间的空格去掉方法
Dec 20 Python
pyqt远程批量执行Linux命令程序的方法
Feb 14 Python
不到40行代码用Python实现一个简单的推荐系统
May 10 Python
python线程的几种创建方式详解
Aug 29 Python
python2与python3爬虫中get与post对比解析
Sep 18 Python
python生成requirements.txt的两种方法
Sep 18 Python
python使用opencv实现马赛克效果示例
Sep 28 Python
django 将自带的数据库sqlite3改成mysql实例
Jul 09 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
德生H-501的评价与改造
2021/03/02 无线电
如何将一个表单同时提交到两个地方处理
2006/10/09 PHP
php实现建立多层级目录的方法
2014/07/19 PHP
Laravel如何创建服务器提供者实例代码
2019/04/15 PHP
PHP Swoole异步Redis客户端实现方法示例
2019/10/24 PHP
cnblogs中在闪存中屏蔽某人的实现代码
2010/11/14 Javascript
Jquery操作下拉框(DropDownList)实现取值赋值
2013/08/13 Javascript
使用JS或jQuery模拟鼠标点击a标签事件代码
2014/03/10 Javascript
jQuery实现的简单提示信息插件
2015/12/08 Javascript
原生JavaScript制作微博发布面板效果
2016/03/11 Javascript
jQuery实现模糊搜索功能的方法分析
2018/06/29 jQuery
用Node编写RESTful API接口的示例代码
2018/07/04 Javascript
Vue cli3 库模式搭建组件库并发布到 npm的流程
2018/10/12 Javascript
Vue 构造选项 - 进阶使用说明
2020/08/14 Javascript
vue v-for 点击当前行,获取当前行数据及event当前事件对象的操作
2020/09/10 Javascript
Openlayers3实现车辆轨迹回放功能
2020/09/29 Javascript
[00:33]DOTA2上海特级锦标赛 CDEC战队宣传片
2016/03/04 DOTA
Python set常用操作函数集锦
2017/11/15 Python
解决Pandas to_json()中文乱码,转化为json数组的问题
2018/05/10 Python
Python将json文件写入ES数据库的方法
2019/04/10 Python
Python实现的对一个数进行因式分解操作示例
2019/06/27 Python
python进阶之自定义可迭代的类
2019/08/20 Python
Python 函数list&amp;read&amp;seek详解
2019/08/28 Python
关于sys.stdout和print的区别详解
2019/12/05 Python
python3.7通过thrift操作hbase的示例代码
2020/01/14 Python
Tensorflow 多线程与多进程数据加载实例
2020/02/05 Python
numba提升python运行速度的实例方法
2021/01/25 Python
html5 迷宫游戏(碰撞检测)实例一
2013/07/25 HTML / CSS
Belvilla德国:在线预订度假屋
2018/04/10 全球购物
小学岗位竞聘方案
2014/01/22 职场文书
初中同学会活动方案
2014/08/22 职场文书
总经理司机岗位职责
2015/04/10 职场文书
导游词之青城山景区
2019/09/27 职场文书
java实现对Hadoop的操作
2021/07/01 Java/Android
python基础之类属性和实例属性
2021/10/24 Python
大脑的记忆过程在做数据压缩,不同图形也有共同的记忆格式
2022/04/29 数码科技