前言
上一篇文章我们介绍了 Python 的"微框架" Flask,今天来聊聊它的"大块头"兄弟------Django。
如果说 Flask 是"给你砖头,自己盖房子",那 Django 就是"交钥匙的精装房":路由、ORM(对象关系映射)、后台管理系统、表单验证、用户认证、安全防护......这些 Web 开发中几乎所有常见需求,Django 都帮你内置好了,你只需要按照它的"套路"填空即可。
正因为这种"开箱即用、功能齐全"的特点,Django 被称为"为完美主义者设计的 Web 框架",非常适合中大型项目、需要快速上线的业务系统,Instagram、Pinterest 早期以及国内很多内容管理系统、后台系统都是基于 Django 构建的。
本文将带你了解 Django 的核心概念,并通过一个完整的小例子,让你在几分钟内跑起属于自己的第一个 Django 应用。
一、Django 是什么?
Django 由美国一家新闻网站团队于 2003 年开发,2005 年开源,其设计初衷就是为了应对新闻网站"内容多、上线快"的需求,因此 Django 从诞生起就自带一整套"全家桶"式的解决方案。
Django 的主要特点
- "全家桶"式框架:内置 ORM、模板引擎、表单系统、用户认证、后台管理(Admin)等,开箱即用
- 强大的自动化后台管理系统:几行配置就能生成一个功能完整的数据管理后台
- ORM 十分成熟:用 Python 类来描述数据表结构,几乎不用手写 SQL
- 安全性高:默认就防护了 CSRF、SQL 注入、XSS 等常见 Web 安全问题
- MTV 架构:Model(模型)- Template(模板)- View(视图),本质上和常见的 MVC 架构思想一致
- 约定优于配置:项目结构、代码组织方式都有一套官方推荐规范,团队协作更规范统一
Django 与 Flask 的区别(简单对比)
| 维度 | Flask | Django |
|---|---|---|
| 定位 | 微框架,核心精简 | 全功能框架,内置组件丰富 |
| 学习曲线 | 平缓,上手快 | 稍陡,概念较多 |
| 灵活性 | 高,自由选择技术栈 | 相对固定,遵循官方约定 |
| 数据库 | 需自行引入 ORM(如 SQLAlchemy) | 内置 ORM,开箱即用 |
| 后台管理 | 需自行开发或引入扩展 | 内置强大的 Admin 后台 |
| 适合场景 | 小型项目、API 服务、原型验证 | 中大型项目、需要快速搭建完整系统 |
二、环境准备
同样,建议先创建一个独立的虚拟环境,避免依赖冲突:
bash
# 创建虚拟环境
python -m venv venv
# 激活虚拟环境
# Windows:
venv\Scripts\activate
# macOS / Linux:
source venv/bin/activate
安装 Django:
bash
pip install django
查看版本,确认安装成功:
bash
python -m django --version
三、动手实践:第一个 Django 应用
Django 的项目结构比 Flask 复杂一些,涉及"项目(Project)"和"应用(App)"两个层级的概念:一个 Project 可以包含多个 App,App 是可复用的功能模块(比如"用户系统"、"文章系统"分别是两个 App)。
1. 创建项目
bash
django-admin startproject mysite
cd mysite
执行后会生成如下结构:
mysite/
├── manage.py # 命令行管理工具,几乎所有操作都靠它
└── mysite/
├── __init__.py
├── settings.py # 项目全局配置(数据库、时区、已安装应用等)
├── urls.py # 项目总路由
├── asgi.py
└── wsgi.py
2. 创建一个应用(App)
bash
python manage.py startapp blog
会新增一个 blog/ 目录:
blog/
├── migrations/
├── __init__.py
├── admin.py # 后台管理配置
├── apps.py
├── models.py # 数据模型定义
├── tests.py
└── views.py # 视图函数(业务逻辑)
3. 编写一个"文章列表"小示例
我们做一个最简单的例子:定义一个 Post(文章)模型,实现"列表展示 + 后台管理"两个功能。
第一步:在 blog/models.py 中定义数据模型
python
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=100, verbose_name='标题')
content = models.TextField(verbose_name='内容')
created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
def __str__(self):
return self.title
class Meta:
verbose_name = '文章'
verbose_name_plural = '文章'
第二步:在 mysite/settings.py 中注册应用
找到 INSTALLED_APPS 列表,加入 'blog':
python
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog', # 新增
]
第三步:生成并执行数据库迁移
Django 的 ORM 会根据 models.py 里的类自动生成数据表结构:
bash
python manage.py makemigrations
python manage.py migrate
第四步:编写视图 blog/views.py
python
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})
第五步:创建模板 blog/templates/blog/post_list.html
html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>我的博客</title>
<style>
body { font-family: "Microsoft YaHei", sans-serif; max-width: 700px; margin: 60px auto; }
.post { border-bottom: 1px solid #eee; padding: 16px 0; }
.post h3 { margin: 0 0 8px; color: #2c7be5; }
.post .meta { color: #999; font-size: 13px; }
</style>
</head>
<body>
<h2>📚 文章列表</h2>
{% for post in posts %}
<div class="post">
<h3>{{ post.title }}</h3>
<p>{{ post.content }}</p>
<div class="meta">发布于 {{ post.created_at }}</div>
</div>
{% empty %}
<p>暂时还没有文章,快去后台添加一篇吧~</p>
{% endfor %}
</body>
</html>
第六步:配置路由
在 blog/ 目录下新建 urls.py:
python
from django.urls import path
from . import views
urlpatterns = [
path('', views.post_list, name='post_list'),
]
然后在项目总路由 mysite/urls.py 中接入这个子路由:
python
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('blog/', include('blog.urls')),
]
第七步:把模型注册到后台管理系统 blog/admin.py
python
from django.contrib import admin
from .models import Post
admin.site.register(Post)
4. 运行起来看效果
创建一个管理员账号,用于登录后台:
bash
python manage.py createsuperuser
按提示输入用户名、邮箱、密码,然后启动开发服务器:
bash
python manage.py runserver
依次体验:
- 访问
http://127.0.0.1:8000/admin/,用刚才创建的账号登录,就能看到一个已经做好增删改查界面的"文章"管理后台,点击"新增"即可添加几篇文章------全程不用写一行后台页面代码,这就是 Django Admin 的威力。 - 访问
http://127.0.0.1:8000/blog/,就能看到我们在post_list.html中渲染出来的文章列表页面。
5. 代码要点解析
- Model(模型) :
models.py中的Post类对应数据库中的一张表,字段用CharField、TextField、DateTimeField等类来描述,Django ORM 会自动帮你生成建表 SQL。 - 迁移(Migration) :
makemigrations根据模型变化生成迁移文件(相当于数据库的"版本记录"),migrate则把这些变更真正应用到数据库中。 - View(视图) :
views.py中的函数负责处理请求、查询数据、选择模板并返回响应,Post.objects.all()是 Django ORM 查询所有记录的写法,等价于SELECT * FROM blog_post。 - Template(模板) :同样基于 Jinja 风格的 Django 模板语言(DTL),
{% for %}、{``{ 变量 }}用法与 Flask 中的 Jinja2 非常相似。 - URLconf(路由配置) :Django 提倡每个 App 维护自己的
urls.py,再通过include()挂载到项目总路由上,方便模块化管理。 - Admin 后台 :只需要
admin.site.register(Post)一行代码,就能获得一个功能完整(支持搜索、筛选、分页)的数据管理后台,这是 Django 相比 Flask 最具代表性的差异化优势之一。
四、常用生态一览
| 库/工具 | 用途 |
|---|---|
| Django REST framework (DRF) | 业界最主流的 Django API 开发框架 |
| django-crispy-forms | 更美观地渲染表单 |
| Celery | 配合 Django 做异步任务/定时任务 |
| django-debug-toolbar | 开发阶段的调试信息面板 |
| Gunicorn + Nginx | 生产环境部署常用组合 |
五、总结
通过本文,我们了解了:
- Django 是一个"全家桶"式的重型 Web 框架,内置 ORM、模板、表单、认证、后台管理等一整套解决方案;
- Django 项目采用 Project + App 的层级结构,遵循 MTV(Model-Template-View)架构;
- 通过定义 Model、编写 View、配置 URL 三步,即可完成一个数据驱动的页面;
- 一行
admin.site.register()就能获得功能完整的后台管理系统,这是 Django 最具辨识度的特性之一。
如果你的项目需要快速搭建、功能相对齐全(比如带后台管理的内容系统、中大型业务系统),Django 会大大提升开发效率;而如果你只是想快速写一个轻量的 API 服务或做技术验证,Flask 可能会更灵活轻便。两者并没有绝对的优劣,选择合适的工具才是关键。
后续我会继续分享 Django REST framework 搭建 API 接口、以及 Django 项目部署上线(Gunicorn + Nginx)的实战内容,欢迎关注~
参考资料
- Django 官方文档:https://docs.djangoproject.com/
- Django REST framework 官方文档:https://www.django-rest-framework.org/