Skip to content

Django 入门:项目、路由与请求链 ​

Django 入门与 Hello World ​

前提与范围 ​

完成 Python 函数、模块和虚拟环境学习后再读本篇。Django 将 URL 配置、视图、模板和模型组织为 Web 应用;这里先走通 URL → 视图 → HTTP 响应,不同时引入 ORM 和后台。

以下命令以 Django 5.2 教程为例,要求 Python 3.10 或更高版本;真实项目以锁定版本的兼容表为准。见 Django 官方教程。

创建项目 ​

先按 虚拟环境创建并选择解释器,再执行:

shell
python -m pip install "Django>=5.2,<5.3"
python -m django --version
python -m django startproject helloworld
cd helloworld

外层 helloworld/ 是工作目录,包含 manage.py;内层同名目录是项目配置包。

视图与路由 ​

在内层 helloworld/views.py 中定义视图:

python
from django.http import HttpResponse


def hello(request):
    return HttpResponse("Hello, World!")

编辑内层 helloworld/urls.py,保留生成的管理后台路由,加入自己的视图:

python
from django.contrib import admin
from django.urls import path
from . import views

urlpatterns = [
    path("admin/", admin.site.urls),
    path("hello/", views.hello, name="hello"),
]

在含 manage.py 的目录启动:

shell
python manage.py runserver

访问 http://127.0.0.1:8000/hello/ 应得到 Hello, World!。开发服务通常自动重载修改,无需每次手动重启;若新文件未被检测再重启。此服务用于本地开发。

验证与练习 ​

先运行 python manage.py check,再检查 /hello/ 响应。把路径改为 greet/<str:name>/,使视图接收 name 并返回对应问候;确认未知路径返回 404。首次安装需要可用的包索引;开发服务用于本地验证,部署方式另行选择。

参考解答 ​

提示:路径转换器把 name 作为关键字实参传给视图,因此 URL 和函数签名必须一起修改。内层 helloworld/views.py 的完整内容可改为:

python
from django.http import HttpResponse
from django.utils.html import escape


def hello(request, name):
    return HttpResponse(f"Hello, {escape(name)}!")

内层 helloworld/urls.py 的完整内容:

python
from django.contrib import admin
from django.urls import path
from . import views

urlpatterns = [
    path("admin/", admin.site.urls),
    path("greet/<str:name>/", views.hello, name="hello"),
]

/greet/Alice/ 预期正文为 Hello, Alice!;旧 /hello/ 与未知路径预期404。HttpResponse 默认是 HTML,插入 URL 文本时显式转义,不能把未验证文本直接拼成页面。以上是参考代码及预期,本轮未启动Django。

Django请求链、路由与页面边界 ​

下文的 Task、tasks 命名空间和所有权查询来自个人任务板完整工程的 urls.py、views.py 与模板;它们与上节 Hello World 是两个独立项目。

适用:Python 3.12、Django 5.2.18(5.2 LTS)。先掌握函数、模块、虚拟环境和 HTTP 的请求/响应。示例未执行;本轮不安装依赖、不启动服务、不运行框架或迁移。

Django请求怎样经过中间件 ​

一次请求从 HTTP 宿主进入 Django 处理器,经过中间件、URL 解析、视图,再将响应沿中间件反向传出。请求阶段按 MIDDLEWARE 从上到下进入,响应阶段反向退出;某层直接返回响应时,后续内层不会执行。配置顺序是依赖关系,SessionMiddleware 必须先提供 session,AuthenticationMiddleware 才能从会话恢复用户。不要把模块导入时执行的代码理解成每次请求都执行。

本例用同步函数视图,选择内置中间件而不创造无业务需求的自定义层。公共安全头、会话和认证属于请求基础设施;只有当前页面需要的表单校验留在视图。阻塞数据库操作不会因为外层用了 ASGI 就自动成为异步,WSGI/ASGI 是宿主入口而非性能承诺。

Django命名路由怎样反向生成地址 ​

URLconf 按声明顺序匹配路径,匹配到 <int:pk> 时把整数传给视图;查询字符串不参与 path 匹配。命名空间 tasks 让多个应用都可使用 list 而不冲突。Python 用 reverse("tasks:edit", args=[task.pk]),模板用 {% url 'tasks:edit' task.pk %},不要在所有模板硬编码 /tasks/7/edit/。

include 把剩余路径交给子应用。视图必须返回 HttpResponse 或其子类;render 组合模板与上下文,redirect 返回跳转响应。路径不存在是 404;路径存在但方法不允许是 405。GET 仅展示页面,修改操作明确使用 POST。

Django模板转义能防止哪些问题 ​

模板的自动转义把用户标题中的 HTML 特殊字符编码后显示,例如标题含 <script> 时应显示文本。不要为消除显示符号而随意加 safe,它会绕过这层保护。转义不是 SQL 参数化,也不能代替 CSRF 或对象权限检查。

模板继承让 base 定义公共页面骨架,子模板覆写 content;APP_DIRS=True 查找应用模板,DIRS 还指定本例项目级 templates。上下文仅交付模板所需数据,业务写操作和对象授权留在视图。Django 模板不是 Vue 模板,两者花括号相似但解释器不同,同源展示须使用 fenced include。

Django登录之后怎样限制任务所有者 ​

认证回答用户是谁,所有权授权回答能改哪条任务。login_required 只处理认证;只凭 pk 获取对象会越过所有权边界。本例列表按 owner 过滤,编辑与删除同时用 pk 和 owner=request.user 查询,无权对象返回 404。前端隐藏按钮不构成服务端授权。

表单只列出 title 与 done,创建对象后由服务器设置 owner,忽略伪造 POST owner。内置 LoginView 管理登录会话,本例 LogoutView 只通过带 CSRF 的 POST 表单使用。管理员后台是可信管理通道,可以查看所有任务,不把普通页面隔离规则误写成全系统隔离保证。

用一次编辑请求串起各层 ​

假定 Alice 已登录,提交 POST /tasks/12/edit/,请求体包含 title、done 和 csrfmiddlewaretoken。Session 中间件根据 Cookie 找会话,认证中间件恢复 request.user;CSRF 拒绝不合规提交时,业务视图根本不应写数据。URLconf 解析 pk=12,task_edit 再把 owner 与 pk 一起查询,找到后绑定表单,成功写入才跳转列表。

若 Alice 把 URL 的12换成 Bob 的任务号,路径仍匹配,但对象查询返回404;这不是 URL 解析失败。若把 POST 换成 GET,同一地址仅显示表单;GET 删除地址则由方法装饰器返回405。若标题超过120字符,URL与授权均可能正确,但表单报告错误并返回200页面;HTTP 200不意味着数据库已保存。

python
# 机制示意,完整实现见实践篇 tasks/views.py;本片段未执行。
task = get_object_or_404(Task, pk=pk, owner=request.user)
form = TaskForm(request.POST, instance=task)
if form.is_valid():
    updated = form.save(commit=False)
    updated.owner = request.user

不要在中间件里按 URL 字符串决定某个任务归属;中间件缺少视图参数和对象语义,容易导致新路由漏检。对象查询应靠近当前业务操作,便于代码审查和测试。对于大型项目可以提取共享授权策略,但本例只保留两处直观查询,不引入权限框架。

应用边界和配置导入 ​

project 负责整站 settings 与根 URL;app 负责一组业务模型、视图和表单。一个 app 不等于一个进程,注册 INSTALLED_APPS 不会自动产生 URL,include URL 也不会自动创建数据表。settings 在进程启动时读取环境;修改系统变量后,已有进程不会凭空重新获得新值。

本例只定义同步视图。WSGI 与 ASGI 文件分别供对应宿主加载,都指向相同 settings;它们不会生成静态资源、提供TLS证书或替代进程管理。生产部署需要单独设计,开发 runserver 不承担上线验收。

独立练习 ​

画出 Session、Authentication 与视图的进入退出顺序;说明已登录 Bob 猜到 Alice 的主键后应得到什么。再说明 title 含 HTML 时哪里处理显示安全。

先写出判断依据,再核对下节。

参考解答 ​

进入 Session → Authentication → 视图,响应相反。Bob 的 owner 条件不匹配,返回404;模板自动转义处理 title,不能用 safe 绕过。

版本与资料边界 ​

核对日期2026-10-17。官方5.2.18发布页标注2026-10-06,官方支持表列5.2 LTS扩展支持至2028年4月。这里固定教学补丁,不声称以后仍是最新版本;未来自跑应先检查受支持补丁并重新验收。Windows PowerShell、macOS/Linux Bash/Zsh的命令已在完整工程README分开给出,三平台均未运行。

请求中间件;认证与登录;URL分派;模板语言。版本依据:支持表与5.2.18发布页。

继续阅读