第一章:Django 基础入门 Django 是一个成熟、安全、可扩展的 Python Web 框架,以“开箱即用”和“约定优于配置”为核心理念,助力开发者高效构建高质量 Web 应用。本章系统梳理 Django 入门核心路径——从环境搭建、项目创建、应用组织,到视图开发、URL 路由、模板渲染,完整覆盖 Web 请求处理全链路。内容严格遵循 MTV(模型-模板-视图)架构逻辑,所有操作均基于 Django 4.2+ 稳定版本,适配 Python 3.8–3.12 环境,为后续数据库建模、用户认证、REST API 开发等进阶主题奠定坚实基础。 1.
Django 是一个成熟、安全、可扩展的 Python Web 框架,以“开箱即用”和“约定优于配置”为核心理念,助力开发者高效构建高质量 Web 应用。本章系统梳理 Django 入门核心路径——从环境搭建、项目创建、应用组织,到视图开发、URL 路由、模板渲染,完整覆盖 Web 请求处理全链路。内容严格遵循 MTV(模型-模板-视图)架构逻辑,所有操作均基于 Django 4.2+ 稳定版本,适配 Python 3.8–3.12 环境,为后续数据库建模、用户认证、REST API 开发等进阶主题奠定坚实基础。
Django 是一个开源、高水准的 Python Web 框架,由经验丰富的 Web 开发者于 2005 年发起并持续维护。它并非仅提供底层工具链,而是以工程化思维整合 Web 开发全栈能力,显著降低重复性工作,使团队能聚焦于业务逻辑与用户体验创新。
settings.py),路由规则明确声明(urls.py),避免魔法行为干扰调试。| 特性 | 说明 | 典型应用场景 |
|---|---|---|
| ORM(对象关系映射) | 抽象数据库操作,支持 PostgreSQL、MySQL、SQLite 等主流数据库,自动处理迁移、查询优化与连接池 | 用户数据管理、内容存储、订单处理 |
| 自动管理后台(Admin) | 基于模型定义自动生成功能完备的管理界面,支持增删改查、搜索、过滤、导出 | 内容编辑、运营后台、数据审核 |
| URL 路由系统 | 基于正则或路径转换器的声明式路由,支持命名空间、嵌套路由与反向解析 | RESTful 接口设计、多语言站点、微前端集成 |
| 模板引擎 | 安全的 HTML 渲染引擎,支持继承、包含、过滤器、自定义标签与自动 HTML 转义 | 前后端分离前的动态页面、邮件模板、PDF 生成 |
| 表单处理框架 | 统一处理数据验证、渲染、绑定与错误提示,无缝对接模型字段 | 用户注册、内容提交、设置表单 |
| 用户认证系统 | 内置用户模型、权限系统、组管理、登录/登出视图与密码重置流程 | SaaS 应用、企业门户、会员系统 |
Django 采用 MTV(Model-Template-View) 架构,是对经典 MVC 模式的演进,更契合 Web 请求-响应生命周期:
图 1.1 Django MTV 请求处理流程
该流程确保关注点分离:模型专注数据一致性,模板专注呈现体验,视图专注流程控制,大幅提升代码可维护性与团队协作效率。
构建稳定、可复现的开发环境是 Django 项目成功的前提。推荐采用虚拟环境隔离依赖,避免系统级包冲突。
Django 官方支持 Python 3.8 及以上版本。请从 python.org 下载并安装对应操作系统的最新稳定版。
安装完成后,在终端执行以下命令验证:
python --version # 或 python3 --version
预期输出示例:Python 3.11.8
注意:Windows 用户若遇到
python命令不可用,请在安装时勾选 “Add Python to PATH” 选项;macOS 用户推荐使用pyenv管理多版本 Python。
pip 是 Python 官方包管理器,随 Python 3.4+ 自动安装。执行以下命令确认:
pip --version # 或 pip3 --version
预期输出示例:pip 23.3.1 from /path/to/site-packages/pip (python 3.11)
如未安装,请参考 pip 官方安装指南。
使用 Python 内置 venv 模块创建隔离环境(推荐命名为 venv):
# 创建虚拟环境 python -m venv venv # Linux/macOS 激活 source venv/bin/activate # Windows 激活(PowerShell) venv\Scripts\Activate.ps1 # 或 Windows 命令提示符 venv\Scripts\activate.bat
激活成功后,终端提示符前将显示 (venv) 标识。
重要:所有后续
pip安装操作必须在激活状态下执行,否则包将安装至系统 Python 环境。
在激活的虚拟环境中执行:
pip install Django
验证安装:
django-admin --version # 输出示例:4.2.11
最佳实践:安装完成后,运行
pip freeze > requirements.txt生成依赖清单,便于团队协作与生产部署。
Django 项目是应用(App)的容器,提供全局配置与共享资源。项目结构遵循清晰的分层约定。
在目标工作目录执行:
django-admin startproject myproject
该命令生成以下项目根目录结构:
myproject/ manage.py myproject/ __init__.py asgi.py settings.py urls.py wsgi.py
| 文件/目录 | 职责 | 关键配置点 |
|---|---|---|
manage.py |
项目管理命令行入口 | 所有 python manage.py xxx 命令由此驱动 |
myproject/settings.py |
全局配置中心 | INSTALLED_APPS, DATABASES, SECRET_KEY, ALLOWED_HOSTS, 静态文件路径等 |
myproject/urls.py |
根 URL 路由表 | 定义项目级 URL 分发规则,通常包含 admin/ 和各应用路由入口 |
myproject/wsgi.py |
WSGI 服务器部署入口 | 用于 Gunicorn、uWSGI 等生产服务器 |
myproject/asgi.py |
ASGI 异步服务器部署入口 | 支持 WebSockets、长轮询等异步场景 |
图 1.2 Django 项目目录结构
进入 myproject 目录,执行:
python manage.py runserver
终端将输出类似信息:
Performing system checks... System check identified no issues (0 silenced). June 18, 2024 - 14:22:33 Django version 4.2.11, using settings 'myproject.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C.
访问 http://127.0.0.1:8000/,将看到 Django 默认欢迎页:“It worked! Congratulations on your first Django-powered page.”
提示:开发服务器具备热重载能力,修改 Python 或模板文件后自动重启,无需手动干预。
Django 应用是功能模块的独立单元,遵循单一职责原则。一个项目可包含多个应用(如 blog, users, payments),每个应用可被复用于不同项目。
在 myproject 根目录下执行:
python manage.py startapp myapp
生成应用目录结构:
myapp/ __init__.py admin.py apps.py migrations/ __init__.py models.py tests.py views.py
| 文件 | 职责 | 使用时机 |
|---|---|---|
models.py |
定义数据模型(Python 类),映射数据库表结构 | 需要持久化数据时 |
views.py |
编写视图函数或类,处理请求逻辑并返回响应 | 需要响应 HTTP 请求时 |
urls.py |
(需手动创建) 定义应用内部 URL 路由 | 应用需暴露多个端点时 |
admin.py |
注册模型至 Django 管理后台 | 需要后台管理数据时 |
apps.py |
应用配置类,可自定义应用行为 | 高级定制场景(如信号注册) |
migrations/ |
存放数据库迁移脚本,记录模型变更历史 | 执行 makemigrations 后生成 |
图 1.3 Django 应用目录结构
Django 不会自动发现新应用,必须在 myproject/settings.py 的 INSTALLED_APPS 中显式注册:
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'myapp', # ← 新增此行 ]
关键点:应用注册顺序影响信号、模板加载与中间件执行顺序,通常将自定义应用置于内置应用之后。
视图是 Django 的“控制器”,负责接收请求、处理业务、返回响应。本节实现最简 HTTP 响应。
编辑 myapp/views.py:
from django.http import HttpResponse def hello_django(request): return HttpResponse("<h1>Hello, Django!</h1>")
该函数接收 request 对象(封装客户端请求信息),返回 HttpResponse(包含 HTML 响应体)。
在 myapp/ 目录下创建 urls.py:
from django.urls import path from . import views urlpatterns = [ path('hello/', views.hello_django, name='hello'), ]
path():声明 URL 模式,'hello/' 表示匹配 /myapp/hello/ 路径。name='hello':为路由命名,支持模板中 {% url 'hello' %} 反向解析,提升可维护性。修改 myproject/urls.py,将 myapp 路由纳入项目总入口:
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('myapp/', include('myapp.urls')), # ← 新增此行 ]
include() 将 /myapp/ 开头的所有请求转发至 myapp.urls 处理。
重启开发服务器(Ctrl+C 停止后重新运行 python manage.py runserver),访问:
http://127.0.0.1:8000/myapp/hello/
页面将显示 <h1>Hello, Django!</h1>。
Django 路由支持从 URL 中提取变量并传递给视图。例如,匹配用户 ID:
# myapp/urls.py from django.urls import path from . import views urlpatterns = [ path('hello/', views.hello_django, name='hello'), path('user/<int:user_id>/', views.user_detail, name='user_detail'), ]
<int:user_id>:int 是路径转换器,确保 user_id 为整数;user_id 是参数名,将作为关键字参数传入视图。def user_detail(request, user_id):其他常用转换器:
str(字符串)、slug(URL 友好字符串)、uuid(UUID 格式)、path(含/的路径)。
硬编码 HTML 字符串难以维护且无法复用。Django 模板引擎将逻辑与展示分离,支持继承、变量、标签与过滤器。
按 Django 约定,在 myapp/ 下创建模板目录:
myapp/ ... templates/ myapp/ hello.html hello_data.html ...
约定说明:
templates/myapp/结构避免多应用间模板名冲突,render()函数中路径为'myapp/hello.html'。
创建 myapp/templates/myapp/hello.html:
<!DOCTYPE html> <html> <head> <title>Hello Django</title> </head> <body> <h1>Hello, Django Templates!</h1> <p>Welcome to Django template world.</p> </body> </html>
修改 myapp/views.py:
from django.shortcuts import render def hello_template(request): return render(request, 'myapp/hello.html')
render():封装 HttpResponse 与模板渲染,自动传入 request 上下文(如 user, csrf_token)。在 myapp/urls.py 中添加路由:
path('template/', views.hello_template, name='template'),
访问 http://127.0.0.1:8000/myapp/template/ 查看效果。
模板变量通过 {{ variable }} 语法渲染。修改视图传递上下文:
# myapp/views.py def hello_template_with_data(request): context = { 'name': 'Django', 'message': 'Hello from View!', 'timestamp': '2024-06-18', } return render(request, 'myapp/hello_data.html', context)
创建 myapp/templates/myapp/hello_data.html:
<!DOCTYPE html> <html> <head> <title>Hello Django with Data</title> </head> <body> <h1>Hello, {{ name }}!</h1> <p>{{ message }}</p> <p>Generated on: {{ timestamp }}</p> </body> </html>
在 myapp/urls.py 中添加路由:
path('template_data/', views.hello_template_with_data, name='template_data'),
访问 http://127.0.0.1:8000/myapp/template_data/,页面将动态显示传入的数据。
安全机制:Django 模板默认对变量内容进行 HTML 转义,防止 XSS 攻击。如需渲染原始 HTML,使用
{{ variable|safe }}过滤器(需确保内容可信)。
本章系统构建了 Django 开发的完整入门路径,覆盖从环境初始化到动态页面渲染的全部核心环节。所有实践均基于 Django 官方最佳实践,强调可维护性、安全性与工程化思维。
图 1.4 Django 基础知识体系
models.Model 定义、字段类型、关系建模(ForeignKey、ManyToManyField)、迁移命令(makemigrations, migrate)及 ORM 查询(filter(), get(), order_by())。admin.site.register()、ModelAdmin 定制、列表显示、搜索过滤与批量操作。forms.Form 与 forms.ModelForm,实现数据验证、HTML 渲染与错误提示。STATIC_URL 与 STATIC_ROOT,使用 {% static %} 模板标签加载 CSS/JS/图片。@login_required, user_passes_test)。完成本章学习后,开发者已具备独立搭建 Django 项目骨架、响应 HTTP 请求、渲染动态页面的能力。后续章节将围绕数据层、交互层与安全层深度展开,助你构建生产级 Web 应用。