1、从Request对象中获取数据

我们在第三章讲述View的函数时已经介绍过HttpRequest对象了,但当时并没有讲太多。 让我们回忆下:每个view函数的第一个参数是一个HttpRequest对象,就像下面这个hello()函数:

from django.http import HttpResponsedef hello(request):return HttpResponse("Hello world")

HttpRequest对象,比如上面代码里的request变量,会有一些有趣的、你必须让自己熟悉的属性和方法,以便知道能拿它们来做些什么。 在view函数的执行过程中,你可以用这些属性来获取当前request的一些信息(比如,你正在加载这个页面的用户是谁,或者用的是什么浏览器)。

2、URL相关信息

HttpRequest对象包含当前请求URL的一些信息:

在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)

3、有关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() 方法来处理这些“可能不存在的键”:

#遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
#寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
# 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函数可能是这样的:

ef 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))

详解Django中Request对象的相关用法相关推荐

  1. python join_详解Python中的join()函数的用法

    函数:string.join() Python中有join()和os.path.join()两个函数,具体作用如下: join(): 连接字符串数组.将字符串.元组.列表中的元素以指定的字符(分隔符) ...

  2. python scatter参数详解_Python 中 scatter 函数参数及用法详解

    Python 中 scatter 函数参数及用法详解 Python 中 scatter 函数参数及用法详解 这里有新鲜出炉的 Python 教程, 程序狗速度看过来! Python 编程语言 Pyth ...

  3. django中request对象的属性和方法

    1. Request对象方法和属性 request.method:获取请求方法 request.GET or request.POST:获取GET or POST请求参数,字典形式. request. ...

  4. python循环语句-详解Python中的循环语句的用法

    一.简介 Python的条件和循环语句,决定了程序的控制流程,体现结构的多样性.须重要理解,if.while.for以及与它们相搭配的 else. elif.break.continue和pass语句 ...

  5. python的for语句-详解Python中的循环语句的用法

    一.简介 Python的条件和循环语句,决定了程序的控制流程,体现结构的多样性.须重要理解,if.while.for以及与它们相搭配的 else. elif.break.continue和pass语句 ...

  6. python scatter参数详解_Python中scatter函数参数及用法详解

    最近开始学习Python编程,遇到scatter函数,感觉里面的参数不知道什么意思于是查资料,最后总结如下: 1.scatter函数原型 2.其中散点的形状参数marker如下: 3.其中颜色参数c如 ...

  7. python语句join_详解Python中的join()函数的用法

    原博文 2017-08-07 20:51 − 函数:string.join() Python中有join()和os.path.join()两个函数,具体作用如下: join(): 连接字符串数组.将字 ...

  8. python:Flask中request对象的简单用法

    因为在工作中需要将写好的Python程序改写成API接口供其他部门使用,所以这篇博客重点利用Flask的请求对象完成数据传输,对于更深层次的理论方面的内容,以后再补充: 本文只涉及本地服务器,再远程服 ...

  9. 详解Python中的join()函数的用法(字符串和os.path)

    函数:string.join()  Python中有join()和os.path.join()两个函数,具体作用如下:  join(): 连接字符串数组.将字符串.元组.列表中的元素以指定的字符(分隔 ...

最新文章

  1. 硬盘显示容量和实际容量不符合_为啥我买的64G U盘实际只有57G?聊聊存储市场的“不足量”现象...
  2. DLL延迟加载工程分析
  3. 统计一个字符串中的单词数
  4. 屈原坐上神十带来了iOS 7
  5. HDU - 4757 Tree(LCA+可持久化trie树)
  6. 电脑怎么结束进程_深刻了解windows系统的任务管理器,电脑高手的成长之路
  7. 王坚博士与计算机关系,与王坚副院长面对面:向王坚提问
  8. tolua打包Android后路径出错,unity+tolua 64位android崩溃排查过程记录
  9. 基于centos6.5 hbase 集群搭建
  10. Redis面试常问3 如何实现分布式锁 记住Redis的原子性
  11. android studio读写txt,Android Studio从.txt文件读取/写入,保存路径?
  12. 区块链 - 知识点整理
  13. Java单例模式(饿汉式)
  14. 职称评审需要满足的条件
  15. 云服务器被攻击了怎么办
  16. 教你分清敏感度和特异度
  17. Canvas 炫彩小球
  18. 基于卷积神经网络和小波变换的视频监控中的火灾探测
  19. cocos2d_lua 2.5D
  20. Python的电子邮件操作

热门文章

  1. linux编译安装memcached
  2. 常见排序算法:希尔排序
  3. Boost 库中的实用工具类使用入门
  4. Android手机内存图片读取,有效解决Android加载大图片内存溢出的问题
  5. java jdk 1.8 配置_java_Day01: java的jdk环境变量配置(1.8)
  6. unity 继承会调用start吗_Unity 继承MonoBehaviour脚本 执行顺序 详解
  7. 【整理】如何翻译SAP事务代码描述
  8. 什么是量子计算-超级简单的给你个解释
  9. Top 10 Things I Know for Sure-深信不疑的十大哲理
  10. 你羡慕的「自由职业者」,都在焦虑没有保障的退休生活