Django 视图层详解
视图函数的基本构成
在 Django 中,每个处理 HTTP 请求的函数都必须接受一个 request 参数,用于访问请求相关的所有信息。
同时,视图函数需要返回一个 HttpResponse 类型的对象,常见的几种返回方式如下:
- HttpResponse:直接返回文本内容
def index_view(request):
return HttpResponse("这是页面显示的内容")
- render:渲染模板并返回 HTML 页面
def template_view(request):
context_data = {"username": "张三"}
return render(request, "index.html", context_data)
该函数会解析模板文件中的语法,并注入上下文数据。你可以传递局部或全局变量字典,但要注意控制数据量以避免性能问题。
- redirect:执行页面跳转
def redirect_view(request):
return redirect("/dashboard/") # 可使用相对路径或完整 URL
- JsonResponse:返回 JSON 数据格式
from django.http import JsonResponse
def json_view(request):
data = {'status': 'success', 'message': '操作完成'}
return JsonResponse(data, json_dumps_params={'ensure_ascii': False})
def list_json_view(request):
items = ['苹果', '香蕉']
return JsonResponse(items, safe=False)
其中 safe=False 允许非字典类型的 Python 对象被序列化为 JSON。
request 对象的常用属性
通过 request 对象可以获取客户端发送的各种数据:
request.GET:获取 GET 请求参数request.POST:获取 POST 表单数据request.FILES:获取上传的文件
若要支持文件上传,HTML 表单需满足以下条件:
- method 设置为
POST - enctype 设置为
multipart/form-data
<form method="post" enctype="multipart/form-data">
<input type="file" name="upload_file">
</form>
在视图中可通过 request.FILES['upload_file'] 获取文件对象,并进行保存或处理。
视图函数的核心职责
视图不仅负责业务逻辑的实现,还需与模型交互完成数据库操作。例如创建、查询、更新和删除记录等任务都可以在视图中调用模型方法来完成。
此外,为了将后端数据展示到前端页面,通常结合模板引擎(如 Django Templates)使用 render() 函数,把变量嵌入 HTML 模板中生成动态页面。
函数式视图 vs 类视图
类视图(CBV)基本结构
类视图继承自 django.views.View,根据不同的 HTTP 方法定义相应的方法:
# views.py
from django.views import View
from django.http import HttpResponse
class LoginHandler(View):
def get(self, request):
return HttpResponse('GET 请求已处理')
def post(self, request):
return HttpResponse('POST 请求已处理')
在路由配置中注册类视图:
# urls.py
from django.urls import path
from . import views
urlpatterns = [
path('login/', views.LoginHandler.as_view()),
]
类视图的工作原理
虽然写法不同,但本质上 CBV 最终也是通过函数响应请求。关键在于 .as_view() 方法:
- 调用
as_view()后返回一个函数,该函数会在每次请求时实例化你的类 - 接着调用
dispatch()方法识别请求类型(GET/POST 等) - 最后执行对应的类方法并返回结果
因此,类视图的优势在于自动按请求方法分发处理逻辑,无需手动判断请求方式。