WSGIRequest对象

Django在接收到http请求之后,会根据http请求携带的参数以及报文信息创建一个WSGIRequest对象,并且作为视图函数第一个参数传给视图函数。这个参数就是django视图函数的第一个参数,通常写成request。在这个对象上我们可以找到客户端上传上来的所有信息。这个对象的完整路径是django.core.handlers.wsgi.WSGIRequest

http请求的url详解:

在了解WSGIRequest对象的属性和方法之前,我们先了解一下url的组成,通常来说url的完整组成如下,[]为可选:

protocol ://hostname[:port]/path/[;parameters][?query]#fragment

  • protocol: 网络协议,常用的协议有http/https/ftp等
  • hostname: 主机地址,可以是域名,也可以是IP地址
  • port: 端口 http协议默认端口是:80端口,在浏览器中默认会隐藏不显示
  • path:路径 网络资源在服务器中的指定路径
  • parameter: 参数 如果要向服务器传入参数,在这部分输入
  • query: 查询字符串 如果需要从服务器那里查询内容,在这里编辑
  • fragment:片段 网页中可能会分为不同的片段,如果想访问网页后直接到达指定位置,可以在这部分设置

WSGIRequest对象常用属性:

WSGIRequest对象上大部分的属性都是只读的。因为这些属性是从客户端上传上来的,没必要做任何的修改,在django视图中使用时,视图函数的第一个参数参数request就是WSGIRequest对象。以下将对一些常用的属性进行讲解:

  1. path:资源在服务器的完整“路径”,但不包含域名和参数,在url中也是path的内容。比如http://www.baidu.com/xxx/yyy/,那么path就是/xxx/yyy/
  2. method:代表当前请求的http方法。比如是GET、POST、delete或者是put等方法
  3. GET:一个django.http.request.QueryDict对象。操作起来类似于字典。这个属性中包含了所有以?xxx=xxx的方式上传上来的参数。
  4. POST:也是一个django.http.request.QueryDict对象。这个属性中包含了所有以POST方式上传上来的参数。
  5. FILES:也是一个django.http.request.QueryDict对象。这个属性中包含了所有上传的文件。
  6. COOKIES:一个标准的Python字典,包含所有的cookie,键值对都是字符串类型。
  7. session:一个类似于字典的对象。用来操作服务器的session
  8. user:user 只有当Django 启用 AuthenticationMiddleware 中间件时才可用。它的值是一个 setting.py 里面AUTH_USER_MODEL 字段所定义的类的对象,表示当前登录的用户。如果用户当前没有登录,user 将设为 django.contrib.auth.models.AnonymousUser 的一个实例。你可以通过 is_authenticated() 区分它们。

  9. META:存储的客户端发送上来的所有header信息,下面是这些常用的header信息:

    1.   CONTENT_LENGTH:请求的正文的长度(是一个字符串)。

    2.   CONTENT_TYPE:请求的正文的MIME类型。
    3.   HTTP_ACCEPT:响应可接收的Content-Type。
    4.   HTTP_ACCEPT_ENCODING:响应可接收的编码,用于告知服务器客户端所能够处理的编码方式和相对优先级。
    5.   HTTP_ACCEPT_LANGUAGE: 响应可接收的语言。
    6.   HTTP_HOST:客户端发送的HOST值。
    7.   HTTP_REFERER:在访问这个页面上一个页面的url。
    8.   QUERY_STRING:单个字符串形式的查询字符串(未解析过的形式)。
    9.   TE:设置传输实体的编码格式,表示请求发起者愿意接收的Transfer-Encoding类型(传输过程中的编码格式,代理服务器之间)
    10.   REMOTE_ADDR:客户端的IP地址。如果服务器使用了nginx做反向代理或者负载均衡,那么这个值返回的是127.0.0.1,这时候可以使用HTTP_X_FORWARDED_FOR来获取,所以获取ip地址的代码片段如下:
        if request.META.has_key('HTTP_X_FORWARDED_FOR'):
      ip = request.META['HTTP_X_FORWARDED_FOR']
      else:
      ip = request.META['REMOTE_ADDR']
    11.   REMOTE_HOST:客户端的主机名。
    12.   REQUEST_METHOD:请求方法。一个字符串类似于GET或者POST
    13.   SERVER_NAME:服务器域名。
    14.   SERVER_PORT:服务器端口号,是一个字符串类型。

WSGIRequest对象常用方法:

  1. is_secure():是否是采用https协议。
  2. is_ajax():是否采用ajax发送的请求。原理就是判断请求头中是否存在X-Requested-With:XMLHttpRequest
  3. get_host():服务器的域名。如果在访问的时候还有端口号,那么会加上端口号,在url中就是hostname+port。比如www.baidu.com:9000
  4. get_full_path():返回完整的path。如果有查询字符串,还会加上查询字符串,在url中就是path以及其后面的所有。比如/music/bands/?print=True
  5. get_raw_uri():获取请求的完整url

QueryDict对象:

我们平时用的request.GET、request.POST和request.FILES都是QueryDict对象,这个对象继承自dict,因此用法跟dict相差无几。其中用得比较多的是get方法和getlist方法。

  1. get方法:用来获取指定key的值,如果没有这个key,那么会返回None
  2. getlist方法:如果浏览器上传上来的key对应的值有多个,如果使用get取值,那么你只能取出最后面一个值,如果你想取到所有的值,那么就需要通过getlist这个方法获取。

django的htpp请求之WSGIRequest的更多相关文章

  1. 玩转Django的POST请求 CSRF

    玩转Django的POST请求 CSRF 不少麻油们玩django都会碰到这个问题,POST请求莫名其妙的返回 403 foribidden,希望这篇博文能解答所有问题 三种方法 To enable ...

  2. Django跨域请求之JSONP和CORS

    现在来新建一个Django项目server01,url配置为 url(r'^getData.html$',views.get_data) 其对应的视图函数为get_data: from django. ...

  3. python——django的post请求

    两次被同一块石头绊倒简直不可原谅!第一次写django程序的时候,就因为ajax post请求折腾了整整一天,时隔两个多月昨天又被虐一整晚.叔可忍婶儿也不能忍了!!!重要的事情写下来,为以后轻松碾压p ...

  4. django - django 承接nginx请求

    # -*- coding: utf-8 -*- import os import sys import tornado.ioloop import tornado.web import tornado ...

  5. django 启动和请求

    Django运行方式 调试模式 直接 python manage.py runserver python manage.py runserver python manage.py runserver ...

  6. django中HttpRequest请求

    视图的第一个参数必须是HttpRequest对象 在视图函数中,接收的request有如下属性: path:一个字符串,表示请求的页面的完整路径,不包含域名. method:一个字符串,表示请求使用的 ...

  7. django rest-framework 2.请求和响应

    一.请求对象 REST 框架引入Request来扩展常规的HttpRequest,并提供了更灵活的请求解析.Request对象的核心功能是request.data属性. 导入方式: from rest ...

  8. Django—跨域请求(jsonp)

    同源策略 如果两个页面的协议,端口(如果有指定)和域名都相同,则两个页面具有相同的源. 示例:两个Django demo demo1 url.py url(r'^demo1/',demo1), vie ...

  9. Python3+Django get/post请求实现教程

    一.说明 之前写了一篇“Python3+PyCharm+Django+Django REST framework开发教程”,想着直接介绍rest就完了.但回过头来看,一是rest在解耦的同时将框架复杂 ...

随机推荐

  1. vue组件中,iview的modal组件爬坑--modal的显示与否应该是使用v-show

    这是我第一次写博客,主要是记录下自己解决问题的过程和知识的总结,如有不对的地方欢迎指出来! 需求:点击btn,弹出modal显示图表(以折现图为例) 这应该是很基本的需求也是很容易实现的,代码和效果如 ...

  2. ES6学习之-let 和const命令

    let 和const命令 let命令 用来声明变量,类似于var .let声明的变量 只在let命令所在的代码块内有效. 在for循环里也是如此 每次循环其实都是一个代码块 function fn() ...

  3. 与“零值”作比较的 if 语句。

    笔试时候遇到的问题,在此做一下记录. 1.if语句中的布尔变量与零值作比较 不能用布尔变量与true,false,1,0直接作比较.布尔变量类型的语义是:零值为“假”,任何非零值都表示“真”.因为tr ...

  4. usb驱动之打印usb设备信息(二)

    以下是打印鼠标左右键及其他输入的源代码,详细说明见https://www.cnblogs.com/zhu-g5may/p/9309381.html /*参考/drivers/hid/usbhid/us ...

  5. Python3爬虫(十八) Scrapy框架(二)

    对Scrapy框架(一)的补充 Infi-chu: http://www.cnblogs.com/Infi-chu/ Scrapy优点:    提供了内置的 HTTP 缓存 ,以加速本地开发 .   ...

  6. 20155229 2016-2007-2 《Java程序设计》第一周学习总结

    20155229 2016-2007-2 <Java程序设计>第一周学习总结 教材学习内容总结 1~18章的提问: 第一章:怎样撰写Java才不会沦于死背API文件.使用"复制. ...

  7. 20155307 2017-2018-2 《Java程序设计》第2周学习总结

    20155307 2017-2018-2 <Java程序设计>第2周学习总结 教材学习内容总结 整数:short(2 byte).int(4 byte).long(8 byte) 字节(b ...

  8. ubuntu装openVPN会遇到的问题

    与Windows系统相比,Linux下安装OpenVPN的过程就显得有点曲折. 如果你使用的是Ubuntu系统,你可以直接使用命令sudo apt-get install -y openvpn来安装O ...

  9. java Hibernate UUID代码

    package mypack; import java.io.Serializable; import java.net.InetAddress; /** * 唯一主键生成办法.从Hibernate中 ...

  10. [BZOJ2127]happiness-[网络流-最小割]

    Description 传送门 Solution 按照最小割的思路考虑. 根据题意,当两个人都选文(理),需要砍掉两个人都选理(文)的加成:如果两个人选的不一样,就要都砍掉. 这是一个网络流建模的套路 ...