简介
HttpRequest 对象
class HttpRequest
Methods
QueryDict objects
HttpResponse objects
class HttpResponse

翻译: http://docs.djangoproject.com/en/dev/ref/request-response/#ref-request-response

简介

在Django架构中,服务器接受到用户的请求,Django首先创建一个 "HttpRequest" 对象,这个对象包含一些 metadata (元数据),metadata描述 了具体的用户请求。然后 Django 寻找相应的视图函数(view函数),把刚才创 建的 "HttpRequest" 对象作为这个视图函数的第一个参数,并调用该视图函数。 每个视图函数负责返回一个 "HttpResponse" 对象。

                 |-->  1. Django 创建 HttpRequest 对象
 用户的请求   -->
(metadata)       |-->  2. 调用: 视图函数(HttpRequest,...)
                                        |
                                        v
用户得到的结果    <----------(视图函数返回 HttpResponse 对象)

HttpRequest 对象

class HttpRequest

除了 "session" ,其他所有属性都应该是只读的。

HttpRequest.path

一个包含请求的url的字符串,不包含域名部分。类似:"/music/bands/the_beatles/"。

HttpRequest.method

这里存放 HTTP 的 method (通常有 POST 和 GET 两种),这样使用:

if request.method == 'POST':
    do_something()

HttpRequest.encoding

指定处理提交数据的编码,默认使用 "DEFAULT_CHARSET" ,值为 None 时,使用默认。

HttpRequest.GET

包含所有 HTTP GET 数据的类似目录结构的对象。

HttpRequest.POST

包含所有 HTTP POST 数据的类似目录结构的对象。POST 数据可以为空。

注意: POST 不包含 file-upload 数据,它存放在 FILES 部分。

HttpRequest.REQUEST

这事一个字典对象(Python里的字典),包含POST和GET数据,先搜索 POST ,在搜索 GET。

例如:如果 GET = {"name": "john"} , POST = {"age": '34'}, 那 么,REQUEST["name"] 值为 "john", REQUEST["age"] 值是 "34"。

强烈建议您使用 POST 和 GET 取代 REQUEST ,因为它们更严谨!

HttpRequest.COOKIES

在一个标准的Python字典结构里面存放着所有的 cookies ,key 和 value 都是字符串。

HttpRequest.FILES

在一个字典结构里面存放着所有上传的文件。字典里的每个 Key 都是使用 '<input type="file" name="" />' 上传的一个文件名。每个对于的 Value 都是 一个 UploadedFile 对象的文件,它有这些属性:

read (num_bytes=None)
从文件读取指定字节数据
name
上传文件的名字
size
以字节为单位的大小
chunks(chunk_size=None)
能从上传的文件产生连续的固定块数据的跌代器。

注意: 只有在 request 的 method 是 POST 情况下,并且 <form> 标签有 'enctype="multipart/form-data"' 时, FILES 字典才有数据,否则总是为空。

HttpRequest.META

包含所有可以获取的 HTTP headers,这依赖于 client 和 server 两端。下面是 一些常见的 HTTP headers:

在上面的列表里,除了 CONTENT_LENGTH 和 CONTENT_TYPE ,其他所有 request 里面存放的 HTTP headers 转换到 META 里的 key 时,所有字符大写,链接符变 为下划线。例如: X-Bender 在 META 里的 key 变为 HTTP_X_BENDER 。

HttpRequest.user

在使用 django.contrib.auth 和 django.contrib.sessions 两个 app 的情况下 ( AuthenticationMiddleware 中间件启动 ), HttpRequest.user 是一个 django.contrib.auth.models.User 对象,表示当前登录用户。如果 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.session

启动 session app 就有这个属性,保存登录用户的临时信息。

HttpRequest.raw_post_data

原始 HTTP POST 数据,只有在需要对其进行高级操作时候需要,通常使用 POST 代替。

HttpRequest.urlconf

详情查看 http://docs.djangoproject.com/en/dev/topics/http/urls/#how-django-processes-a-request

Methods

HttpRequest.get_host()

返回发送请求的原始主机地址。先找 HTTP_X_FORWARDED_HOST 值,没有再找 HTTP_HOST 值。如果这两个都没有值,就返回连接的 SERVER_NAME 和 SERVER_PORT 字符串。 例如:"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() 作为 location 值。如果 location 已经是一个绝对 URI ,则保持不变。否则加上 request 里可用的 server 值。例如: "http://example.com/music/bands/the_beatles/?print=True"

HttpRequest.is_secure()

对于 HTTPS 协议,返回 True。

HttpRequest.is_ajax()

如果 request 是一个 XMLHttpRequest ,返回 True。这是通过检查 HTTP_X_REQUESTED_WITH 里有没有 'XMLHttpRequest' 字符串做到的。

现在的大部分 JavaScript 库函数都会标记这个值。如果你要创建自己的 XMLHttpRequest ,只有自行设置这个头部信息才能使 is_ajax() 方法工作。

QueryDict objects

class QueryDict

一个 HttpRequest 对象中, GET 和 POST 属性都是 django.http.QueryDict 的 实例。这些实例是不可修改的。

Methods

QueryDict 拥有所有字典属性,因为它是 dictionary 的一个子类。

QueryDict.__getitem__(key)
返回指定 key 的 value 。 如果一个 key 有 多个 value ,返回最后一个 value 。如果 key 不存在,抛出 django.utils.datastructures.MultiValueDictKeyError 异常(这是 KeyError 的子类,可以用它来直接捕捉)。
QueryDict.__setitem__(key,value)
设置
QueryDict.__contains__(key)
如果 key 存在返回 True
QueryDict.get(key,default)
同 __getitem__() 一样,不过增加一个 hook ,返回 default 值。
QueryDict.setdefault(key,default)
设置
QueryDict.updata(other_dict)
更新
QueryDict.items()
在内部使用 __getitem__()
QueryDict.iteritems()
差不多
QueryDict.iterlists()
差不多
QueryDict.values()
差不多
QueryDict.itervalues()
差不多
QueryDict.copy()
使用 copy.deepcopy() , 生成的 copy 时可修改的。
QueryDict.getlist(key)
差不多
QueryDict.setlist(key,list_)
差不多
QueryDict.appendlist(key,item)
差不多
QueryDict.setlistdefault(key,default_list)
差不多
QueryDict.lists()
差不多
QueryDict.urlencode()
返回类似: "a=2&b=3&b=5"

HttpResponse objects

class HttpResponse

这是 django.http 模块的一个类,您所写的每个视图(view)都要返回一个 HttpResponse 对象,这个对象是由 Django 自动生成的。

Usage

PASSING STRINGS

这是简单的用户,只要使用字符串就可以初始化一个 HttpResponse 对象 (可以 被返回给用户了):

>>> response = HttpResponse("Here's the text of the Web page.")
>>> response = HttpResponse("Text only, please.", mimetype="text/plain")

可以把 HttpResponse 实例当做文件对象 (file-like) 来使用:

>>> response = HttpResponse()
>>> response.write("<p>Here's the text of the Web page.</p>")
>>> response.write("<p>Here's another paragraph.</p>")

当然也可以使用字典的方式添加和删除 headers 信息:

>>> response = HttpResponse()
>>> response['X-DJANGO'] = "It's the best."
>>> del response['X-PHP']
>>> response['X-DJANGO']
"It's the best."

注意:如果 header 不存在, del 也不会抛出 KeyError 异常。

PASSING ITERATORS

还可以传递给 HttpResponse 一个 iterator ,而不是硬编码的字符串。要想使 用这个特性,须注意:

SETTING HEADERS

和字典操作一样:

>>> response = HttpResponse()
>>> response['Pragma'] = 'no-cache'

注意: HTTP headers 不能包含换行符,否则引发 "BadHeaderError" 异常。

让浏览器将 response 当做文件附件

需要设置 mimetype 参数和 Content-Disposition 头部信息。例如,下面返回一 个 Microsoft Excel spreadsheet 文件:

>>> response = HttpResponse(my_data, mimetype='application/vnd.ms-excel')
>>> response['Content-Disposition'] = 'attachment; filename=foo.xls'

Attributes

HttpResponse.content

字符类型Python对象

HttpResponse.status_code

标准 HTTP 状态码

Methods

HttpResponse.__init__()

HttpResponse.__init__(content='',mimetype=None,status=200,content_type=DEFAULT_CONTENT_TYPE)

status 是 标准 HTTP 状态码

从 1.0 以后,content_type 是 mimetype 的一个别名,如果 mimetype 指定, 就使用它,否则使用 content_type , 两者都没有,使用 DEFAULT_CONTENT_TYPE (值为 'text/html') 。

content 可以时一个 iterator 或者 string , 如果是 iterator ,则须能返回 string 。

HttpResponse.__setitem__(header,value)

设置指定的 header

HttpResponse.__delitem__(header)

删除

HttpResponse.__getitem__(header)

返回指定 header

HttpResponse.has_header(header)

检查

HttpResponse.set_cookie()

HttpResponse.set_cookie(key, value='', max_age=None, expires=None, path='/', domain=None, secure=None)

HttpResponse.delete_cookie()

HttpResponse.delete_cookie(key, path='/', domain=None)

HttpResponse.write(content)

像 file-like 一样对待 HttpResponse 实例

HttpResponse.flush()

file-like 操作

HttpResponse.tell()

file-like 操作

HttpResponse subclasses

在 django.http 模块里还有一些 HttpResponse 的子类。

class HttpResponseRedirect

重定向到一个 URL ,这个子类只要指定一个参数 — 要重定向的路径。 URL 的 形式可以是: 'http://www.yahoo.com/search/' 或者 '/search/' 。

注意,重定向的 HTTP status code 是 302 ('found' redirect)。

class HttpResponsePermanentRedirect

同 HttpResponseRedirect 类似,不过返回一个 permanent redirect (status code 是 301)

301 和302
301
redirect: 301 代表永久性转移(Permanently Moved),
302
redirect: 302 代表暂时性转移(Temporarily Moved ),

301 重定向是网页更改地址后对搜索引擎友好的最好方法,只要不是暂时搬移的 情况,都建议使用301来做转址。302 重定向是临时性转移。

class HttpResponseNotModified

告诉请求端,指定的 page 没有更新(客户端的缓存继续可用)。返回 304 状态码。

class HttpResponseBadRequest

同 HttpResponse 一样,不过返回 400 状态码

class HttpResponseNotFound

同 HttpResponse 一样,不过返回 404 状态码

class HttpResponseForbidden

同 HttpResponse 一样,不过返回 403 状态码

class HttpResponseNotAllowed

同 HttpResponse 一样,不过返回 405 状态码

class HttpResponseGone

同 HttpResponse 一样,不过返回 410 状态码

class HttpResponseServerError

同 HttpResponse 一样,不过返回 500 状态码