视图层 View
视图层是 Django 处理请求和返回响应的核心位置。
你可以把视图理解成:当浏览器访问某个地址后,Django 最终交给某段 Python 代码来处理,这段代码通常就是视图。
所以视图层的任务很明确:
- 接收请求
- 处理逻辑
- 返回结果
本节目标
- 理解视图的作用
- 学会编写最基础的函数视图
- 理解
request对象里有什么 - 学会获取 GET 和 POST 参数
- 学会返回文本、页面和 JSON
- 理解重定向、Cookie、Session 的基础用法
- 初步了解类视图
什么是视图
一个最简单的视图长这样:
from django.http import HttpResponse
def index(request):
return HttpResponse("你好,Django")这段代码的意思是:
- 浏览器发来请求
- Django 调用
index index返回一个响应对象- 浏览器收到结果并显示出来
所以你可以先把视图理解成“请求进来后执行的处理函数”。
视图到底在网站里干什么
举几个常见例子:
场景 1:显示首页
用户访问 /,视图返回首页内容。
场景 2:搜索
用户访问 /search/?q=python,视图读取关键字,然后返回搜索结果。
场景 3:登录提交
用户提交用户名和密码,视图接收 POST 数据,然后做校验。
场景 4:接口返回 JSON
前端发 Ajax 请求,视图返回 JSON 数据给前端处理。
所以视图既可以返回页面,也可以返回文本、JSON、重定向等不同类型的结果。
一个请求是怎么走到视图的
这条链路你必须搞清楚:
- 浏览器访问某个 URL
- Django 根据路由找到对应视图
- 视图接收
request - 视图处理逻辑
- 视图返回响应对象
- 浏览器显示结果
如果这条链路不清楚,你后面学模板、表单、模型都会觉得散。
最基础的函数视图
from django.http import HttpResponse
def hello(request):
return HttpResponse("欢迎学习 Django 视图")如果路由配置为:
path("hello/", hello)访问:
/hello/页面会显示:
欢迎学习 Django 视图request 对象是什么
视图函数的第一个参数通常都是 request。
你可以把它理解成:浏览器这次请求带来的全部信息集合。
里面常见信息包括:
- 请求方法
- 请求路径
- GET 参数
- POST 参数
- 请求头
- Cookie
- Session
- 当前登录用户
查看请求方法
from django.http import HttpResponse
def test_method(request):
return HttpResponse(f"请求方法是:{request.method}")如果浏览器普通访问页面,通常是 GET 请求,所以页面可能显示:
请求方法是:GET获取 GET 参数
GET 参数通常出现在 URL 后面。
例如:
/search/?q=python视图写法:
from django.http import HttpResponse
def search(request):
keyword = request.GET.get("q")
return HttpResponse(f"你搜索的内容是:{keyword}")如果访问:
/search/?q=python页面显示:
你搜索的内容是:python.get() 为什么常用
因为如果参数不存在,.get() 默认返回 None,不会像字典强取值那样直接报错。
获取 POST 参数
POST 参数通常来自表单提交。
例如表单:
<form method="post" action="/submit/">
<input type="text" name="username">
<button type="submit">提交</button>
</form>对应视图:
from django.http import HttpResponse
def submit(request):
username = request.POST.get("username")
return HttpResponse(f"收到的用户名是:{username}")如果用户输入:
小明提交后页面可能显示:
收到的用户名是:小明区分 GET 和 POST
这是初学阶段必须明确的基础。
GET
常用于:
- 获取页面
- 获取数据
- 搜索查询
特点:
- 参数通常直接显示在 URL 中
POST
常用于:
- 提交表单
- 新增数据
- 登录请求
特点:
- 参数通常不直接写在 URL 上
返回不同类型的响应
视图不只是返回文本。
1. 返回纯文本
from django.http import HttpResponse
def text_view(request):
return HttpResponse("这是一段文本响应")2. 返回 HTML 页面
from django.shortcuts import render
def home(request):
return render(request, "home.html")这表示渲染模板页面并返回给浏览器。
3. 返回 JSON
from django.http import JsonResponse
def user_info(request):
return JsonResponse({
"name": "小明",
"age": 18,
"city": "上海"
})浏览器里会看到 JSON 结果:
{"name": "小明", "age": 18, "city": "上海"}这种写法非常适合接口开发或前后端交互。
4. 重定向
from django.shortcuts import redirect
def go_home(request):
return redirect("/")这表示让浏览器跳转到另一个地址。
渲染模板并传数据
这是视图中非常常见的用法。
from django.shortcuts import render
def profile(request):
context = {
"name": "小明",
"age": 18
}
return render(request, "profile.html", context)模板 profile.html:
<h1>{{ name }}</h1>
<p>年龄:{{ age }}</p>页面最终显示:
小明
年龄:18这就是视图和模板之间最基础的配合。
Cookie 和 Session
这两个概念在登录和状态保存中非常重要。
Cookie 是什么
Cookie 是保存在浏览器端的一小段数据。
Session 是什么
Session 通常是服务端保存的用户会话数据。
设置 Cookie
from django.http import HttpResponse
def set_cookie_view(request):
response = HttpResponse("Cookie 设置成功")
response.set_cookie("username", "xiaoming")
return response读取 Cookie
from django.http import HttpResponse
def get_cookie_view(request):
username = request.COOKIES.get("username")
return HttpResponse(f"Cookie 中的用户名是:{username}")设置 Session
from django.http import HttpResponse
def set_session_view(request):
request.session["username"] = "xiaoming"
return HttpResponse("Session 设置成功")读取 Session
from django.http import HttpResponse
def get_session_view(request):
username = request.session.get("username")
return HttpResponse(f"Session 中的用户名是:{username}")零基础阶段你先知道:
- Cookie 更偏浏览器端
- Session 更偏服务端
一个完整小案例:搜索页面
视图:
from django.shortcuts import render
def search_page(request):
keyword = request.GET.get("q", "")
data = ["Python", "Django", "Linux", "MySQL"]
if keyword:
result = [item for item in data if keyword.lower() in item.lower()]
else:
result = data
return render(request, "search.html", {
"keyword": keyword,
"result": result
})模板:
<h1>搜索页面</h1>
<form method="get">
<input type="text" name="q" value="{{ keyword }}">
<button type="submit">搜索</button>
</form>
{% for item in result %}
<p>{{ item }}</p>
{% endfor %}如果访问:
/search-page/?q=py页面可能显示:
Python这个例子很重要,因为它串起来了:
- 读取 GET 参数
- 处理数据
- 把数据传给模板
- 把结果渲染出来
类视图
前面讲的是函数视图。除此之外,Django 还支持类视图。
例如:
from django.http import HttpResponse
from django.views import View
class HelloView(View):
def get(self, request):
return HttpResponse("这是类视图")类视图的好处是:
- 结构更清晰
- 更适合复杂逻辑
- 更方便继承和复用
但零基础阶段先把函数视图学扎实更重要。
常见错误
1. 视图写了,但路由没配
这会导致访问地址时直接 404。
2. 把 GET 参数和 POST 参数混用
例如本来应该:
request.POST.get("username")却写成:
request.GET.get("username")3. 返回值不是合法响应对象
视图不能随便返回一个普通字符串,通常要返回:
HttpResponseJsonResponserender(...)redirect(...)
4. 忘记 CSRF
表单提交尤其是 POST 请求时,后面会遇到 CSRF 校验问题。零基础阶段先知道这是 Django 的安全机制即可。
练习题
练习 1
写一个视图,返回一句欢迎文本。
练习 2
写一个视图,读取 GET 参数 name,并返回“你好,某某”。
练习 3
写一个视图,返回 JSON 格式的学员信息。
练习 4
写一个视图,设置 Cookie,再写一个视图读取这个 Cookie。
练习 5
写一个搜索小页面,使用 GET 参数控制显示结果。
本节小结
视图层的本质,就是网站请求处理的入口。
你这一节最重要的收获应该是:
- 视图负责处理请求并返回响应
request中携带了请求信息- 视图可以返回文本、页面、JSON 和重定向
- GET 和 POST 要分清
- 视图可以和模板、Cookie、Session 配合工作
只要这一层吃透,后面 Django 的页面渲染和表单处理就有了明确落点。