当一个页面被请求时,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. 【AC自动机】最短母串

      [题目链接] https://loj.ac/problem/10061 [题意] 给定 n 个字符串 S1-Sn,要求找到一个最短的字符串 T,使得这 n 个字符串都是 T 的子串. [题解] 类似于 ...

    2. BurpSuite 爆破网页后台登陆

      由于 Burp Suite是由Java语言编写而成,所以你需要首先安装JAVA的运行环境,而Java自身的跨平台性,使得软件几乎可以在任何平台上使用.Burp Suite不像其他的自动化测试工具,它需 ...

    3. 怎样理解undefined和 null

      前言: undefined表示 "未定义", null 表示 "空" 第一步: 一般在变量或属性没有声明或者声明以后没有赋值时, 这个变量的值就是undefin ...

    4. springboot由于bean加载顺序导致的问题

      先记录现象: dubbo整合zipkin时,我的配置文件是这样的 @Bean("okHttpSender") public OkHttpSenderFactoryBean okHt ...

    5. Spring Boot Redis 集成 Error creating bean with name 'enableRedisKeyspaceNotificationsInitializer'

      一.原因:redis集群环境没有开启Keyspace notifications 二.解决办法 @Configuration public class HttpSessionConfig { /** ...

    6. 远程连接windows2003桌面无法使用剪切板的有效解决方法

      远程桌面控制服务器时,无法剪切.粘贴一些东西,上网搜了一下,原来是rdpclip.exe(remote desktop clipboard)不起作用了.此程序负责管理本地机与远程服务器之间共享剪切板, ...

    7. vue 通过 name 和 params 进行调整页面传参刷新参数丢失问题&vue路由可选参数

      vue  通过 name 和 params 进行调整页面传参刷新参数丢失问题 router.js: export default new Router({ routes: [ { path: '/', ...

    8. 一个SDL2.0程序的分析

      //把图片加载到SDL_Texture SDL_Texture* loadTexture(const std::string &file, SDL_Renderer *ren){       ...

    9. 【温故知新】php 魔术方法

      <?php class Magic{ private $name; /** *构造方法,在类被实例化时自动调用,一般用于初始化操作 */ public function __construct( ...

    10. 关于操作git

      手册:http://www.yiibai.com/git/ 一.安装git,可以通过git bash执行命令行:安装tortoiseGit执行git相关操作,在那之前需要了解下git命令行操作 二.在 ...