翻译: 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
- HTTP_ACCEPT_ENCODING
- HTTP_ACCEPT_LANGUAGE
- HTTP_HOST — The HTTP Host header sent by the client.
- HTTP_REFERER — The referring page, if any.
- HTTP_USER_AGENT — The client's user-agent string.
- QUERY_STRING — The query string, as a single (unparsed) string.
- REMOTE_ADDR — The IP address of the client.
- REMOTE_HOST — The hostname of the client.
- REMOTE_USER — The user authenticated by the web server, if any.
- REQUEST_METHOD — A string such as "GET" or "POST".
- SERVER_NAME — The hostname of the server.
- SERVER_PORT — The port of the server.
在上面的列表里,除了 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 ,而不是硬编码的字符串。要想使 用这个特性,须注意:
- iterator 应该返回字符串
- 使用 iterator 的 HttpResponse 不能再当做 file-like 实例来处理,不然 引发异常
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
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 状态码
