从零开始:用 Django 搭建我的第一个 Python 网站

王庆华△
2025-06-23 13:40
阅读 496

开篇:一次偶然的机会让我接触了 Django

开篇:一次偶然的机会让我接触了 Django

去年,我刚换了一家公司,做的主要是后端开发的工作。当时公司的一个项目需要快速搭建一个内部使用的管理后台,用来展示、管理和分析业务数据。因为时间紧任务重,技术选型上需要考虑开发效率和可维护性。

我之前主要做的是 Java 后台开发,对 Python 并不算陌生,但真正动手去写一个完整的网站还是第一次。领导建议我试试 Django —— 因为它自带 ORM、Admin 系统和路由系统,能快速搭建原型,后期也容易扩展。于是,我开启了人生中第一个用 Django 构建的网站之旅。

这篇文章记录的就是我从零搭建这个项目的过程,包括踩过的坑、学到的经验和一些实用技巧。


问题描述:项目背景与面临的挑战

项目需求其实不复杂:

负载均衡配置-2

  1. 展示多个业务表的数据(订单、用户信息、商品库存等)
  2. 提供简单的数据过滤和导出功能
  3. 有用户权限管理(部分人只能看,部分人可以修改)
  4. 最终要部署到生产环境供内部使用

听起来好像就是个 CRUD 的活儿,但如果真这么简单我也不会在这里写了 😅。实际过程中,我遇到了不少棘手的问题:

  • 模型设计:如何合理组织数据模型?如何避免冗余?
  • 权限控制:Django 自带的认证系统怎么用?如何细化到字段级别?
  • 部署配置:本地开发没问题,一上线就报错 —— 静态文件加载失败、DEBUG 模式没关、数据库连接不上…
  • 性能优化:随着数据量增加,页面越来越慢,怎么办?

这些问题让我意识到,看似简单的“小项目”,也需要认真对待架构设计和性能考虑。


解决方案:为什么选择 Django?

解决方案:为什么选择 Django?

Django 是一款基于 Python 的全栈 Web 框架,它的核心理念是 "Don't Repeat Yourself" 和 "Convention over Configuration"。也就是说,大部分常用功能都已经内置好了,开发者只需要专注于自己的业务逻辑,不需要重复造轮子。

我选择 Django 主要是因为以下几个原因:

  1. 开箱即用的功能丰富

    • 用户认证系统(auth 应用)
    • Admin 后台(自动创建 CRUD 页面)
    • ORM(对象关系映射)
    • 中间件、缓存、模板引擎……你几乎想不到什么 Django 没有的
  2. 开发效率高

    • 使用命令行工具快速生成项目结构
    • 数据模型定义清晰,ORM 使用非常顺手
  3. 社区成熟,资料丰富

    • 遇到问题基本都能搜到解决方案或样例代码

当然,它也有缺点,比如灵活性不如 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.pyINSTALLED_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)


![服务器部署方案-1](https://code-guide.oss.shanghai.autogptai.club/common/file/download?name=date2025062313/c420011e-468c-49c8-bbea-ccd6a34fd92a.jpg)


    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-formsdjango-filterrest-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

最热最新
暂无评论
匿名用户Lv.1
0
影响力
0
文章
0
粉丝