django HttpRequest对象

每当一个用户请求发送过来,Django将HTTP数据包中的相关内容,打包成为一个HttpRequest对象,并传递给每个视图函数作为第一位置参数,也就是request,供我们调用。

HttpRequest对象中包含了非常多的重要的信息和数据,应该熟练掌握它。

类定义:class HttpRequest[source]

一、属性

HttpRequest对象的大部分属性是只读的,除非特别注明。

1. HttpRequest.scheme

字符串类型,表示请求的协议种类,‘http‘或‘https‘。

2. HttpRequest.body

bytes类型,表示原始HTTP请求的正文。它对于处理非HTML形式的数据非常有用:二进制图像、XML等。如果要处理常规的表单数据,应该使用HttpRequest.POST。

还可以使用类似读写文件的方式从HttpRequest中读取数据,参见HttpRequest.read()。

3. HttpRequest.path

字符串类型,表示当前请求页面的完整路径,但是不包括协议名和域名。例如:"/music/bands/the_beatles/"。这个属性,常被用于我们进行某项操作时,如果不通过,返回用户先前浏览的页面。非常有用!

4. HttpRequest.path_info

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

例如,如果应用的WSGIScriptAlias设置为/minfo,那么HttpRequest.path等于/music/bands/the_beatles/ ,而HttpRequest.path_info/minfo/music/bands/the_beatles/

5. HttpRequest.method

字符串类型,表示请求使用的HTTP方法。默认为大写。 像这样:

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

通过这个属性来判断请求的方法,然后根据请求的方法不同,在视图中执行不同的代码。

6. HttpRequest.encoding

字符串类型,表示提交的数据的编码方式(如果为None 则表示使用DEFAULT_CHARSET设置)。 这个属性是可写的,可以通过修改它来改变表单数据的编码。任何随后的属性访问(例如GET或POST)将使用新的编码方式。

7. HttpRequest.content_type

Django1.10中新增。表示从CONTENT_TYPE头解析的请求的MIME类型。

8. HttpRequest.content_params

Django 1.10中新增。包含在CONTENT_TYPE标题中的键/值参数字典。

9 HttpRequest.GET

一个类似于字典的对象,包含GET请求中的所有参数。 详情参考QueryDict文档。

10. HttpRequest.POST

一个包含所有POST请求的参数,以及包含表单数据的字典。 详情请参考QueryDict文档。 如果需要访问请求中的原始或非表单数据,可以使用HttpRequest.body属性。

注意:请使用if request.method == "POST"来判断一个请求是否POST类型,而不要使用if request.POST

POST中不包含上传文件的数据。

11. HttpRequest.COOKIES

包含所有Cookie信息的字典。 键和值都为字符串。可以类似字典类型的方式,在cookie中读写数据,但是注意cookie是不安全的,因此,不要写敏感重要的信息。

12. HttpRequest.FILES

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

要在Django中实现文件上传,就要靠这个属性!

如果请求方法是POST且请求的<form>中带有enctype="multipart/form-data"属性,那么FILES将包含上传的文件的数据。 否则,FILES将为一个空的类似于字典的对象,属于被忽略、无用的情形。

13. HttpRequest.META

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

  • CONTENT_LENGTH —— 请求正文的长度(以字符串计)。
  • CONTENT_TYPE —— 请求正文的MIME类型。
  • HTTP_ACCEPT —— 可接收的响应Content-Type
  • HTTP_ACCEPT_ENCODING —— 可接收的响应编码类型。
  • HTTP_ACCEPT_LANGUAGE —— 可接收的响应语言种类。
  • HTTP_HOST —— 客服端发送的Host头部。
  • HTTP_REFERER —— Referring页面。
  • HTTP_USER_AGENT —— 客户端的user-agent字符串。
  • QUERY_STRING —— 查询字符串。
  • REMOTE_ADDR —— 客户端的IP地址。想要获取客户端的ip信息,就在这里!
  • REMOTE_HOST —— 客户端的主机名。
  • REMOTE_USER —— 服务器认证后的用户,如果可用。
  • REQUEST_METHOD —— 表示请求方法的字符串,例如"GET" 或"POST"。
  • SERVER_NAME —— 服务器的主机名。
  • SERVER_PORT —— 服务器的端口(字符串)。

以上只是比较重要和常用的,还有很多未列出。

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

13. HttpRequest.resolver_match

代表一个已解析的URL的ResolverMatch实例。

二、可自定义的属性

Django不会自动设置下面这些属性,而是由你自己在应用程序中设置并使用它们。

1. HttpRequest.current_app

表示当前app的名字。url模板标签将使用其值作为reverse()方法的current_app参数。

2. HttpRequest.urlconf

设置当前请求的根URLconf,用于指定不同的url路由进入口,这将覆盖settings中的ROOT_URLCONF设置。

将它的值修改为None,可以恢复使用ROOT_URLCONF设置。

三、由中间件设置的属性

Django的contrib应用中包含的一些中间件会在请求上设置属性。

1. HttpRequest.session

SessionMiddleware中间件:一个可读写的,类似字典的对象,表示当前会话。我们要保存用户状态,回话过程等等,靠的就是这个中间件和这个属性。

2. HttpRequest.site

CurrentSiteMiddleware中间件:get_current_site()方法返回的Site或RequestSite的实例,代表当前站点是哪个。

Django是支持多站点的,如果你同时上线了几个站点,就需要为每个站点设置一个站点id。

3. HttpRequest.user

AuthenticationMiddleware中间件:表示当前登录的用户的AUTH_USER_MODEL的实例,这个模型是Django内置的Auth模块下的User模型。如果用户当前未登录,则user将被设置为AnonymousUser的实例。

可以使用is_authenticated方法判断当前用户是否合法用户,如下所示:

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

四、方法

1. HttpRequest.get_host()[source]

根据HTTP_X_FORWARDED_HOSTHTTP_HOST头部信息获取请求的原始主机。 如果这两个头部没有提供相应的值,则使用SERVER_NAMESERVER_PORT

例如:"127.0.0.1:8000"

注:当主机位于多个代理的后面,get_host()方法将会失败。解决办法之一是使用中间件重写代理的头部,如下面的例子:

from django.utils.deprecation import MiddlewareMixin

class MultipleProxyMiddleware(MiddlewareMixin):
    FORWARDED_FOR_FIELDS = [
        ‘HTTP_X_FORWARDED_FOR‘,
        ‘HTTP_X_FORWARDED_HOST‘,
        ‘HTTP_X_FORWARDED_SERVER‘,
    ]

    def process_request(self, request):
        """
        Rewrites the proxy headers so that only the most
        recent proxy is used.
        """
        for field in self.FORWARDED_FOR_FIELDS:
            if field in request.META:
                if ‘,‘ in request.META[field]:
                    parts = request.META[field].split(‘,‘)
                    request.META[field] = parts[-1].strip()

2. HttpRequest.get_port()[source]

使用META中HTTP_X_FORWARDED_PORTSERVER_PORT的信息返回请求的始发端口。

3. HttpRequest.get_full_path()[source]

返回包含完整参数列表的path。例如:/music/bands/the_beatles/?print=true

4. HttpRequest.build_absolute_uri(location)[source]

返回location的绝对URI形式。 如果location没有提供,则使用request.get_full_path()的值。

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

注:不鼓励在同一站点混合部署HTTP和HTTPS,如果需要将用户重定向到HTTPS,最好使用Web服务器将所有HTTP流量重定向到HTTPS。

5. HttpRequest.get_signed_cookie(key, default=RAISE_ERROR, salt=‘‘, max_age=None)[source]

从已签名的Cookie中获取值,如果签名不合法则返回django.core.signing.BadSignature。

可选参数salt用来为密码加盐,提高安全系数。 max_age参数用于检查Cookie对应的时间戳是否超时。

范例:

>>> request.get_signed_cookie(‘name‘)
‘Tony‘
>>> request.get_signed_cookie(‘name‘, salt=‘name-salt‘)
‘Tony‘ # assuming cookie was set using the same salt
>>> request.get_signed_cookie(‘non-existing-cookie‘)
...
KeyError: ‘non-existing-cookie‘
>>> request.get_signed_cookie(‘non-existing-cookie‘, False)
False
>>> request.get_signed_cookie(‘cookie-that-was-tampered-with‘)
...
BadSignature: ...
>>> request.get_signed_cookie(‘name‘, max_age=60)
...
SignatureExpired: Signature age 1677.3839159 > 60 seconds
>>> request.get_signed_cookie(‘name‘, False, max_age=60)
False

6. HttpRequest.is_secure()[source]

如果使用的是Https,则返回True,表示连接是安全的。

7. HttpRequest.is_ajax()[source]

如果请求是通过XMLHttpRequest生成的,则返回True。

这个方法的作用就是判断,当前请求是否通过ajax机制发送过来的。

8. HttpRequest.read(size=None)[source]

9. HttpRequest.readline()[source]

10. HttpRequest.readlines()[source]

11. HttpRequest.xreadlines()[source]

12. HttpRequest.iter()

上面的几个方法都是从HttpRequest实例读取文件数据的方法。

可以将HttpRequest实例直接传递到XML解析器,例如ElementTree:

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

原文地址:https://www.cnblogs.com/navysummer/p/10200204.html

时间: 2024-10-06 19:54:25

django HttpRequest对象的相关文章

Django HttpRequest对象的一些属性与方法

HttpRequest对象的属性 属性 描述 path 表示提交请求页面完整地址的字符串,不包括域名,如 "/music/bands/the_beatles/". method 表示提交请求使用的HTTP方法.它总是大写的.例如: if request.method == 'GET': do_something() elif request.method == 'POST': do_something_else() GET 一个类字典对象,包含所有的HTTP的GET参数的信息.见 Qu

django的HTTPREQUEST对象

Django使用request和response对象 当请求一张页面时,Django把请求的metadata数据包装成一个HttpRequest对象,然后Django加载合适的view方法,把这个HttpRequest 对象作为第一个参数传给view方法.任何view方法都应该返回一个HttpResponse对象. 我们在本书中大量使用这两个对象:本附录详细解释HttpRequest和HttpResponse对象. HttpRequest HttpRequest代表一个来自uesr-agent的

Django中视图总结[urls匹配,HttpRequest对象,HttpResponse对象,对象序列化接受及案例]

视图的功能: 接收请求,进行处理,返回应答. 视图返回的内容为: HttpResponse的对象或子对象 render 返回的是HttpResponse的对象 JsonResponse是HttpResponse的子类 HttpResponseRedirect也是HttpResonse的子类 redirect是HttpResponseRedirect的一个简写 总结:所以视图返回的内容一般为:render,redirect,JsonResponse,Httpresponse 定义视图函数分为两步

Django框架(九):视图(二) HttpRequest对象、HttpResponse对象

1. HttpRequest对象 服务器接收到http协议的请求后,会根据报文创建HttpRequest对象,这个对象不需要我们创建,直接使用服务器构造好的对象就可以.视图的第一个参数必须是HttpRequest对象,在django.http模块中定义了HttpRequest对象的API. 1.1 属性 path:一个字符串,表示请求的页面的完整路径,不包含域名和参数部分. method:一个字符串,表示请求使用的HTTP方法,常用值包括:'GET'.'POST'. 在浏览器中给出地址发出请求采

django HttpResponse对象

HttpResponse对象 概述: 作用:给浏览器返回数据 HttpRequest对象是由Django创建的,HttpResponse对象是由程序员创建 用法: 不用模板,直接返回数据 语句示例:return HttpResponse("Sunck is a good man") 调用模板 使用render方法 原型:render(request, templateName[, context]) 作用:结合数据和模板,返回一个完整的HTML页面 参数: request:请求体对象

Django F对象的使用

概念 class FF()是代表模型字段的值,也就是说对于一些特殊的字段的操作,我们不需要用Python把数据先取到内存中,然后操作,在存储到db中了. 场景 例1:我们有个统计点击量的字段,每次更新的操作其实就是把字段的值加1. 一般我们的做法是把这条记录取出来,把相应字段加+1,然后在save,类似下面的代码: # Tintin filed a news story! reporter = Reporters.objects.get(name='Tintin') reporter.stori

【转载】使用信号监控 Django 模型对象字段值的变化

转载出处:http://blog.csdn.net/pushiqiang/article/details/74949465 Django 信号 (Signals) 的功能类似于 WordPress 的动作 (action),用于为项目全局增加事件的广播 (dispatch) 与接收 (receive) 机制.其中,灵活使用其内置的模型信号 (Model Signals) 的接收功能就可以监控大部分模型对象 (Model instances) 的变化.因为不需要修改模型本身的代码,在进行跨应用 (

Python - Django - request 对象

request.method: 获取请求的方法,例如 GET.POST 等 views.py: from django.shortcuts import render, HttpResponse # request 对象 def test(request): print(request.method) return render(request, "test.html") 访问页面 可以通过 request.method 查看请求方式 request.GET: 用来获取 URL 里面的

Django WSGIRequest对象

1. WSGIRequest对象作用 Django在接收到http请求之后,会根据http请求携带的参数以及报文信息创建一个WSGIRequest对象,并且作为视图函数第一个参数传给视图函数.也就是我们经常看到的request参数.在这个对象上我们可以找到客户端上传上来的所有信息.这个对象的完整路径是django.core.handlers.wsgi.WSGIRequest. def index(request): print(type(request)) pass #打印结果:<class '