Skip to content

视图层 View

视图层是 Django 处理请求和返回响应的核心位置。

你可以把视图理解成:当浏览器访问某个地址后,Django 最终交给某段 Python 代码来处理,这段代码通常就是视图。

所以视图层的任务很明确:

  • 接收请求
  • 处理逻辑
  • 返回结果

本节目标

  • 理解视图的作用
  • 学会编写最基础的函数视图
  • 理解 request 对象里有什么
  • 学会获取 GET 和 POST 参数
  • 学会返回文本、页面和 JSON
  • 理解重定向、Cookie、Session 的基础用法
  • 初步了解类视图

什么是视图

一个最简单的视图长这样:

python
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、重定向等不同类型的结果。

一个请求是怎么走到视图的

这条链路你必须搞清楚:

  1. 浏览器访问某个 URL
  2. Django 根据路由找到对应视图
  3. 视图接收 request
  4. 视图处理逻辑
  5. 视图返回响应对象
  6. 浏览器显示结果

如果这条链路不清楚,你后面学模板、表单、模型都会觉得散。

最基础的函数视图

python
from django.http import HttpResponse


def hello(request):
    return HttpResponse("欢迎学习 Django 视图")

如果路由配置为:

python
path("hello/", hello)

访问:

text
/hello/

页面会显示:

text
欢迎学习 Django 视图

request 对象是什么

视图函数的第一个参数通常都是 request

你可以把它理解成:浏览器这次请求带来的全部信息集合。

里面常见信息包括:

  • 请求方法
  • 请求路径
  • GET 参数
  • POST 参数
  • 请求头
  • Cookie
  • Session
  • 当前登录用户

查看请求方法

python
from django.http import HttpResponse


def test_method(request):
    return HttpResponse(f"请求方法是:{request.method}")

如果浏览器普通访问页面,通常是 GET 请求,所以页面可能显示:

text
请求方法是:GET

获取 GET 参数

GET 参数通常出现在 URL 后面。

例如:

text
/search/?q=python

视图写法:

python
from django.http import HttpResponse


def search(request):
    keyword = request.GET.get("q")
    return HttpResponse(f"你搜索的内容是:{keyword}")

如果访问:

text
/search/?q=python

页面显示:

text
你搜索的内容是:python

.get() 为什么常用

因为如果参数不存在,.get() 默认返回 None,不会像字典强取值那样直接报错。

获取 POST 参数

POST 参数通常来自表单提交。

例如表单:

html
<form method="post" action="/submit/">
  <input type="text" name="username">
  <button type="submit">提交</button>
</form>

对应视图:

python
from django.http import HttpResponse


def submit(request):
    username = request.POST.get("username")
    return HttpResponse(f"收到的用户名是:{username}")

如果用户输入:

text
小明

提交后页面可能显示:

text
收到的用户名是:小明

区分 GET 和 POST

这是初学阶段必须明确的基础。

GET

常用于:

  • 获取页面
  • 获取数据
  • 搜索查询

特点:

  • 参数通常直接显示在 URL 中

POST

常用于:

  • 提交表单
  • 新增数据
  • 登录请求

特点:

  • 参数通常不直接写在 URL 上

返回不同类型的响应

视图不只是返回文本。

1. 返回纯文本

python
from django.http import HttpResponse


def text_view(request):
    return HttpResponse("这是一段文本响应")

2. 返回 HTML 页面

python
from django.shortcuts import render


def home(request):
    return render(request, "home.html")

这表示渲染模板页面并返回给浏览器。

3. 返回 JSON

python
from django.http import JsonResponse


def user_info(request):
    return JsonResponse({
        "name": "小明",
        "age": 18,
        "city": "上海"
    })

浏览器里会看到 JSON 结果:

json
{"name": "小明", "age": 18, "city": "上海"}

这种写法非常适合接口开发或前后端交互。

4. 重定向

python
from django.shortcuts import redirect


def go_home(request):
    return redirect("/")

这表示让浏览器跳转到另一个地址。

渲染模板并传数据

这是视图中非常常见的用法。

python
from django.shortcuts import render


def profile(request):
    context = {
        "name": "小明",
        "age": 18
    }
    return render(request, "profile.html", context)

模板 profile.html

html
<h1>{{ name }}</h1>
<p>年龄:{{ age }}</p>

页面最终显示:

text
小明
年龄:18

这就是视图和模板之间最基础的配合。

这两个概念在登录和状态保存中非常重要。

Cookie 是保存在浏览器端的一小段数据。

Session 是什么

Session 通常是服务端保存的用户会话数据。

python
from django.http import HttpResponse


def set_cookie_view(request):
    response = HttpResponse("Cookie 设置成功")
    response.set_cookie("username", "xiaoming")
    return response
python
from django.http import HttpResponse


def get_cookie_view(request):
    username = request.COOKIES.get("username")
    return HttpResponse(f"Cookie 中的用户名是:{username}")

设置 Session

python
from django.http import HttpResponse


def set_session_view(request):
    request.session["username"] = "xiaoming"
    return HttpResponse("Session 设置成功")

读取 Session

python
from django.http import HttpResponse


def get_session_view(request):
    username = request.session.get("username")
    return HttpResponse(f"Session 中的用户名是:{username}")

零基础阶段你先知道:

  • Cookie 更偏浏览器端
  • Session 更偏服务端

一个完整小案例:搜索页面

视图:

python
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
    })

模板:

html
<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 %}

如果访问:

text
/search-page/?q=py

页面可能显示:

text
Python

这个例子很重要,因为它串起来了:

  • 读取 GET 参数
  • 处理数据
  • 把数据传给模板
  • 把结果渲染出来

类视图

前面讲的是函数视图。除此之外,Django 还支持类视图。

例如:

python
from django.http import HttpResponse
from django.views import View


class HelloView(View):
    def get(self, request):
        return HttpResponse("这是类视图")

类视图的好处是:

  • 结构更清晰
  • 更适合复杂逻辑
  • 更方便继承和复用

但零基础阶段先把函数视图学扎实更重要。

常见错误

1. 视图写了,但路由没配

这会导致访问地址时直接 404。

2. 把 GET 参数和 POST 参数混用

例如本来应该:

python
request.POST.get("username")

却写成:

python
request.GET.get("username")

3. 返回值不是合法响应对象

视图不能随便返回一个普通字符串,通常要返回:

  • HttpResponse
  • JsonResponse
  • render(...)
  • redirect(...)

4. 忘记 CSRF

表单提交尤其是 POST 请求时,后面会遇到 CSRF 校验问题。零基础阶段先知道这是 Django 的安全机制即可。

练习题

练习 1

写一个视图,返回一句欢迎文本。

练习 2

写一个视图,读取 GET 参数 name,并返回“你好,某某”。

练习 3

写一个视图,返回 JSON 格式的学员信息。

练习 4

写一个视图,设置 Cookie,再写一个视图读取这个 Cookie。

练习 5

写一个搜索小页面,使用 GET 参数控制显示结果。

本节小结

视图层的本质,就是网站请求处理的入口。

你这一节最重要的收获应该是:

  • 视图负责处理请求并返回响应
  • request 中携带了请求信息
  • 视图可以返回文本、页面、JSON 和重定向
  • GET 和 POST 要分清
  • 视图可以和模板、Cookie、Session 配合工作

只要这一层吃透,后面 Django 的页面渲染和表单处理就有了明确落点。

Built with VitePress.