Django学习-第十一讲(下):视图高级(一)网页请求限制、HttpRequest、HttpResponse、JsonResponse对象

1. 网页常用的请求method

  • 1.GET请求:
    GET请求一般用来向服务器索取数据,但不会向服务器提交数据,不会对服务器的状态进行更改。比如向服务器获取某篇文章的详情。

  • 2.POST请求:
    POST请求一般是用来向服务器提交数据,会对服务器的状态进行更改。比如提交一篇文章给服务器。

2. 限制请求装饰器

Django内置的视图装饰器可以给视图提供一些限制。比如这个视图只能通过GET的method访问等。以下将介绍一些常用的内置视图装饰器

  • 1.django.views.decorators.http.require_http_methods
    这个装饰器需要传递一个允许访问的方法的列表
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

3. 页面重定向

重定向分为永久性重定向和暂时性重定向,在页面上体现的操作就是浏览器会从一个页面自动跳转到另外一个页面。比如用户访问了一个需要权限的页面,但是该用户当前并没有登录,因此我们应该给他重定向到登录页面。

    1. 永久性重定向:
      http的状态码是301,多用于旧网址被废弃了要转到一个新的网址确保用户的访问,最经典的就是京东网站,你输入www.jingdong.com的时候,会被重定向到www.jd.com,因为jingdong.com这个网址已经被废弃了,被改成jd.com,所以这种情况下应该用永久重定向。
    1. 暂时性重定向:
      http的状态码是302,表示页面的暂时性跳转。比如访问一个需要权限的网址,如果当前用户没有登录,应该重定向到登录页面,这种情况下,应该用暂时性重定向。

在Django中,重定向是使用redirect(to, *args, permanent=False, **kwargs)来实现的。to是一个urlpermanent代表的是这个重定向是否是一个永久的重定向,默认是False

from django.shortcuts import reverse,redirect
def profile(request):
    if request.GET.get("username"):
        return HttpResponse("%s,欢迎来到个人中心页面!")
    else:
        return redirect(reverse("user:login"))

4. HttpRequest 对象

4.1 WSGIRequest对象

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

4.2 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']

```
  1. REMOTE_HOST:客户端的主机名。
  2. REQUEST_METHOD:请求方法。一个字符串类似于GET或者POST
  3. SERVER_NAME:服务器域名。
  4. SERVER_PORT:服务器端口号,是一个字符串类型。

4.3 WSGIRequest对象常用方法

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

5.HttpResponse对象

Django服务器接收到客户端发送过来的请求后,会将提交上来的这些数据封装成一个HttpRequest对象传给视图函数。那么视图函数在处理完相关的逻辑后,也需要返回一个响应给浏览器。而这个响应,我们必须返回HttpResponseBase或者他的子类的对象。而HttpResponse则是HttpResponseBase用得最多的子类

5.1 HttpResponse常用属性

1.content:返回的内容。

response = HttpResponse()
response.content = "首页"
return response

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'。

5.2 常用方法

  • 1.set_cookie:用来设置cookie信息。

  • 2.delete_cookie:用来删除cookie信息。

  • 3.write:HttpResponse是一个类似于文件的对象,可以用来写入数据到数据体(content)中。

6. JsonResponse类

用来对象dump成json字符串,然后返回将json字符串封装成Response对象返回给浏览器。并且他的Content-Type是application/json。

from django.http import JsonResponse
def index(request):
    return JsonResponse({"username":"juran","age":18})

默认情况下JsonResponse只能对字典进行dump,如果想要对非字典的数据进行dump,那么需要给JsonResponse传递一个safe=False参数。

from django.http import JsonResponse
def index(request):
    persons = ['张三','李四','王五']
    return JsonResponse(persons)

以上代码会报错,应该在使用HttpResponse的时候,传入一个safe=False参数,列表和元组在最终页面解析的时候都会解析成列表。

return JsonResponse(persons,safe=False,json_dumps_params={'ensure_ascii':False})

猜你喜欢

转载自blog.csdn.net/scyllake/article/details/109263772