Django学习笔记之视图高级-HTTP请求与响应
Django限制请求method
常用的请求method
GET请求
GET请求一般用来向服务器索取数据,但不会向服务器提交数据,不会对服务器的状态进行更改。比如向服务器获取某篇文章的详情。
POST请求
POST请求一般是用来向服务器提交数据,会对服务器的状态进行更改。比如提交一篇文章给服务器。
限制请求装饰器
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"))
WSGIRequest对象
Django在接收到http请求之后,会根据http请求携带的参数以及报文信息创建一个WSGIRequest对象,并且作为视图函数第一个参数传给视图函数。也就是我们经常看到的request参数。在这个对象上我们可以找到客户端上传上来的所有信息。这个对象的完整路径是django.core.handlers.wsgi.WSGIRequest。
WSGIRequest对象常用属性
WSGIRequest对象上大部分的属性都是只读的。因为这些属性是从客户端上传上来的,没必要做任何的修改。以下将对一些常用的属性进行讲解:
1.path
请求服务器的完整“路径”,但不包含域名和参数。比如http://www.baidu.com/xxx/yyy/,那么path就是/xxx/yyy/。
2.method
代表当前请求的http方法。比如是GET还是POST。
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.META
存储的客户端发送上来的所有header信息。
9.CONTENT_LENGTH
请求的正文的长度(是一个字符串)。
10.CONTENT_TYPE
请求的正文的MIME类型。
11.HTTP_ACCEPT
响应可接收的Content-Type。
12.HTTP_ACCEPT_ENCODING
响应可接收的编码。
13.HTTP_ACCEPT_LANGUAGE
响应可接收的语言。
14.HTTP_HOST
客户端发送的HOST值。
15.HTTP_REFERER
在访问这个页面上一个页面的url。
16.QUERY_STRING
单个字符串形式的查询字符串(未解析过的形式)。
17.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']
18.REMOTE_HOST
客户端的主机名。
19.REQUEST_METHOD
请求方法。一个字符串类似于GET或者POST。
20.SERVER_NAME
服务器域名。
21.SERVER_PORT
服务器端口号,是一个字符串类型。
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。
QueryDict对象
我们平时用的request.GET和request.POST都是QueryDict对象,这个对象继承自dict,因此用法跟dict相差无几。其中用得比较多的是get方法和getlist方法。
get方法:用来获取指定key的值,如果没有这个key,那么会返回None。getlist方法:如果浏览器上传上来的key对应的值有多个,那么就需要通过这个方法获取。
HttpResponse对象
Django服务器接收到客户端发送过来的请求后,会将提交上来的这些数据封装成一个HttpRequest对象传给视图函数。那么视图函数在处理完相关的逻辑后,也需要返回一个响应给浏览器。而这个响应,我们必须返回HttpResponseBase或者他的子类的对象。而HttpResponse则是HttpResponseBase用得最多的子类。那么接下来就来介绍一下HttpResponse及其子类。
常用属性
1.content
返回的内容。
2.status_code
返回的HTTP响应状态码。
3.content_type
返回的数据的MIME类型,默认为text/html 。浏览器会根据这个属性,来显示数据。如果是text/html,那么就会解析这个字符串,如果text/plain,那么就会显示一个纯文本。常用的Content-Type如下:
- text/html(默认的,html文件)
- text/plain(纯文本)
- text/css(css文件)
- text/javascript(js文件)
- multipart/form-data(文件提交)
- application/json(json传输)
- application/xml(xml文件)
4.设置请求头
response['X-Access-Token'] = 'xxxx'。
常用方法
1.set_cookie
用来设置cookie信息。后面讲到授权的时候会着重讲到。
2.delete_cookie
用来删除cookie信息。
3.write
HttpResponse是一个类似于文件的对象,可以用来写入数据到数据体(content)中。
JsonResponse类
用来对象dump成json字符串,然后返回将json字符串封装成Response对象返回给浏览器。并且他的Content-Type是application/json。示例代码如下:
from django.http import JsonResponse
def index(request):
return JsonResponse({"username":"zhiliao","age":18})
默认情况下JsonResponse只能对字典进行dump,如果想要对非字典的数据进行dump,那么需要给JsonResponse传递一个safe=False参数。示例代码如下:
from django.http import JsonResponse
def index(request):
persons = ['张三','李四','王五']
return HttpResponse(persons)
以上代码会报错,应该在使用HttpResponse的时候,传入一个safe=False参数,示例代码如下:
return HttpResponse(persons,safe=False)
浙公网安备 33010602011771号