Python Django 框架入门:从零搭建你的第一个 Web 应用

前言

上一篇文章我们介绍了 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

依次体验:

  1. 访问 http://127.0.0.1:8000/admin/,用刚才创建的账号登录,就能看到一个已经做好增删改查界面的"文章"管理后台,点击"新增"即可添加几篇文章------全程不用写一行后台页面代码,这就是 Django Admin 的威力。
  2. 访问 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 生产环境部署常用组合

五、总结

通过本文,我们了解了:

  1. Django 是一个"全家桶"式的重型 Web 框架,内置 ORM、模板、表单、认证、后台管理等一整套解决方案;
  2. Django 项目采用 Project + App 的层级结构,遵循 MTV(Model-Template-View)架构;
  3. 通过定义 Model、编写 View、配置 URL 三步,即可完成一个数据驱动的页面;
  4. 一行 admin.site.register() 就能获得功能完整的后台管理系统,这是 Django 最具辨识度的特性之一。

如果你的项目需要快速搭建、功能相对齐全(比如带后台管理的内容系统、中大型业务系统),Django 会大大提升开发效率;而如果你只是想快速写一个轻量的 API 服务或做技术验证,Flask 可能会更灵活轻便。两者并没有绝对的优劣,选择合适的工具才是关键。

后续我会继续分享 Django REST framework 搭建 API 接口、以及 Django 项目部署上线(Gunicorn + Nginx)的实战内容,欢迎关注~


参考资料

相关推荐
LOVE️YOU1 小时前
Python 中 Tuple 为什么有时可 Hash,有时不可 Hash?
开发语言·python·哈希算法
小oo呆1 小时前
【学习心得】迭代器和可迭代对象
开发语言·python
AC赳赳老秦2 小时前
采集行为合规自检:OpenClaw 自动校验 robots 协议与采集频率,规避违规采集风险
java·开发语言·c++·python·php·deepseek·openclaw
迅猛龙办公室2 小时前
Python输出当前计算机的系统日期和时间
开发语言·前端·python
小狼154542 小时前
浏览器扩展脚本为什么有时候不生效:注入时机、iframe 和单页路由,多多开票助手
前端·chrome
じòぴé南冸じょうげん2 小时前
油猴脚本突然发现变成灰色了,无法使用?页面不生效?刷新页面没反应?
前端
XiaoMaqqqq3 小时前
知名的IP驱动产业新场景新工具
网络·python·网络协议·tcp/ip
言乐63 小时前
Python实现语音审核模型
开发语言·python·django·virtualenv·pygame
Csvn4 小时前
组合式 API(Composition API)
前端
程序员清风4 小时前
Python 数据分析环境搭建:从 Jupyter 到 pandas
python·jupyter·数据分析