详解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的Django框架实现事务交易管理的教程
Apr 20 Python
图文详解WinPE下安装Python
May 17 Python
Python基础教程之tcp socket编程详解及简单实例
Feb 23 Python
Python实现针对含中文字符串的截取功能示例
Sep 22 Python
解决Python安装后pip不能用的问题
Jun 12 Python
Python -m参数原理及使用方法解析
Aug 21 Python
如何使用 Python 读取文件和照片的创建日期
Sep 05 Python
tensorflow2.0教程之Keras快速入门
Feb 20 Python
python 制作一个gui界面的翻译工具
May 14 Python
教你使用TensorFlow2识别验证码
Jun 11 Python
基于Python实现流星雨效果的绘制
Mar 18 Python
Python时间操作之pytz模块使用详解
Jun 14 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变量引用的面试题
2010/08/08 PHP
PHP url 加密解密函数代码
2011/08/26 PHP
php array_filter除去数组中的空字符元素
2020/06/21 PHP
php使用parse_url和parse_str解析URL
2015/02/22 PHP
正确的PHP匹配UTF-8中文的正则表达式
2015/05/13 PHP
Windows平台PHP+IECapt实现网页批量截图并创建缩略图功能详解
2019/08/02 PHP
jquery 文本上下无缝滚动,鼠标放上去就停止 小例子
2013/06/05 Javascript
HTML Color Picker(js拾色器效果)
2013/08/27 Javascript
js时间比较示例分享(日期比较)
2014/03/05 Javascript
超链接的禁用属性Disabled使用示例
2014/07/31 Javascript
JS使用for循环遍历Table的所有单元格内容
2014/08/21 Javascript
javascript实现table选中的行以指定颜色高亮显示的方法
2015/05/13 Javascript
Bootstrap导航条的使用和理解3
2016/12/14 Javascript
微信小程序promsie.all和promise顺序执行
2017/10/27 Javascript
JS实现的JSON数组去重算法示例
2018/04/11 Javascript
JavaScript实现汉字转换为拼音及缩写的方法示例
2019/03/28 Javascript
vue项目中使用scss的方法步骤
2019/05/16 Javascript
微信小程序前端promise封装代码实例
2019/08/24 Javascript
vue 实现LED数字时钟效果(开箱即用)
2019/12/08 Javascript
ElementUI Tree 树形控件的使用并给节点添加图标
2020/02/27 Javascript
[00:32]2018DOTA2亚洲邀请赛VGJ.T出场
2018/04/03 DOTA
Python pandas常用函数详解
2018/02/07 Python
DataFrame中的object转换成float的方法
2018/04/10 Python
Python中list查询及所需时间计算操作示例
2018/06/21 Python
win7+Python3.5下scrapy的安装方法
2018/07/31 Python
python的concat等多种用法详解
2018/11/28 Python
python基础梳理(一)(推荐)
2019/04/06 Python
python3 图片 4通道转成3通道 1通道转成3通道 图片压缩实例
2019/12/03 Python
Python用户自定义异常的实现
2020/12/25 Python
浅谈利用缓存来优化HTML5 Canvas程序的性能
2015/05/12 HTML / CSS
Html5监听手机摇一摇事件的实现
2019/11/07 HTML / CSS
简约控的天堂:The Undone
2016/12/21 全球购物
Smashbox英国官网:美国知名彩妆品牌
2017/11/13 全球购物
商场主管竞聘书
2014/03/31 职场文书
品牌服务方案
2014/06/03 职场文书
内勤岗位职责范本
2015/04/13 职场文书