当一个页面被请求时,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. Spring实战(一)Spring简介---呕心沥血只为让Java开发更简单。

      Spring诞生的初衷是为了替代更加重量级的企业级Java技术(EJB). 相对于EJB来说,Spring提供了更加轻量级和简单的编程模型,它增强了POJO(简单老式Java对象)的功能,使简单的Ja ...

    2. [NOIP10.5模拟赛]1.a题解--离散化+异或线段树

      题目链接: 咕咕咕 https://www.luogu.org/problemnew/show/CF817F 闲扯 在Yali经历几天折磨后信心摧残,T1数据结构裸题考场上连暴力都TM没打满 分析 观 ...

    3. 关于SpringMVC的几件小事

      一.SpringMVC表单标签He处理静态资源 1.Spring的表单标签 通过SpringMVC的表单标签可以实现将模型数据中的属性和HTML表单元素相绑定,以实现表单数据更便捷编辑和表单值的回显. ...

    4. ember server禁用Livereload server on http://localhost:49152

      ember server --live-reload=false

    5. Innosetup设置控制面版中的名称显示和图标

      //设置控制面板中程序图标UninstallDisplayIcon={app}\logo.ico //设置控制面板中程序的名称Uninstallable=yesUninstallDisplayName ...

    6. C++ DLL导出的两种方式和链接的两种方式

      第一种 导出方式 extern "C" _declspec(dllexport) int Plus(int x, int y); extern "C" _dec ...

    7. swagger 的使用

      最近在用 .Net Core 做项目 了解到swagger 是一个不错的工具 简单介绍一下 在使用asp.net core 进行api开发完成后,书写api说明文档对于程序员来说想必是件很痛苦的事情吧 ...

    8. Mina TCP服务端客户端 示例

      服务端代码: package com.xd.nms.example; import java.io.IOException; import java.net.InetSocketAddress; im ...

    9. vscode 踩坑汇总

      gopls 提示 update 将 "go.useLanguageServer": true 改为 "go.useLanguageServer": false

    10. Django restfulframework 开发相关知识 整理

      目录 目录 前言 前后端分离 实现前后端分离的方法 前后端分离带来的优点 RESTful十大规范 协议规范 域名规范 版本表示规范 url使用名词 http请求动词 过滤条件 状态码 错误信息 请求方 ...