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 类对应数据库中的一张表,字段用 CharFieldTextFieldDateTimeField 等类来描述,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)的实战内容,欢迎关注~


参考资料

相关推荐
专业程序开发源6 小时前
springbootLivehouse票务系统-计算机课程设计、毕业设计
vue.js·spring boot·后端·python·django·课程设计·pygame
PC2005_cloud6 小时前
Rust学习笔记:所有权、借用与生命周期——Rust的核心机制
前端·后端
leoZ2316 小时前
2026-09-10-静态扫描连错三次-用运行环境当裁判
前端·javascript·vue.js·人工智能·opencv·机器学习·数据挖掘
Maxkim6 小时前
我把一个"会自己查资料"的 AI 助手塞进了浏览器侧边栏,开源了
前端·javascript
2601_966949656 小时前
从轮询到策略消费:量化系统如何高效处理五档盘口数据
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
萧鼎7 小时前
2026实战:用 accelerate 库加速 PyTorch 训练,核心语法与避坑指南
python·开源·教程·python库·accelerate
计算机魔术师7 小时前
英伟达要投100亿美元入股Anthropic,史上最大IPO的底牌
前端
我命由我123457 小时前
人脸识别 - 去重时间窗口
java·开发语言·python·学习·java-ee·学习方法·python3.11
王志来137944730087 小时前
安防监控工控工业服务器配套
运维·服务器·python