HttpRequest 对象

当请求一个页面时,Django 会建立一个包含请求元数据的 HttpRequest 对象。 当 Django 加载对应的视图时,HttpRequest 对象将作为视图函数的第一个参数(即:request)。每个视图会返回一个 HttpResponse 对象。




属性

  • HttpRequest.scheme

一个字符串,表示请求的方案(通常是 http 或 https)。

  • HttpRequest.body

一个字节字符串,表示原始 HTTP 请求的正文。

  • HttpRequest.path

一个字符串,表示请求的页面的完整路径,不包含域名。
例如:"/music/bands/the_beatles/"

  • HttpRequest.path_info

在某些 Web 服务器配置下,主机名后的 URL 部分被分成脚本前缀部分和路径信息部分。path_info 属性将始终包含路径信息部分,不论使用的 Web 服务器是什么。使用它代替 path 可以让代码在测试和开发环境中更容易地切换。

  • HttpRequest.method

一个字符串,表示请求使用的 HTTP 方法。必须使用大写。例如:

if request.method == 'GET':
    do_something()
elif request.method == 'POST':
    do_something_else()
  • HttpRequest.encoding

一个字符串,表示提交的数据的编码方式(如果为 None 则表示使用 DEFAULT_CHARSET 设置)。你可以通过修改它来修改访问表单数据使用的编码。

  • HttpRequest.GET

一个类似于字典的对象,包含 HTTP GET 的所有参数

  • HttpRequest.POST

一个类似于字典的对象,包含所有给定的 HTTP POST参数,提供了包含表单数据的请求。

  • HttpRequest.COOKIES

一个标准的 Python 字典,包含所有的 cookie。键和值都为字符串。

  • HttpRequest.FILES

一个类似于字典的对象,包含所有的上传文件。FILES 中的每个键为 <input type="file" name="" /> 中的 name。

  • HttpRequest.META

一个标准的 Python 字典,包含所有的 HTTP 头部。具体的头部信息取决于客户端和服务器,下面是一些示例:

  • CONTENT_LENGTH —— 请求的正文的长度(是一个字符串)。
  • CONTENT_TYPE —— 请求的正文的MIME 类型。
  • HTTP_ACCEPT —— 响应可接收的Content-Type。
  • HTTP_ACCEPT_ENCODING —— 响应可接收的编码。
  • HTTP_ACCEPT_LANGUAGE —— 响应可接收的语言。
  • HTTP_HOST —— 客服端发送的HTTP Host 头部。
  • HTTP_REFERER —— Referring 页面。
  • HTTP_USER_AGENT —— 客户端的user-agent 字符串。
  • QUERY_STRING —— 单个字符串形式的查询字符串(未解析过的形式)。
  • REMOTE_ADDR —— 客户端的IP 地址。
  • REMOTE_HOST —— 客户端的主机名。
  • REMOTE_USER —— 服务器认证后的用户。
  • REQUEST_METHOD —— 一个字符串,例如"GET" 或"POST"。
  • SERVER_NAME —— 服务器的主机名。
  • SERVER_PORT —— 服务器的端口(是一个字符串)。

从上面可以看到,除 CONTENT_LENGTH 和 CONTENT_TYPE 之外,请求中的任何 HTTP 头部转换为 META 的键时,都会将所有字母大写并将连接符替换为下划线最后加上 HTTP_ 前缀。所以,一个叫做 X-Bender 的头部将转换成META 中的 HTTP_X_BENDER 键。

  • HttpRequest.user

一个 AUTH_USER_MODEL 类型的对象,表示当前登录的用户。如果用户当前没有登录,user 将设置为 django.contrib.auth.models.AnonymousUser 的一个实例。你可以通过 is_authenticated() 区分它们,像这样:

if request.user.is_authenticated():
    # Do something for logged-in users.
else:
    # Do something for anonymous users.




方法

  • HttpRequest.get_host()

根据从 HTTP_X_FORWARDED_HOST(如果打开 USE_X_FORWARDED_HOST)和 HTTP_HOST 头部信息返回请求的原始主机。如果这两个头部没有提供相应的值,则使用 SERVER_NAME 和 SERVER_PORT,在 PEP 3333 中有详细描述。

例如:"127.0.0.1:8000"

  • HttpRequest.get_full_path()

返回 path,如果可以将加上查询字符串。

例如:"/music/bands/the_beatles/?print=true"

  • HttpRequest.build_absolute_uri(location)

返回 location 的绝对 URI。如果 location 没有提供,则设置为 request.get_full_path()。

如果 URI 已经是一个绝对的URI,将不会修改。否则,使用请求中的服务器相关的变量构建绝对URI。

例如:"http://example.com/music/bands/the_beatles/?print=true"

  • HttpRequest.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)

返回签名过的 Cookie 对应的值,如果签名不再合法则返回 django.core.signing.BadSignature。如果提供 default 参数,将不会引发异常并返回 default 的值。

可选参数 salt 可以用来对安全密钥强力攻击提供额外的保护。max_age 参数用于检查 Cookie 对应的时间戳以确保 Cookie 的时间不会超过 max_age 秒。

  • HttpRequest.is_secure()

如果请求时是安全的,则返回 True;即请求是通过 HTTPS 发起的。

  • HttpRequest.is_ajax()

如果请求是通过 XMLHttpRequest 发起的,则返回 True,方法是检查 HTTP_X_REQUESTED_WITH 头部是否是字符串 'XMLHttpRequest'。大部分现代的 JavaScript 库都会发送这个头部。如果你编写自己的 XMLHttpRequest 调用(在浏览器端),你必须手工设置这个值来让 is_ajax() 可以工作。

如果一个响应需要根据请求是否是通过 AJAX 发起的,并且你正在使用某种形式的缓存例如 Django 的 cache middleware, 你应该使用 vary_on_headers('HTTP_X_REQUESTED_WITH') 装饰你的视图以让响应能够正确地缓存。

  • HttpRequest.read(size=None)
  • HttpRequest.readline()
  • HttpRequest.readlines()
  • HttpRequest.xreadlines()
  • HttpRequest.__iter__()

这几个方法实现类文件的接口用于读取 HttpRequest 实例。这使得可以用流的方式读取进来的请求。一个常见的用例是使用迭代解析器处理大型 XML 有效载荷,而不在内存中构造一个完整的 XML 树。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容