Django视图——请求和响应

对应Django中,视图是与URL是一一对应的,每一个请求对应一个URL,URL映射到具体的视图函数(类),传递HttpRequest,视图处理之后返回HttpResponse。

视图的请求与响应对象

在调用视图和浏览器返回的这个过程中,会涉及到两个对象:HttpRequest和HttpResponse,即请求与响应对象。

HttpRequest

HttpRequest对象定义于django/http/request.py文件中,每当请求到来的时候,Django就会创建一个携带有请求元数据的HttpRequest对象,传递给视图函数的第一个参数。视图函数中的处理逻辑就是根据这些元数据做出相应的动作。HttpRequest定义了很多属性和方法。常用的有:

  • method
    • method是一个字符串类型的值,标识请求所使用的HTTP方法,例如GET、POST、PUT等。这是最常用到的一个属性。
  • scheme
    • 这是一个被@property装饰的方法,返回字符串类型的值。它可以被当作属性直接调用(request.scheme)。它用来标识请求的协议类型(http或https)。
  • path
    • 其为字符串类型,返回当前请求页面的路径,但是不包括协议类型(scheme)和域名。例如,对于请求http://127.0.0.1:8000/post/hello/,path返回的是/post/hello/。
  • path_info
    • 与path属性类型,但是在某些 Web 服务器配置下,主机名之后的 URL 部分被拆分为脚本前缀部分和路径信息部分。而该属性始终包含路径的路径信息部分,
  • GET
    • 这是一个类字典对象,包含GET请求中的所有参数。大多数HTTP请求都会携带有参数,例如,将之前访问的URL修改成http://127.0.0.1:8000/post/hello/?a=1&b=2&c=3,就可以通过GET属性获取到a、b、c三个参数了。GET属性中的键和值都是字符串类型
    • 获取参数的方法有两种。
      • request.GET['a']
        • 可以获取到参数a,但是使用这种方式需要确保参数a是存在的,否则会抛出MultiValueDictKeyError错误。
      • request.GET.get('d',0)
        • 种方式尝试从GET属性中获取属性d,获取不到,则返回数字0,与第一种方式相比更加安全。
    • 对于GET属性需要注意,它并不是Python中的字典类型,实际上它是一个QueryDict(django.http.QueryDict)类型的实例,且它是只读的。如果需要修改它,可以通过copy方法获取它的副本,并在副本上执行修改。
  • POST
    • 与GET属性类似,POST属性中保存的是POST请求中提交的表单数据,同样,它也是一个QueryDict类型的实例对象。获取POST属性中参数的方式与操作GET属性是类似的。
    • 需要注意的是,在使用POST方法上传文件时,文件相关的信息不会保存在POST中,而是保存在FILES属性中。
  • FILES
    • 这个属性只有在上传文件的时候才会用到,它也是一个类字典对象,包含所有的上传文件数据。FILES属性中的每个键是<inputtype="file"name=""/>中的name值,FILES中的每个值是一个UploadedFile。
  • COOKIES
    • 它是一个Python字典(dict)对象,键和值都是字符串,包含了一次请求的Cookie信息
  • META
    • 它也是一个Python字典对象,包含了所有的HTTP头部信息(具体可用的头部信息还需要依赖客户端和服务器)。常用的有:
      • CONTENT_LENGTH:标识请求消息正文的长度,对于POST请求来说,这个请求头是必需的。
      • CONTENT_TYPE:请求正文的MIME类型,对应于/post/hello/请求,它的值可以是text/plain。
      • HTTP_HOST:客户端发送的HTTP主机头。
      • HTTP_USER_AGENT:通常被称为UA,用于标识浏览器的类型,如果视图返回的数据是需要区分浏览器的,那么这个字段会非常有用。
      • REMOTE_ADDR:客户端的IP地址,这个字段通常用于记录日志或根据IP确定地域再做处理。
      • REMOTE_HOST:客户端的主机名。
      • REQUEST_METHOD:标识HTTP请求方法,例如GET、POST等。
      • SERVER_NAME:服务器的主机名。
      • SERVER_PORT:服务器的端口号,用一个字符串标识,例如“8000”。
    • user
      • 标识当前登录用户的AUTH_USER_MODEL实例,它其实是Django用户系统中的User(auth.User)类型。这个属性由AuthenticationMiddleware中间件完成设置,在用户未登录的情况下,即匿名访问,user会被设置为AnonymousUser类型的实例。因为Web站点通常都会针对特定的用户提供服务(账户系统),所以,这个属性几乎在每个视图处理逻辑中都会用到。
    • session
      • 代表当前会话,是一个可读可写的字典
      • clean()
        • 可以删除当前的会话
      • set_expiry()
        • 设置会话的有效事件,单位是秒

HttpResponse

HttpResponse对象定义于django/http/response.py文件中,在视图中主动创建并返回。下面介绍HttpResponse的属性、方法和它常用的子类。

  • status_code
    • 状态码(status_code)是HttpResponse最重要的属性,用来标识一次请求的状态。常见的状态码有200标识请求成功、404标识请求的资源不存在、500标识服务器内部错等。
  • content
    • 存储响应内容的二进制字符串。
  • write方法
    • 这个方法将HttpResponse视为类文件对象,可以向其中添加响应数据。

简化开发过程,Django提供了许多方便使用的HttpResponse子类,用来处理不同类型的HTTP响应。

  • JsonResponse
    • JsonResponse是最常用的子类对象,用于创建JSON编码的响应值,定义于djang o/http/response.py文件中
  • HttpResponseRedirect
    • HttpResponseRedirect用于实现响应重定向,返回的状态码是302。它有一个必填的参数,用于指定重定向的URL地址。302表示当前请求的资源临时从不同的URI响应,常用在同一个站点内的跳转,如未登录用户访问页面重定向到登录页。
  • HttpResponsePermanentRedirect
    • 也是用来完成重定向的,不过防护的状态码是301,其被称为永久重定向。HTTP对301的解释是被请求的资源已经永久移动到新的位置,将来任何对此资源的引用都应该使用本响应返回的若干个URI之一,它最常用到的场景是域名跳转。
  • HttpResponseNotFound
    • HttpResponseNotFound继承自HttpResponse,只是将状态码修改为404。当请求的资源不存在时,可以使用这个响应对象。
  • HttpResponseBadRequest
    • 与HttpResponseNotFound类似,但是是错误请求,状态码是400
  • HttpResponseForbidden
    • 与HttpResponseNotFound类似,但是禁止访问,状态码是403
  • HttpResponseServerError
    • 与HttpResponseNotFound类似,但是内部服务器错,状态码是500
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HHYZBC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值