目标
- 限制请求method
- 页面重定向
- HttpRequest 对象
- HttpResponse 对象
- 生产CVS 文件
- 类视图
- 错误处理
一 限制请求method
1-1 常用的请求method
1. GET请求:GET请求一般用来向服务器索取数据,但不会向服务器提交数据,不会对服务器的状态进行更改。比如向服务器获取某篇文章的详情。
2. POST请求 :POST请求一般是用来向服务器提交数据,会对服务器的状态进行更改。比如提交一篇文章给服务器。
1-2 限制请求装饰器
Django
内置的视图装饰器可以给视图提供一些限制。比如这个视图只能通过GET
的method
访问等。以下将介绍一些常用的内置视图装饰器。
1. django.http.decorators.http.require_http_methods
:这个装饰器需要传递一个允许访问的方法的列表。比如只能通过GET
的方式访问。那么示例代码如下:
from django.views.decorators.http import require_http_methods @require_http_methods(["GET"]) def my_view(request): pass
2. django.views.decorators.http.require_GET
:这个装饰器相当于是require_http_methods(['GET'])
的简写形式,只允许使用GET
的method
来访问视图。示例代码如下:
from django.views.decorators.http import require_GET @require_GET def my_view(request): pass
3. django.views.decorators.http.require_POST
:这个装饰器相当于是require_http_methods(['POST'])
的简写形式,只允许使用POST
的method
来访问视图。示例代码如下:
from django.views.decorators.http import require_POST @require_POST def my_view(request): pass
4. django.views.decorators.http.require_safe
:这个装饰器相当于是require_http_methods(['GET','HEAD'])
的简写形式,只允许使用相对安全的方式来访问视图。因为GET
和HEAD
不会对服务器产生增删改的行为。因此是一种相对安全的请求方式。示例代码如下:
from django.views.decorators.http import require_safe @require_safe def my_view(request): pass
二 页面重定向
重定向分为永久性重定向和暂时性重定向,在页面上体现的操作就是浏览器会从一个页面自动跳转到另外一个页面。比如用户访问了一个需要权限的页面,但是该用户当前并没有登录,因此我们应该给他重定向到登录页面。
- 永久性重定向:http的状态码是301,多用于旧网址被废弃了要转到一个新的网址确保用户的访问,最经典的就是京东网站,你输入www.jingdong.com的时候,会被重定向到www.jd.com,因为jingdong.com这个网址已经被废弃了,被改成jd.com,所以这种情况下应该用永久重定向。
- 暂时性重定向:http的状态码是302,表示页面的暂时性跳转。比如访问一个需要权限的网址,如果当前用户没有登录,应该重定向到登录页面,这种情况下,应该用暂时性重定向。
在Django
中,重定向是使用redirect(to, *args, permanent=False, **kwargs)
来实现的。to
是一个url
,permanent
代表的是这个重定向是否是一个永久的重定向,默认是False
。关于重定向的使用。请看以下例子:
from django.shortcuts import reverse,redirect def profile(request): if request.GET.get("username"): return HttpResponse("%s,欢迎来到个人中心页面!") else: return redirect(reverse("user:login"))
三 HttpRequest 对象
3-1 WSGIRequest 对象
Django在接收到http请求之后,会根据http请求携带的参数以及报文信息创建一个WSGIRequest
对象,并且作为视图函数第一个参数传给视图函数。也就是我们经常看到的request
参数。在这个对象上我们可以找到客户端上传上来的所有信息。这个对象的完整路径是django.core.handlers.wsgi.WSGIRequest
。
3-1-1 WSGIRequest对象常用属性:
WSGIRequest
对象上大部分的属性都是只读的。因为这些属性是从客户端上传上来的,没必要做任何的修改。以下将对一些常用的属性进行讲解:
- path:请求服务器的完整“路径”,但不包含域名和参数。比如
http://www.baidu.com/xxx/yyy/
,那么path
就是/xxx/yyy/
。 - method:代表当前请求的
http
方法。比如是GET
还是POST
。 - GET:一个
django.http.request.QueryDict
对象。操作起来类似于字典。这个属性中包含了所有以?xxx=xxx
的方式上传上来的参数。 - POST:也是一个
django.http.request.QueryDict
对象。这个属性中包含了所有以POST
方式上传上来的参数。 - FILES:也是一个
django.http.request.QueryDict
对象。这个属性中包含了所有上传的文件。 - COOKIES:一个标准的Python字典,包含所有的
cookie
,键值对都是字符串类型。 - session:一个类似于字典的对象。用来操作服务器的
session
。 - META:存储的客户端发送上来的所有
header
信息。 - CONTENT_LENGTH:请求的正文的长度(是一个字符串)。
- HTTP_ACCEPT:响应可接收的Content-Type。
HTTP_ACCEPT_ENCODING
:响应可接收的编码。HTTP_ACCEPT_LANGUAGE
: 响应可接收的语言。HTTP_HOST
:客户端发送的HOST值。HTTP_REFERER
:在访问这个页面上一个页面的url。QUERY_STRING
:单个字符串形式的查询字符串(未解析过的形式)。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']
REMOTE_HOST
:客户端的主机名。REQUEST_METHOD
:请求方法。一个字符串类似于GET
或者POST。
SERVER_NAME
:服务器域名。SERVER_PORT
:服务器端口号,是一个字符串类型。
3-1-2 WSGIRequest对象常用方法
is_secure()
:是否是采用https
协议。is_ajax()
:是否采用ajax
发送的请求。原理就是判断请求头中是否存在X-Requested-With:XMLHttpRequest。
get_host()
:服务器的域名。如果在访问的时候还有端口号,那么会加上端口号。比如www.baidu.com:9000。
get_full_path()
:返回完整的path。如果有查询字符串,还会加上查询字符串。比如/music/bands/?print=True。
get_raw_uri()
:获取请求的完整url。