从零开始:用 Django 搭建我的第一个 Python 网站
开篇:一次偶然的机会让我接触了 Django

去年,我刚换了一家公司,做的主要是后端开发的工作。当时公司的一个项目需要快速搭建一个内部使用的管理后台,用来展示、管理和分析业务数据。因为时间紧任务重,技术选型上需要考虑开发效率和可维护性。
我之前主要做的是 Java 后台开发,对 Python 并不算陌生,但真正动手去写一个完整的网站还是第一次。领导建议我试试 Django —— 因为它自带 ORM、Admin 系统和路由系统,能快速搭建原型,后期也容易扩展。于是,我开启了人生中第一个用 Django 构建的网站之旅。
这篇文章记录的就是我从零搭建这个项目的过程,包括踩过的坑、学到的经验和一些实用技巧。
问题描述:项目背景与面临的挑战
项目需求其实不复杂:

- 展示多个业务表的数据(订单、用户信息、商品库存等)
- 提供简单的数据过滤和导出功能
- 有用户权限管理(部分人只能看,部分人可以修改)
- 最终要部署到生产环境供内部使用
听起来好像就是个 CRUD 的活儿,但如果真这么简单我也不会在这里写了 😅。实际过程中,我遇到了不少棘手的问题:
- 模型设计:如何合理组织数据模型?如何避免冗余?
- 权限控制:Django 自带的认证系统怎么用?如何细化到字段级别?
- 部署配置:本地开发没问题,一上线就报错 —— 静态文件加载失败、DEBUG 模式没关、数据库连接不上…
- 性能优化:随着数据量增加,页面越来越慢,怎么办?
这些问题让我意识到,看似简单的“小项目”,也需要认真对待架构设计和性能考虑。
解决方案:为什么选择 Django?

Django 是一款基于 Python 的全栈 Web 框架,它的核心理念是 "Don't Repeat Yourself" 和 "Convention over Configuration"。也就是说,大部分常用功能都已经内置好了,开发者只需要专注于自己的业务逻辑,不需要重复造轮子。
我选择 Django 主要是因为以下几个原因:
开箱即用的功能丰富:
- 用户认证系统(auth 应用)
- Admin 后台(自动创建 CRUD 页面)
- ORM(对象关系映射)
- 中间件、缓存、模板引擎……你几乎想不到什么 Django 没有的
开发效率高:
- 使用命令行工具快速生成项目结构
- 数据模型定义清晰,ORM 使用非常顺手
社区成熟,资料丰富:
- 遇到问题基本都能搜到解决方案或样例代码
当然,它也有缺点,比如灵活性不如 Flask,学习曲线略陡,但对于我这种想快速实现功能的人来说,Django 的优势远大于劣势。
代码实践:一步步搭建第一个站点
第一步:创建项目结构
先安装好 Django:
pip install django
然后创建项目:
django-admin startproject mysite
cd mysite
python manage.py runserver
此时访问 http://127.0.0.1:8000 就能看到 Django 默认的欢迎页了。
接下来我们创建两个 app:一个是处理用户的 accounts,另一个是管理业务数据的 dashboard:
python manage.py startapp accounts
python manage.py startapp dashboard
别忘了在 settings.py 的 INSTALLED_APPS 中加上这两个应用。
第二步:定义数据模型
以订单为例,在 dashboard/models.py 中添加如下模型:
from django.db import models
class Order(models.Model):
STATUS_CHOICES = (
('pending', '待支付'),
('paid', '已支付'),
('shipped', '已发货'),
('completed', '已完成'),
)
order_id = models.CharField(max_length=100, unique=True)
customer_name = models.CharField('客户名称', max_length=100)
product = models.ForeignKey('Product', on_delete=models.CASCADE)
amount = models.DecimalField('金额', max_digits=10, decimal_places=2)
status = models.CharField('状态', max_length=20, choices=STATUS_CHOICES, default='pending')
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)

class Meta:
verbose_name = '订单'
verbose_name_plural = '订单列表'
def __str__(self):
return self.order_id
然后运行迁移:
python manage.py makemigrations dashboard
python manage.py migrate
这时候数据库就已经被初始化了(默认是 SQLite,适合开发阶段)。
第三步:使用 Admin 管理数据
Django 自带 Admin 后台系统,简直是神器!
先注册一下模型:
# dashboard/admin.py
from django.contrib import admin
from .models import Order, Product
admin.site.register(Order)
admin.site.register(Product)
然后创建超级管理员账户:
python manage.py createsuperuser
访问 /admin 即可看到一个自动生成的后台管理页面!
📌 小贴士:Django Admin 虽然强大,但它更适合粗粒度的管理操作。如果你希望更灵活地定制页面,推荐结合 DRF(Django REST Framework)+ Vue/React 实现前后端分离。
第四步:编写视图和路由
现在我们来写一个简单的首页视图,显示最近的 5 条订单:
# dashboard/views.py
from django.shortcuts import render
from .models import Order
def index(request):
latest_orders = Order.objects.order_by('-created_at')[:5]
context = {
'orders': latest_orders
}
return render(request, 'dashboard/index.html', context)
然后配置路由:
# dashboard/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
]
# mysite/urls.py
from django.urls import include, path
urlpatterns = [
path('admin/', admin.site.urls),
path('dashboard/', include('dashboard.urls')),
]
最后,创建一个模板目录 templates/dashboard/index.html,写下 HTML 内容即可。
踩坑经验:那些年我掉过的坑
坑 1:静态资源加载不出来
生产环境下,Django 不会自动处理静态文件(CSS、JS、图片等)。很多人开发的时候一切正常,部署时才发现页面样式没了。
解决方式是在 settings.py 中配置:
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
然后运行收集命令:
python manage.py collectstatic
另外还需要配置 Nginx 或者其它反向代理服务器指向这些静态文件路径。
坑 2:忘记关闭 DEBUG 模式
开发时 DEBUG = True 可以看详细的错误信息,方便调试。但部署的时候一定要记得改成 False,不然会有安全风险,甚至暴露敏感配置信息!
而且当 DEBUG 关闭时,Django 不再自己处理静态文件,所以前面说的 collectstatic 必须执行。
坑 3:数据库连接超时或死锁
我们用的是 PostgreSQL,某天突然发现有些页面特别卡,甚至直接卡死。
排查后发现是因为有些查询没有加索引,导致每次查询都走 full table scan。比如有一个接口是根据订单状态筛选的,但是 status 字段没加索引。
解决方法很简单:给常用的过滤字段加上索引。
class Order(models.Model):
# ...
status = models.CharField(..., db_index=True)
或者在数据库层面手动加:
CREATE INDEX idx_order_status ON orders (status);
这大大提升了性能。
效果总结:项目上线后的收益
整个项目从开发到上线用了不到两周时间,比预期还要快。上线后我们也做了一些性能测试和监控:
| 指标 | 上线前 | 上线后 |
|---|---|---|
| 页面平均响应时间 | N/A(未上线) | 120ms |
| 接口并发能力 | N/A | 支持 100+ QPS |
| 部署稳定性 | 手动测试无异常 | 连续运行超过 3 个月无崩溃 |
| 维护成本 | 初始不高 | 扩展新功能简单,易维护 |
更重要的是,团队成员普遍反馈这个平台提高了工作效率,减少了人工报表处理的时间。
经验分享:给新手的一些建议
作为过来人,我想给刚开始用 Django 的同学几点建议:
1. 不要一开始就追求完美架构
尤其是对新手来说,先让项目跑起来最重要。你可以先把所有模型定义好,先让 admin 可用,后面再逐步优化。过度设计反而会让你陷入困境,影响进度。
2. 合理使用第三方插件
Django 社区有大量优秀的开源库,比如 django-crispy-forms、django-filter、rest-framework 等等,可以大大提高开发效率。
但也要注意不要盲目依赖太多插件,保持轻量化,便于后期维护。
3. 性能设计要提前考虑
虽然 Django 对小型项目很友好,但一旦数据量上去了,很多问题就会浮现出来。比如:
- 是否有必要引入 Redis 缓存热点数据?
- 复杂查询是否应该拆分或使用原生 SQL?
- 日志、监控、链路追踪是否已经准备好?
这些都需要在初期做好评估和规划。
4. 安全不能忽视
- 设置合适的权限规则
- 防止 SQL 注入(Django ORM 已经帮你防住了)
- 设置 CSRF Token(默认开启)
- 生产环境不要打开 DEBUG,确保密钥安全(不提交进 Git)
这些都是保障项目稳定运行的基础。
结语:Django 让我爱上了 Python
回头看看,这次用 Django 搭建项目的经历对我来说意义重大。不仅是掌握了新技能,更是体验到了另一种开发方式 —— 更加高效、简洁、人性化。
虽然中间也遇到各种坑,但在解决问题的过程中,我收获了成长,也更加坚定了继续深入学习 Python 技术栈的决心。
如果你也是一个刚开始接触 Web 开发的新手,不妨试试 Django —— 它真的值得拥有。就像我在项目上线那天写在日志里的一句话:
“Django 不一定是最完美的框架,但它是那种让你‘愿意多写点代码’的框架。”
📌 文末彩蛋:GitHub 示例项目地址
为了方便大家参考,我把文章中的完整示例整理成了一个 GitHub 项目,欢迎大家 Star/Fork 学习:
https://github.com/username/django-getting-started(请替换为你自己的链接)
如果你在学习过程中遇到问题,欢迎留言交流,我会尽量回复。
💬 如果你也经历过类似的项目搭建过程,或者有什么 Django 使用上的困惑,欢迎在评论区一起讨论!

评论 0