对应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,与第一种方式相比更加安全。
- request.GET['a']
- 对于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()
- 设置会话的有效事件,单位是秒
- 它也是一个Python字典对象,包含了所有的HTTP头部信息(具体可用的头部信息还需要依赖客户端和服务器)。常用的有:
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