『Django』视图views
本文简介
点赞 + 关注 + 收藏 = 学会了
上一篇 《『Django』路由urls》 中介绍了 Django
路由的用法,当时提到路由和视图其实是密不可分的合作伙伴。路由有点像饭店的服务员,引导顾客到指定的饭桌,然后根据顾客需求向厨房下单,厨师经过一番处理后,把煮好的菜传给顾客吃。这个厨师就是本文要介绍的『视图』。
什么是视图?
在 Django
中,视图的全称应该叫『视图函数』,简称视图(Views)。从字面上理解视图就是 Python
函数,是处理用户请求并返回相应内容的核心组件。通常会在视图函数里返回 HTML
网页、JSON
类型的接口、重定向、404等。
视图函数一般写在各应用下的 views.py
文件里。
视图决定了 Web
应用的行为和响应。在 Django
中,主要有两种类型的视图:
- FBV:基于函数的视图
- CBV:基于类的视图
FBV(Function-Based Views)和CBV(Class-Based Views)是两种处理视图的方式。
要使用视图需要2步,第1步是先创建一个路由指向视图函数,第2步是创建视图函数。
FBV:函数视图
FBV(Function-Based Views)是基于函数的视图方式。它是一种简单直观的方式,使用Python
函数来处理 HTTP
请求并返回响应。在FBV中,每个视图都是一个独立的 Python
函数,接收 HTTP
请求对象作为参数,并返回 HTTP
响应对象。
其实我们在前面的文章 《『Django』路由urls》 里用的都是函数视图。
先创建一个路由:
# urls.py 项目的路由文件
from django.urls import path
from blog.views import blogIndex
urlpatterns = [
path("blog/", blogIndex)
]
然后在 blog
这个应用里的 views.py
编写以下代码:
from django.http import HttpResponse
def blogIndex(request):
return HttpResponse(f'这里是博客模块的首页')
项目运行起来后,在浏览器访问 http://127.0.0.1:8000/blog/
CBV:类视图
CBV(Class-Based Views)是基于类的视图方式。它使用 Python
类来组织和管理视图逻辑。在CBV中,每个视图通常是一个类方法,用于处理不同类型的 HTTP
请求。CBV提供了更多的灵活性和可扩展性,允许你在不同的方法中组织视图逻辑。
使用类视图的话,路由文件和视图文件的代码都会有所不同。
先配置一下路由:
# urls.py 项目的路由文件
from django.urls import path
from blog.views import blogIndex
urlpatterns = [
path("blog/", blogIndex.as_view())
]
然后在 blog
这个应用里的 views.py
编写以下代码:
from django.http import HttpResponse
from django.views import View
class blogIndex(View):
def get(self, request):
return HttpResponse(f'雷猴,这里是博客模块的首页')
此时访问 http://127.0.0.1:8000/blog/
会看到这个界面。
在 Django
中,当你使用类视图时,需要调用 as_view()
方法来将类视图转换为可调用的视图函数。这是因为 Django
的 URL
路由系统需要将视图映射到 URL
模式,而类视图本身只是Python
类,无法直接作为视图函数使用。因此,需要使用 as_view()
方法将类视图转换为可调用的函数,以便在 URL
配置中使用。
在类视图中,需要确保你的类继承自 django.views.View
类或其子类,这样才能正确使用 as_view()
方法。django.views.View
类提供了一些基本的 HTTP
请求方法(如 GET
、POST
等),你可以在子类中覆盖这些方法来处理不同类型的请求。
关于 GET
和 POST
这些请求方法稍后会讲到。
请求与响应(以GET和POST举例)
客户端和服务器通常使用HTTP的方式进行数据传递,客户端向服务器发起对话时,会创建一个“请求对象”,而服务器回复客户端时会创建一个“响应对象”。
对于前端来说,通常就是用浏览器向服务器发起请求,用的是 Ajax
,现在流行使用 axios
这个库发起请求。
Django
这边会通过视图函数接收前端发起的请求,这个“请求对象”里通常包含请求头、请求方法等信息,Django
会将这个请求对象打包成 HttpRequest
对象,并使用第一个参数(request
) 来接收这个请求对象。
在函数视图中,通过解析 request
这个参数可以获取到客户端发起的请求方法(通常是 GET
和 POST
)。
先将项目的路由文件调整回函数视图的用法:
# urls.py 项目的路由文件
from django.urls import path
from blog.views import blogIndex
urlpatterns = [
path("blog/", blogIndex)
]
然后调整一下 blog
应用的函数视图
# blog/views.py
from django.http import HttpResponse
def blogIndex(request):
if request.method == 'GET':
return HttpResponse('使用了GET请求')
if request.method == 'POST':
return HttpResponse('使用了POST请求')
此时借助 Postman 工具分别向 http://127.0.0.1:8000/blog/
发起 GET
和 POST
请求
再看看 POST
请求。
默认情况下,使用 POST
、PUT
、PATCH
、DELETE
都是会报 403 这个错误的,这是因为 Django
默认开启防止csrf(跨站点请求伪造)攻击,此时有几种方法可以应对。
【方法1】
将项目配置文件的 django.middleware.csrf.CsrfViewMiddleware
注视掉。
# settings.py
MIDDLEWARE = [
"django.middleware.security.SecurityMiddleware",
"django.contrib.sessions.middleware.SessionMiddleware",
"django.middleware.common.CommonMiddleware",
# "django.middleware.csrf.CsrfViewMiddleware",
"django.contrib.auth.middleware.AuthenticationMiddleware",
"django.contrib.messages.middleware.MessageMiddleware",
"django.middleware.clickjacking.XFrameOptionsMiddleware",
]
MIDDLEWARE
里有一句 django.middleware.csrf.CsrfViewMiddleware
,将它注释掉再用 Postman 发起一次 POST
请求就有响应结果了。
【方法2】
方法1是全局配置,如果你只需要配置某个视图函数,可以给这个函数配置一个 csrf_exempt
装饰器。
# 找到指定的视图函数
# blog/views.py
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def blogIndex(request):
if request.method == 'GET':
return HttpResponse('使用了GET请求')
if request.method == 'POST':
return HttpResponse('使用了POST请求')
前面演示的都是通过 函数视图 来处理请求和响应,其实用 类视图 处理会更方便。
还是前面的例子,首先需要配置一下路由,让它能解释类函数。
# urls.py 项目的路由文件
from django.urls import path
from blog.views import blogIndex
urlpatterns = [
path("blog/", blogIndex.as_view())
]
接着在编写一下视图的代码
# blog/views.py
from django.http import HttpResponse
from django.views import View
class blogIndex(View):
def get(self, request):
return HttpResponse('雷猴,GET请求')
def post(self, request):
return HttpResponse('雷猴,POST请求')
使用 类视图 可以更直观的看出 GET
和 POST
的代码,减少 if...else...
这类判断的代码。
响应HTML模板
前面的例子都是响应一段字符串,这显然不能满足我们日常开发网站的需求。
Django
支持响应 HTML
页面给回客户端。
在视图里返回 HTML
内容即可。
# blog/views.py
from django.http import HttpResponse
def blogIndex(request):
html = """
<h2>这是博客首页</h2>
"""
return HttpResponse(html)
但这样书写 HTML
代码很不灵活,我们通常会将 HTML
代码写在 .html
文件里,这种方式在 Django
中称为“模板”。
模版的功能比较多,很适合单独开一篇文章来讲解,下一篇我们再介绍模板。
响应JSON
在前后端分离的项目中,后端通常只会返回数据内容给前端,而不是返回一个页面。返回的数据通常是以 JSON
为主。
此时我们需要用到 JsonResponse
来帮忙。具体的操作还是放在视图里。
# blog/views.py
def blogIndex(request):
res = {
'title': '雷猴',
'content': '这里是博客首页'
}
return JsonResponse(res)
此时用 Postman 发起请求会得到这段 JSON
数据。
出现乱码的这个问题可以将 json_dumps_params
设置为 False
来解决。
# blog/views.py
def blogIndex(request):
res = {
'title': '雷猴',
'content': '这里是博客首页'
}
return JsonResponse(res, json_dumps_params={'ensure_ascii': False})
以上就是本文的全部内容,下一篇介绍 Django
的模板功能。
点赞 + 关注 + 收藏 = 学会了