详解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 07 Python
python 3利用BeautifulSoup抓取div标签的方法示例
May 28 Python
Python日期的加减等操作的示例
Aug 15 Python
Python实现PS滤镜碎片特效功能示例
Jan 24 Python
matplotlib subplots 调整子图间矩的实例
May 25 Python
python处理multipart/form-data的请求方法
Dec 26 Python
django的ORM模型的实现原理
Mar 04 Python
Django Rest framework认证组件详细用法
Jul 25 Python
python dataframe NaN处理方式
Dec 26 Python
Django vue前后端分离整合过程解析
Nov 20 Python
python 实现汉诺塔游戏
Nov 28 Python
详解Flask开发技巧之异常处理
Jun 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设计模式之结构模式的深入解析
2013/06/13 PHP
php实现常见图片格式的水印和缩略图制作(面向对象)
2016/06/15 PHP
使用php完成常见的文件上传功能(推荐)
2017/01/13 PHP
Yii框架使用魔术方法实现跨文件调用功能示例
2017/05/20 PHP
PHP+Redis事务解决高并发下商品超卖问题(推荐)
2020/08/03 PHP
JavaScript的parseInt 取整使用
2011/05/09 Javascript
javascript垃圾收集机制与内存泄漏详细解析
2013/11/11 Javascript
Javascript 修改String 对象 增加去除空格功能(示例代码)
2013/11/30 Javascript
jQuery调用RESTful WCF示例代码(GET方法/POST方法)
2014/01/26 Javascript
jQuery中replaceWith()方法用法实例
2014/12/25 Javascript
JavaScript数组前面插入元素的方法
2015/04/06 Javascript
JavaScript数组去重的3种方法和代码实例
2015/07/01 Javascript
功能强大的Bootstrap使用手册(一)
2016/08/02 Javascript
深入理解JS继承和原型链的问题
2016/12/17 Javascript
微信小程序中子页面向父页面传值实例详解
2017/03/20 Javascript
Vue.js实战之组件的进阶
2017/04/04 Javascript
AngularJS中scope的绑定策略实例分析
2017/10/30 Javascript
在Mac下彻底卸载node和npm的方法
2018/05/16 Javascript
js指定日期增加指定月份的实现方法
2018/12/19 Javascript
基于JavaScript canvas绘制贝塞尔曲线
2018/12/25 Javascript
[01:38]女王驾到——至宝魔廷新尊技能&特效展示
2020/06/16 DOTA
在Python的Django框架中创建和使用模版
2015/07/15 Python
python实现报表自动化详解
2017/11/16 Python
python3.7.0的安装步骤
2018/08/27 Python
解决python3中的requests解析中文页面出现乱码问题
2019/04/19 Python
python中hasattr()、getattr()、setattr()函数的使用
2019/08/16 Python
Django中使用haystack+whoosh实现搜索功能
2019/10/08 Python
纯CSS3大转盘抽奖示例代码(响应式、可配置)
2017/01/13 HTML / CSS
为什么group by 和order by会使查询变慢
2014/05/16 面试题
秋季红领巾广播稿
2014/01/27 职场文书
教学个人的自我评价分享
2014/02/16 职场文书
员工试用期考核自我鉴定
2014/04/13 职场文书
中国文明网向国旗敬礼活动精彩寄语2014
2014/09/27 职场文书
2014年班务工作总结
2014/12/02 职场文书
自荐信怎么写
2015/03/04 职场文书
总经理年会致辞
2015/07/29 职场文书