django中的HttpRequest和HttpResponse

时间:2022-12-01 20:23:14

 HTTP 应用的信息是通过 请求报文 和 响应报文 传递的,在django中对应HttpRequest和HttpResponse对象请求报文 由客户端发送,其中包含和许多的信息,而 django(Handler(WSGIHandler))handlers.py 将这些信息封装成了 WSGIRequest (HttpRequest) 对象,该对象由 HttpRequest 类创建。每一个请求都会生成一个 HttpRequest 对象,django会将这个对象自动传递给响应的视图函数,一般视图函数约定俗成地使用 request 参数承接这个对象。

HttpResponse对象就必须我们自己创建。每个View方法必须返回一个HttpResponse对象。HttpResponse类在django.http.HttpResponse

Quick overview

django使用request和response对象在系统里传输信息

当一个网页被请求时,django创建一个包含request元数据的HttpRequest对象,接着调用对应的view,并且把HttpRequest当做第一个参数传给view对应的方法。每个view方法必须返回一个HttpResponse对象

接下来详细介绍HttpRequest和HttpResponse对象,可以在django.http模块中找到

----------------------------------------------------------------------------------------------------------------------------------

HttpRequest对象

属性:通常认为所有的属性都应该是只读的,除非另有说明

1.HttpRequest.scheme:request协议(通常是http或者https)

2.HttpRequest.body:字节字符串,原始的请求数据,处理传统的二进制图片或者XML时非常有用,

3.HttpRequest.path:指向被请求页面的路径,不包含协议和域名,Example: "/music/bands/the_beatles/"

4.HttpRequest.path_info:在有些web服务的配置中,URL(host后面那部分)通常被分成 script prefix和path info两部分,path_info总是包含path info部分,建议使用HttpRequest.path,可以是代码更加清晰

5.HttpRequest.method:表示Http方法的字符串,必须大写,如下:

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

6. HttpRequest.encoding:用来对被提交数据解码的字符集(None代表使用默认字符集)

7.HttpRequest.content_type:请求的MIME type,从header的CONTENT_TYPE 中获取

8.HttpRequest.GET:字典对象,包含提交的HTTP GET参数

9.HttpRequest.POST:字典对象,请求包含表单对象时,包含提交的HTTP POST参数

10.HttpRequest.COOKIES:字典对象,key和value都是字符串

11.HttpRequest.FILES:字典对象,包含上传的文件。key对应<input type="file"name="" />标签中的name属性,value对应一个UploadedFile对象,

只有当method是POST并且form的包含属性enctype="multipart/form-data"时,FILES才能正确提交数据,否则为空字典

12.HttpRequest.META:字典对象,包含HTTP headers,具体headers视client和sever而定,比如:

  • CONTENT_LENGTH – The length of the request body (as a string).
  • CONTENT_TYPE – The MIME type of the request body.
  • HTTP_ACCEPT – Acceptable content types for the response.
  • HTTP_ACCEPT_ENCODING – Acceptable encodings for the response.
  • HTTP_ACCEPT_LANGUAGE – Acceptable languages for the response.
  • 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 (as a string).

META key通常是大写引文字母和下划线,并且以HTTP_为前缀,

13.HttpRequest.resolver_match:ResolverMatch实例,表示已经处理完URL,只有当URL处理完时才此属性,表示在所有的view中都是可用的(不包括middleware,因为middleware在处理URL之前)


---

Attributes set by application code

django不用设置一下属性,但是如果应用程序设置好的话,将会使用它们

1.HttpRequest.current_app:URL模板标签将会使用

2.HttpRequest.urlconf:本当做当前请求的root URLconf 使用


---

Attributes set by middleware

1.HttpRequest.session: 来自SessionMiddleware,可读可写的字典对象,代表当前会话

2.HttpRequest.site:来自CurrentSiteMiddleware,Site或者RequestSeit实例,get_current_site()返回的代表当前site

3.HttpRequest.user:来自 AuthenticationMiddlewareAUTH_USER_MODEL 实例,代表当前登录的用户,未登录的话,则是一耳光AnonymousUser实例,

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

---

方法:

1.HttpRequest.get_host():

从header的HTTP_X_FORWARDED_HOST 和HTTP_HOST 中返回原始的host。如果这两个属性没有设置的话,则返回 SERVER_NAME 和SERVER_PORT 的组合

2.HttpRequest.get_port():

从META的HTTP_X_FORWARDED_PORT SERVER_PORT 中返回原始的port

3.HttpRequest.get_full_path():

返回path和参数串,Example: "/music/bands/the_beatles/?print=true"

4.HttpRequest.build_absolute_uri(location):

返回绝对URI的location或者request.get_full_path()(location没有的情况下)

5.HttpRequest.get_signed_cookie(keydefault=RAISE_ERRORsalt=''max_age=None):

返回signed cookie或者 (签名无效时)django.core.signing.BadSignature 异常

参数salt:提供额外信息保护当遇到暴力破解时

参数max_age:验证cookie中的时间戳是否过期

6.HttpRequest.is_secure():

当使用HTTPS协议时,返回true

7.HttpRequest.is_ajax():

当请求是由XMLHttpRequest发送时,返回True,通过检查header HTTP_X_REQUESTED_WITH的值是否为XMLHttpRequest

8.HttpRequest.read(size=None)

9. HttpRequest.readline()

10.HttpRequest.readlines()

11. HttpRequest.__iter__()

当遇到流类型请求时,可以使用这些接口,类似于读文件。常用在处理大型XML时,可以直接将HttpRequest当做参数传递给 XML parser,比如ElementTree

import xml.etree.ElementTree as ET
for element in ET.iterparse(request):
    process(element)