《Python Django大师班:构建真实Web应用》中文语音第一部分的内容,并不是从概念讲起,而是直接带你走一遍“从零到能跑Web应用”的完整链路。很多人学Django卡住的第一个点,往往不是框架本身,而是环境装不明白、项目结构看不懂、数据操作写不通。第一部分把这些一次性解决:Python环境安装与验证、虚拟环境建立、Django安装、项目与App初始化、数据模型迁移、ORM增删改查,全部按真实开发顺序走通。
对于想用Python做Web应用、但又不想只停留在“看教程”阶段的开发者来说,这一部分的价值是可以照着敲、敲完就能继续往下做。这篇文章会按照第一部分的开发主线重新整理一遍,同时把环境配置、工程骨架、ORM查询和常见问题单独放大,方便后续复习和排查。如果你最近刚从Flask或其他脚本类Python项目转过来,这一篇的路径会更贴近Django实际工程习惯。
1. 核心能力速览
第一部分虽然只占总课程的四分之一,但覆盖的知识密度并不低。先看整体情况。
| 能力项 | 说明 |
|---|---|
| 技术栈 | Python + Django + SQLite 的开发组合,适合Web应用起步 |
| 第一部分重点 | Python环境安装、虚拟环境、Django安装、项目初始化、ORM与增删改查 |
| 运行方式 | 命令行启动开发服务器,浏览器访问本地地址 |
| 硬件要求 | 普通开发电脑即可,CPU和内存不是瓶颈,磁盘建议预留5GB以上 |
| 系统支持 | Windows、Linux、macOS 均可,服务器部署可考虑宝塔面板 |
| 数据库 | 开发阶段默认SQLite,业务扩大后可以迁移到MySQL或PostgreSQL |
| 核心产出 | 能运行的项目工程、可管理的数据模型、完整的请求响应链路 |
| 可扩展方向 | Admin后台、模板系统、REST API、部署上线 |
Django本身作为Python Web开发的主流框架,自带ORM、Admin后台、模板引擎、路由系统和安全防护机制。这意味着第一部分搭建好的工程骨架,后续可以直接承载用户系统、内容管理、数据后台等真实业务模块。
2. 适用场景与使用边界
2.1 适合什么人学
这套课程第一部分最适合两类开发者。第一类是刚入门Python,准备做第一个Web应用的人,因为Django把Web开发最常见的功能都集成好了,不需要自己拼装路由、数据库连接和模板引擎。第二类是已经在用Flask等其他框架、希望转向重量级框架的开发者,Django的“约定大于配置”和自带后台,能明显减少重复开发。
从职业角度来看,Django同样适合企业内部管理系统、数据管理平台、内容网站和信息类应用的后端开发。这类产品通常需要多张数据表、后台管理、权限控制和表单处理,Django本身的设计目标就是搞定这些需求。
2.2 不适合什么场景
Django不适合的场景也要说清楚。如果业务需要极高的实时交互,比如在线协同编辑、游戏服务端或大规模WebSocket推送,Django本身并不是最优选择。虽然Django支持异步视图和WebSocket,但第一部分的传统视图方式是请求-响应模式,不适合需要长连接和高频推送的架构。
如果业务完全依赖非关系型数据库,比如只用MongoDB、Redis做持久化存储,Django ORM的优势也会减弱。Django默认面向关系型数据库,虽然可以通过第三方库扩展,但不如原生就做偏向NoSQL的框架直接。极致低延迟、超高性能的纯网关类服务,也不是Django的典型场景。
2.3 开发合规与软件使用边界
学习Django时,要从Python官网和Django官网下载官方安装包,避免使用来路不明的修改版本。生产环境部署时,依赖包版本要锁定,避免意外升级引入兼容问题。调用第三方服务或接入外部数据时,需要确认数据来源是否已获授权,尤其是用户信息、版权素材和商业数据。Django项目上线后,要设置合理的请求访问权限,不要把Debug模式暴露到公网。
3. Python环境准备与安装
3.1 先确认Python版本
Django是Python Web框架,环境前提是安装一个可用的Python解释器。从主流实践来看,建议选择Python 3.10以上的稳定版本,因为当前主流Django版本对Python 3新特性支持更好,同时也能保持较好的兼容性。安装之前,可以先在终端检查是否已经存在Python环境。
打开命令行窗口,分别执行以下命令。
python --version python3 --version pip --version如果系统返回类似Python 3.12.x的版本信息,说明已经安装了Python。如果提示命令不存在,或者版本过低,就需要重新安装。这里有一个常见的判断点:Windows环境通常会显示python,Linux和macOS可能存在python与python3两个命令的区分,建议以实际返回结果为准。
3.2 Windows与Linux下的Python安装
Windows安装Python比较简单,去Python官网下载对应系统的安装包,安装时务必勾选“Add Python to PATH”,这一步决定了后续能否直接在命令行调用Python。安装完成后,打开新的终端窗口,执行python --version确认安装成功。
Linux环境常见的是Debian/Ubuntu系和CentOS系。Debian系可以使用apt安装,CentOS系可以使用yum或dnf安装,部分服务器可能没有预装Python 3,需要先更新软件源再安装。
sudo apt update sudo apt install python3 python3-pip python3-venv有些Linux发行版会同时存在Python 2和Python 3,建议统一使用python3和pip3命令,避免误用旧版本。
3.3 创建虚拟环境
虚拟环境是Python项目开发的基础习惯,作用是把当前项目的依赖与系统全局依赖隔离。这样不同项目使用不同版本的Django或第三方库时,不会互相冲突。创建虚拟环境时在项目目录下执行:
mkdir django-project cd django-project python -m venv venvWindows激活虚拟环境:
venv\Scripts\activateLinux和macOS激活虚拟环境:
source venv/bin/activate激活后,命令行提示符前面会出现(venv)字样,说明当前已经处于虚拟环境中。后面的Django安装和命令执行,都建议在这个环境里进行。
3.4 安装Django与常用依赖
激活虚拟环境后,使用pip安装Django。
pip install django安装完成后,验证版本。
python -m django --version如果输出Django版本号,说明安装成功。除了Django本体,真实项目通常还会伴随一些工具包。比如在工业项目中,经常需要同时安装django、pymodbus和requests,用于Web管理界面与Modbus协议设备通信、外部HTTP接口请求。统一安装的方式如下:
pip install django pymodbus requests这里需要说明:pymodbus是Modbus协议通信库,requests是HTTP请求库,它们不是Web应用的必要组成部分,而是根据业务需求自行补充的工具包。只有Django是框架本体。
3.5 VS Code的Python开发环境配置
如果使用VS Code作为开发工具,建议安装Python扩展。打开VS Code扩展市场,搜索“Python”,安装微软官方发布的扩展即可。安装后,在项目根目录打开命令行激活虚拟环境,再启动VS Code,通常可以自动识别当前虚拟环境。
code .VS Code底部状态栏可以切换解释器,选择虚拟环境中的venv解释器。这样运行代码、调试和补全提示都会基于当前项目的依赖环境,不会跟全局环境混淆。
4. Django项目创建与App设计
4.1 创建项目
虚拟环境和Django准备就绪后,开始创建项目。项目名称可以按实际业务来定,比如博客系统叫blog_project,管理系统叫admin_system。示例中用一个通用的config作为项目配置目录,再单独用myproject作为实际项目理解起来更直观。
django-admin startproject myproject .这里的.表示在当前目录创建项目文件,不加的话会多创建一层目录。执行后,项目里会出现一个manage.py文件和myproject配置包,里面包含settings.py、urls.py、wsgi.py等核心文件。
4.2 创建App
Django中,“项目”是整体配置,“应用”是具体业务模块。一个项目可以包含多个App,比如用户模块、文章模块、订单模块。创建一个文章应用:
python manage.py startapp blog创建后,blog目录包含models.py、views.py、admin.py、migrations/ 等文件。从真实项目习惯来看,App的划分应该在创建前想清楚。不要把用户、文章、支付全部塞进同一个App,否则后期维护会很吃力。
4.3 配置settings.py
打开myproject/settings.py,把新App注册到INSTALLED_APPS中。
INSTALLED_APPS = [ "django.contrib.admin", "django.contrib.auth", "django.contrib.contenttypes", "django.contrib.sessions", "django.contrib.messages", "django.contrib.staticfiles", "blog", ]同时,把语言和时区调整为中文和北京时间。
LANGUAGE_CODE = "zh-hans" TIME_ZONE = "Asia/Shanghai" USE_TZ = True这样Django Admin后台会显示中文,时间处理也更符合本地业务习惯。
4.4 启动开发服务器
完成基础配置后,启动开发服务器。
python manage.py runserver启动成功后,终端会显示类似Starting development server at http://127.0.0.1:8000/的提示。浏览器访问http://127.0.0.1:8000/,能看到初始页面说明Django运行正常。
这里有一个常见问题:如果8000端口被其他程序占用,可以用自定义端口启动。
python manage.py runserver 127.0.0.1:8080在局域网开发调试时,也可以启动为0.0.0.0:8000,让其他设备访问本机服务。
5. 数据模型与ORM增删改查
5.1 定义数据模型
真实Web应用基本上都要操作数据库。Django不要求直接写SQL,而是通过模型类描述数据结构,再通过ORM完成数据库操作。以文章应用为例,在blog/models.py中定义一个文章模型。
from django.db import models class Post(models.Model): title = models.CharField("标题", max_length=100) content = models.TextField("内容") created_at = models.DateTimeField("创建时间", auto_now_add=True) updated_at = models.DateTimeField("更新时间", auto_now=True) def __str__(self): return self.title这里用到了三个常用字段类型:CharField用于短文本,TextField用于长文本,DateTimeField用于时间。字段定义中的中文说明,会自动体现在Admin后台和表单校验中。
5.2 生成迁移文件并同步数据库
定义好模型后,需要让Django根据模型生成数据库表结构。
python manage.py makemigrations python manage.py migratemakemigrations会在App的migrations目录生成迁移文件,migrate则把迁移文件应用到数据库表中。第一次执行migrate时,除了业务表,还会创建Django自带的用户、会话、权限等系统表。
5.3 执行查询与删除对象
Django ORM提供了一套很简洁的数据操作API。打开Django Shell进行交互式验证。
python manage.py shell新增数据:
from blog.models import Post post = Post(title="第一篇文章", content="Django ORM 实战") post.save() Post.objects.create(title="第二篇文章", content="自动创建")查询数据:
# 获取全部记录 posts = Post.objects.all() print(posts) # 获取单条记录 first_post = Post.objects.get(id=1) print(first_post.title) # 条件过滤 posts = Post.objects.filter(title__contains="Django") print(posts)删除对象:
post = Post.objects.get(id=1) post.delete()这里有几个实际开发中容易踩到的点。get()如果查询结果多于一条或少于一条,会抛出异常,因此更推荐用filter()判断后再取一条,或者使用get_object_or_404()这样的快捷方式。filter()返回的是查询集,支持链式调用、惰性求值和分片操作,比如Post.objects.filter(...).order_by("-created_at")[:5]。
批量删除也是常见需求,使用查询集的delete()方法即可。
Post.objects.filter(title__startswith="测试").delete()执行前建议先确认过滤条件是否正确,避免误删数据。
5.4 在Admin后台管理数据
Django自带Admin后台,是真实项目中很实用的数据管理界面。先在blog/admin.py中注册模型。
from django.contrib import admin from .models import Post @admin.register(Post) class PostAdmin(admin.ModelAdmin): list_display = ("id", "title", "created_at") search_fields = ("title",)创建超级管理员:
python manage.py createsuperuser按提示输入用户名、邮箱和密码。然后启动服务器,访问http://127.0.0.1:8000/admin/,登录后就能在后台直接增加、修改、删除文章数据。有了Admin后台,第一部分的模型定义结果可以立即在界面上看到,这也为后续真实业务管理提供了基础。
6. 视图、路由与模板
6.1 URL路由配置
Django通过URL配置决定用户访问某个地址时执行哪个视图函数。在myproject/urls.py中引入App的URL配置。
from django.contrib import admin from django.urls import include, path urlpatterns = [ path("admin/", admin.site.urls), path("blog/", include("blog.urls")), ]在blog应用下创建或修改urls.py,定义首页路由。
from django.urls import path from . import views urlpatterns = [ path("", views.index, name="index"), path("posts/", views.post_list, name="post_list"), ]6.2 视图函数
视图函数接收浏览器请求,返回响应内容。编写一个最简单的视图。
from django.http import HttpResponse def index(request): return HttpResponse("Django 应用运行正常")此时浏览器访问http://127.0.0.1:8000/blog/,页面会显示“Django 应用运行正常”。
6.3 模板渲染
真实项目中不会直接返回字符串,而是返回HTML模板。在blog目录下创建templates/blog/结构,新建post_list.html。
<!DOCTYPE html> <html lang="zh-hans"> <head> <meta charset="UTF-8"> <title>文章列表</title> </head> <body> <h1>文章列表</h1> <ul> {% for post in posts %} <li>{{ post.title }} - {{ post.created_at }}</li> {% endfor %} </ul> </body> </html>视图函数改为渲染模板。
from django.shortcuts import render from .models import Post def post_list(request): posts = Post.objects.all().order_by("-created_at") return render(request, "blog/post_list.html", {"posts": posts})模板中的{% for %}和{{ }}是Django模板语法,分别表示循环和输出变量。这里体现了ORM、视图、模板三层协作的基本流程,也是后续所有页面的通用模型。
7. 将应用扩展为完整CRUD
7.1 设计新增数据的表单
真实Web应用不能只在Admin后台录入数据,还要在业务页面中完成新增逻辑。可以使用Django表单来减少手动校验工作。
在blog应用下创建forms.py。
from django import forms from .models import Post class PostForm(forms.ModelForm): class Meta: model = Post fields = ["title", "content"]视图函数处理GET请求时展示表单,POST请求时校验并保存数据。
from django.shortcuts import render, redirect from .forms import PostForm def post_create(request): if request.method == "POST": form = PostForm(request.POST) if form.is_valid(): form.save() return redirect("post_list") else: form = PostForm() return render(request, "blog/post_create.html", {"form": form})对应模板中需要包含表单字段和CSRF令牌。
<form method="post"> {% csrf_token %} {{ form.as_p }} <button type="submit">保存</button> </form>csrf_token是Django内置的安全机制,用来防止跨站请求伪造,在正式项目里不能省略。
7.2 更新与删除数据
更新操作通常需要知道要更新哪条记录,可以通过URL传递主键id。
from django.shortcuts import get_object_or_404, redirect, render from .forms import PostForm from .models import Post def post_update(request, post_id): post = get_object_or_404(Post, id=post_id) if request.method == "POST": form = PostForm(request.POST, instance=post) if form.is_valid(): form.save() return redirect("post_list") else: form = PostForm(instance=post) return render(request, "blog/post_create.html", {"form": form}) def post_delete(request, post_id): post = get_object_or_404(Post, id=post_id) post.delete() return redirect("post_list")URL配置补充对应路由。
path("posts/create/", views.post_create, name="post_create"), path("posts/<int:post_id>/edit/", views.post_update, name="post_update"), path("posts/<int:post_id>/delete/", views.post_delete, name="post_delete"),到这里,一个文章模块的增删改查已经完整跑通。这些代码量不大,但结构很典型,后面套上用户权限、分类管理、分页显示,就是一个真实可用的内容管理系统雏形。
7.3 利用Admin后台做运营管理
在实际项目中,普通用户通过前端页面提交内容,管理员通过Admin后台审核和管理内容。把数据模型注册进Admin后,运营人员不需要写代码就能维护数据。建议根据业务需求调整Admin列表字段、搜索字段和过滤器,降低后台使用成本。
@admin.register(Post) class PostAdmin(admin.ModelAdmin): list_display = ("id", "title", "created_at") list_filter = ("created_at",) search_fields = ("title", "content")8. 接口API与前后端数据交互
8.1 使用JsonResponse返回数据
第一部分主要演示服务端渲染页面,但真实项目中经常会遇到需要向前端页面或外部系统返回JSON数据的情况。Django的JsonResponse可以快速返回JSON格式响应。
from django.http import JsonResponse from .models import Post def post_api(request): posts = list(Post.objects.all().values("id", "title", "created_at")) return JsonResponse({"status": "ok", "data": posts})将路由配置为/blog/api/posts/后,直接访问该地址即可看到JSON数据。这个能力是后续做前后端分离、小程序接口、移动端接口的基础。
8.2 通用接口调用示例
假如你需要在自己项目中模拟调用Django接口,可以使用requests库。
import requests response = requests.get("http://127.0.0.1:8000/blog/api/posts/", timeout=10) data = response.json() print(data)用curl测试同样方便。
curl http://127.0.0.1:8000/blog/api/posts/如果返回JSON中包含status和data两个字段,说明接口服务正常。这里要提醒,实际生产环境接口要做认证和权限控制,不能直接把数据表内容全部暴露。
8.3 批量任务与数据初始化
批量处理时,可以结合Django Shell或管理命令。比如批量导入初始文章数据,可以写一个脚本,在Shell中运行。
from blog.models import Post titles = ["开发笔记一", "开发笔记二", "开发笔记三"] for title in titles: Post.objects.create(title=title, content="批量生成内容") print("完成")更大的数据量则建议用迭代器iterator()避免内存占用过高,并在循环中分批提交。无论是批量任务还是接口调用,都应该增加日志记录和异常捕获,方便出问题时排查。
9. 开发环境资源占用与性能观察
Django自带的开发服务器虽然只用于本地调试,但仍能观察一些性能指标来评估数据模型设计是否合理。最直观的方法是查看服务器终端的请求日志,日志会记录每次请求的路径、状态码和耗时。启动服务时的提示信息也能反映项目加载速度,模块越多加载时间越长。
数据库查询量是Web应用性能的关键。页面加载后,Django会对每个数据访问操作执行SQL查询。可以临时开启Django的查询记录确认页面执行了多少条SQL。
from django.db import connection # 在视图函数中调试时使用 print(len(connection.queries))如果列表页的数据量增大后加载变慢,优先查看是否存在“N+1查询问题”。例如循环输出关联数据时,每条记录都触发一次数据库查询。用ORM的select_related()和prefetch_related()可以减少查询次数,这一点在后续课程中应该重点练习。
内存和显存在Django本地开发中不属于瓶颈,因为第一部分的模型和页面非常简单。真正需要担心的是服务器部署后的并发能力和数据库性能。总是在开发早期保持“先跑通,再优化”的心态,不要在只有几十条测试数据时就过度设计缓存和索引。
10. 常见问题与排查方法
学习Django第一部分时,遇到的报错基本集中在环境、路径、语法和数据库四类。这里整理一张排查表。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| python命令无法识别 | Python未安装或未加入PATH | 执行python --version | 重新安装Python并勾选Add to PATH |
| pip安装Django失败 | 网络问题或pip版本过低 | 查看pip错误日志 | 升级pip并更换国内镜像源 |
| django-admin命令不存在 | 虚拟环境未激活或Django未安装 | 检查命令行前缀和pip list | 激活虚拟环境并重新安装Django |
| 运行runserver报端口占用 | 8000端口被其他进程占用 | 检查端口占用 | 更换端口,如runserver 8080 |
| 访问页面报404 | 路由配置未匹配 | 检查urls.py和请求地址 | 配置include或补充path规则 |
| 修改模型后数据库未变化 | 忘记执行迁移 | 查看migrations目录 | 执行makemigrations和migrate |
| get查询不到数据 | 条件不匹配 | 使用filter调试 | 改用filter+first或get_object_or_404 |
| Admin忘记密码 | 密码遗忘 | 无 | 执行createsuperuser重新创建管理员 |
| 模板变量不显示 | 变量名拼写错误 | 检查模板和视图上下文 | 保持变量名大小写一致 |
镜像源问题在国内开发环境中很常见,pip官方源有时速度较慢,建议优先使用国内镜像。
pip install django -i https://pypi.tuna.tsinghua.edu.cn/simple这个问题解决后,第三方依赖的安装效率会明显提升。
11. 部署实践:从本地到宝塔服务器
11.1 导出依赖清单
项目开发完成后,需要把依赖清单导出,方便部署时恢复环境。
pip freeze > requirements.txt在服务器上新建虚拟环境后,执行以下命令安装依赖。
pip install -r requirements.txt11.2 关闭Debug并配置静态文件
生产环境不能使用Django默认的Debug模式。在settings.py中设置DEBUG = False,同时配置ALLOWED_HOSTS。
ALLOWED_HOSTS = ["你的域名或IP"]修改settings.py中STATIC_ROOT配置:
STATIC_ROOT = BASE_DIR / "staticfiles"随后收集静态文件到指定目录。
python manage.py collectstatic11.3 宝塔面板部署Django
宝塔面板是很多国内开发者选择的服务器运维工具,部署Django的基本思路是通过WSGI服务承载Django应用。先确保服务器安装了Python环境和项目代码,再把项目目录配置为Python项目,并选择对应的运行方式。常见方式是使用Gunicorn配合反向代理。
pip install gunicorn gunicorn myproject.wsgi:application --bind 0.0.0.0:8000然后在宝塔Nginx配置中把域名请求转发到本机的8000端口。部署过程中重点检查:Python版本是否一致、依赖包是否安装完整、允许访问的域名是否配置正确、静态文件是否收集完成。Django部署属于生产环节,进入这一阶段前,确保第一部分的项目结构已经理解扎实。
12. 第一部分实战建议与下一步方向
第一部分全部走完后,你应该至少具备以下三项能力:能在本机创建并运行Django项目;能定义数据模型并完成数据库迁移;能通过ORM完成数据的增删改查,并把数据渲染到页面中。这套流程是后续所有业务功能的基础,越熟练越好。
第一次学习时,建议不要跳过虚拟环境和迁移操作。虚拟环境是依赖隔离的底线,迁移是数据模型演进的工具,这两步如果不熟悉,越往后越容易出问题。遇到报错不要急着搜索完整错误,先读第一行提示,分清是路径错误、语法错误还是数据库错误,再对照本篇排查表处理。
后面的课程大概率会围绕用户认证、权限管理、样式集成、部署上线等真实细节展开。在进入下一部分前,建议把本文中的项目重新手动创建一遍,不要复制粘贴,每一步都自己敲一遍。只有手速跟上思路,后续的真实项目开发才不会卡在基础环节。
最重要的是,把“会跑通”和“会开发”区分开。会跑通只是照着命令执行,会开发是项目里新增一个业务模块时,知道自己要动哪些文件、要改哪些配置、要写哪些查询。第一篇笔记帮助完成前一步,后面的练习才是真正积累经验的过程。