视图在接收请求并处理后,必须返回HttpResponse对象或子对象。HttpRequest对象由Django创建,HttpResponse对象由开发人员创建。

HttpResponse

可以使用django.http.HttpResponse来构造响应对象。

1
HttpResponse(content=响应体, content_type=响应体数据类型, status=状态码)

也可通过HttpResponse对象属性来设置响应体、状态码:

  • content:表示返回的内容。
  • status_code:返回的HTTP响应状态码。

常见状态码

状态码介绍

HTTP 状态码负责表示客户端 HTTP 请求的返回结果、标记服务器端的处理是否正常、通知出现的错误等工作。借助状态码,用户可以知道服务器端是正常处理了请求,还是出现了错误。

image-20200905173120732

图:响应的状态码可描述请求的处理结果

状态码如 200 OK,以 3 位数字和原因短语组成。

数字中的第一位指定了响应类别,后两位无分类。响应类别有以下 5 种。

表 3-2-1:状态码的类别

类别 原因短语
1XX Informational(信息性状态码) 接收的请求正在处理
2XX Success(成功状态码) 请求正常处理完毕
3XX Redirection(重定向状态码) 需要进行附加操作以完成请求
4XX Client Error(客户端错误状态码) 服务器无法处理请求
5XX Server Error(服务器错误状态码) 服务器处理请求出错

常见状态码

  • 200 OK - [GET]:(成功)服务器成功返回用户请求的数据
  • 201 CREATED - [POST/PUT/PATCH]:(已建立)用户新建或修改数据成功
  • 204 NO CONTENT - [DELETE]:(无内容) 用户删除数据成功
  • 300 Multiple Choices: (多种选择) 针对请求,服务器可执行多种操作。服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择。
  • 301 Permanently Moved :(永久移动) 请求的网页已永久移动到新位置。服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。
  • 302 Temporarily Moved :(临时移动) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
  • 303 See Other: (查看其他位置) 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码
  • 304 Not Modified: (未修改) 自从上次请求后,请求的网页未修改过。服务器返回此响应时,不会返回网页内容。
  • 305 Use Proxy (使用代理) 请求者只能使用代理访问请求的网页。如果服务器返回此响应,还表示请求者应使用代理。
  • 307 Temporary Redirect (临时重定向) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
  • 400 INVALID REQUEST - [POST/PUT/PATCH]:(坏请求) 用户发出的请求有错误,服务器没有进行新建或修改数据的操作
  • 401 Unauthorized - [*]: (未授权) 表示用户没有权限(令牌、用户名、密码错误)
  • 403 Forbidden - [*]: (禁止)表示用户得到授权(与401错误相对),但是访问是被禁止的
  • 404 NOT FOUND - [*]:(未找到)用户发出的请求针对的是不存在的记录,服务器没有进行操作
  • 405 Method not allowed: (方法不被允许)不支持该Request的方法
  • 406 Not Acceptable:(无法接受)无法使用请求的内容特性来响应请求的网页,也就是后台的返回结果前台无法解析
  • 407 Proxy Authentication Required:(要求进行代理认证)与状态码401类似, 用于需要进行认证的代理服务器
  • 408 Request Timeout:(请求超时) 如果客户端完成请求时花费的时间太长, 服务器可以回送这个状态码并关闭连接
  • 410 Gone -[GET]:(过去的)用户请求的资源被永久删除,且不会再得到的
  • 422 Unprocesable entity - [POST/PUT/PATCH] :(不可处理)当创建一个对象时,发生一个验证错误
  • 500 INTERNAL SERVER ERROR - [*]:(服务器内部错误)服务器发生错误,用户将无法判断发出的请求是否成功

重点: 200、201、204、400、401、403、404、405、500

状态码设置

Django还提供了一系列HttpResponse的子类,可以快速设置状态码

  • HttpResponseRedirect 301

  • HttpResponsePermanentRedirect 302

  • HttpResponseNotModified 304

  • HttpResponseBadRequest 400

  • HttpResponseNotFound 404

  • HttpResponseForbidden 403

  • HttpResponseNotAllowed 405

  • HttpResponseGone 410

  • HttpResponseServerError 500

JsonResponse

若要返回json数据,可以使用JsonResponse来构造响应对象,作用:

  • 帮助我们将数据转换为json字符串
  • 设置响应头Content-Typeapplication/json
1
2
3
4
from django.http import JsonResponse

def demo_view(request):
return JsonResponse({'city': 'beijing', 'subject': 'python'})

重定向

Django2.0 新增了在 urls.py 中 app_name 来指定 namespace。

我们可以通过 reverse 函数来反向获取 url,从而实现重定向。

reverse语法

1
reverse("<namespace>:<url-name>", kwargs={"<kwarg>": "<val>"})

现在我们仍然可以用 reverse 函数和模板中的 url 获取 URL

1
2
3
4
reverse("users:index")
reverse("users:detail", kwargs={"uid": 2020})
{% url "users:index" %}
{% url "users:detail" uid=2020 %}

路由定义

在项目的总路由中,可以通过指定namespace来确定应用

1
2
3
4
5
6
from django.urls import path, include


urlpatterns = [
path('users/', include(('users.urls', 'userss')))
]

更进一步,把 namespace 定义到被 include 的 子路由users/urls.py 中去使用 app_name 定义名称空间

1
2
3
4
5
6
7
8
9
from django.urls import re_path, path
from users.views import RegisterView, LoginView, DetailView, IndexView

app_name = 'users'

urlpatterns = [
path('detail/<int:uid>/', DetailView.as_view(), name="detail"),
path("", IndexView, name="index")
]

视图实现

1
2
3
4
5
6
7
8
9
10
from django.http.response import HttpResponse
from django.shortcuts import redirect


def book_list(request):
return HttpResponse("图书列表页")


def index(request):
return redirect('books:bookList') # redirect(reverse('books:bookList'))