Python开发从入门到精通:Web框架Django实战
Django 是 Python 生态里“电池齐全”的 Web 框架,2026 年 3 月当前最新稳定版是 Django 6.0.3(2025年12月发布的 6.0 系列,主流支持到 2026年8月,适合新项目)。
它在 5.x → 6.x 系列中进一步强化了 async 支持、类型注解、表单渲染、数据库函数、PostgreSQL 优化、安全默认值等,生产中用 Django + PostgreSQL + Celery + Redis + DRF 仍然是许多中大型项目的标配。
我们用实战导向的方式,从零到能独立开发一个完整中型项目(博客/任务管理/电商后台),分成清晰阶段。
阶段 0:准备工作(10–30 分钟)
# 推荐 Python 3.12 或 3.13(6.0 支持 3.12–3.14)
python --version
# 全局或虚拟环境都行,推荐 venv + pipx 或 poetry/uv
python -m venv venv-django
source venv-django/bin/activate # Windows: venv-django\Scripts\activate
# 升级 pip 并安装最新 Django
pip install --upgrade pip
pip install Django==6.0.3
# 验证
django-admin --version # 应显示 6.0.3
推荐工具链(2026主流):
- 编辑器:VS Code + Python + Django + Ruff + isort + Black 插件
- 依赖管理:uv / poetry(比 pip 快很多)
- 数据库:PostgreSQL(本地用 Docker 跑)
- 异步任务:Celery + Redis
- API:Django REST Framework (DRF)
阶段 1:创建第一个项目 & 理解核心结构(1–2 小时)
# 创建项目(项目名建议小写+下划线)
django-admin startproject mysite
cd mysite
# 创建第一个 app(Django 一切从 app 开始)
python manage.py startapp blog
# 项目目录结构(重要!)
mysite/
├── manage.py
├── mysite/ # 项目配置
│ ├── __init__.py
│ ├── asgi.py # 异步入口(Django 4+ 加强)
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── blog/ # 业务 app
├── __init__.py
├── admin.py
├── apps.py
├── migrations/
├── models.py
├── tests.py
└── views.py
核心文件速记:
| 文件 | 作用 | 常见修改点 |
|---|---|---|
| settings.py | 配置中心 | INSTALLED_APPS、DATABASES、MIDDLEWARE、TEMPLATES、STATIC 等 |
| urls.py | 路由总表 | include() 引入 app 的 urls |
| models.py | 数据模型(ORM) | 定义 Model 类 |
| views.py | 视图(逻辑) | 函数视图 / 类视图 / APIView |
| admin.py | 后台管理注册 | admin.site.register(Model) |
| migrations/ | 数据库迁移文件 | makemigrations + migrate |
第一步运行起来:
# mysite/settings.py 中添加 app
INSTALLED_APPS = [
...,
'blog.apps.BlogConfig',
]
# blog/views.py
from django.http import HttpResponse
def home(request):
return HttpResponse("<h1>Hello Django 6.0 in 2026!</h1>")
# blog/urls.py(新建)
from django.urls import path
from .views import home
urlpatterns = [
path('', home, name='home'),
]
# mysite/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('blog.urls')),
]
# 启动(默认 8000 端口)
python manage.py runserver
浏览器打开 http://127.0.0.1:8000/ 看到 Hello 就算入门成功。
阶段 2:模型 & 数据库 & 迁移(核心,2–4 小时)
# blog/models.py
from django.db import models
from django.utils import timezone
class Category(models.Model):
name = models.CharField(max_length=100, unique=True)
slug = models.SlugField(max_length=120, unique=True)
class Meta:
verbose_name_plural = "Categories"
def __str__(self):
return self.name
class Post(models.Model):
title = models.CharField(max_length=200)
slug = models.SlugField(max_length=250, unique=True)
content = models.TextField()
category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name='posts')
author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
created_at = models.DateTimeField(default=timezone.now)
updated_at = models.DateTimeField(auto_now=True)
is_published = models.BooleanField(default=False)
class Meta:
ordering = ['-created_at']
def __str__(self):
return self.title
操作流程:
# 生成迁移文件
python manage.py makemigrations blog
# 应用迁移(创建表)
python manage.py migrate
# 创建超级用户(进 admin)
python manage.py createsuperuser
# 注册模型到 admin
# blog/admin.py
from django.contrib import admin
from .models import Category, Post
@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
list_display = ('name', 'slug')
prepopulated_fields = {'slug': ('name',)}
@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
list_display = ('title', 'category', 'author', 'is_published', 'created_at')
list_filter = ('is_published', 'category')
search_fields = ('title', 'content')
prepopulated_fields = {'slug': ('title',)}
date_hierarchy = 'created_at'
访问 http://127.0.0.1:8000/admin/ 登录后就能管理文章了。
阶段 3:视图 & 模板 & URL(2–4 小时)
用类视图(更推荐,DRY):
# blog/views.py
from django.views.generic import ListView, DetailView
from .models import Post
class PostListView(ListView):
model = Post
template_name = 'blog/post_list.html' # 默认是 blog/post_list.html
context_object_name = 'posts'
queryset = Post.objects.filter(is_published=True)
class PostDetailView(DetailView):
model = Post
template_name = 'blog/post_detail.html'
slug_field = 'slug'
slug_url_kwarg = 'slug'
URL 配置:
# blog/urls.py
from django.urls import path
from .views import PostListView, PostDetailView
urlpatterns = [
path('', PostListView.as_view(), name='post_list'),
path('<slug:slug>/', PostDetailView.as_view(), name='post_detail'),
]
创建模板(mysite/templates/blog/ 下):
post_list.html 示例:
<!DOCTYPE html>
<html>
<head>
<title>我的博客</title>
</head>
<body>
<h1>最新文章</h1>
<ul>
{% for post in posts %}
<li><a href="{% url 'post_detail' post.slug %}">{{ post.title }}</a> - {{ post.created_at|date:"Y-m-d" }}</li>
{% empty %}
<li>暂无文章</li>
{% endfor %}
</ul>
</body>
</html>
阶段 4:进阶实战方向(推荐顺序)
- 表单 & CBV Create/Update/Delete → 用
CreateView、UpdateView、DeleteView - 用户认证 →
LoginView、LogoutView、UserCreationForm+@login_required - 静态文件 & 媒体文件 → settings 中配置 STATIC_URL / MEDIA_URL + collectstatic
- Django REST Framework → 序列化器 + ViewSet + Router → 快速出 API
- 异步视图(Django 6.0 更友好)→
async def+database_async - 部署 → Docker + Gunicorn/Uvicorn + Nginx + PostgreSQL + Supervisor/ systemd
- 测试 → unittest / pytest-django + factory_boy
- 性能优化 → select_related / prefetch_related、缓存(Redis)、debug-toolbar
2026 年 Django 项目最佳实践速查(生产级)
- 用 Poetry / uv 管理依赖
- settings 用 split(base/dev/prod)+ django-environ / pydantic-settings
- 模型:slug 自动生成、timestamps 用 timezone.now
- 视图:优先 Class-Based Views + mixins
- 模板:用 django-crispy-forms 或 django-tailwind
- 安全:SECURE_* 设置全开、django-cors-headers、django-axes
- 日志:structlog 或 logging + sentry-sdk
- CI/CD:GitHub Actions + pre-commit(black、ruff、isort)
你现在是零基础刚接触 Django,还是已经有 Python 基础想直接做项目?
想重点从哪个阶段开始实战(比如先做一个带用户登录的 TODO List,还是直接上 DRF API)?
告诉我你的目标和当前水平,我可以给你贴出下一段完整可运行代码 + 数据库设计 + 常见坑点。