settings.py

Spring打工人
2025-06-23 18:23
阅读 587

从0到1:用Django搭建我的第一个Python网站,真实经验分享

从0到1:用Django搭建我的第一个Python网站,真实经验分享

大家好,我是老王。在我们公司做后端开发已经五年了,日常工作大部分都是围绕着Python展开的。今天想和大家分享一下我第一次使用 Django 搭建网站的经历,包括我在项目初期踩过的坑、遇到的问题,以及后来的一些优化思路。

这篇文章适合刚刚接触 Python Web 开发的同学,也欢迎有经验的朋友来交流心得。我会结合自己的实际项目经验,尽量用通俗易懂的语言讲清楚整个过程。


起因:为什么选择Django?

大概是三年前,公司在做一个内部的资源管理系统(类似企业资产登记 + 员工申请审批流程),需要一个后台管理平台。项目周期短,功能不多但要求快速上线,所以我们在技术选型上考虑了很多轻量级的框架。

最初是准备用 Flask 的,毕竟灵活性高、学习成本低。但随着需求逐渐细化,发现权限管理、用户系统、数据展示这些模块都需要自己去写中间件或者集成第三方库,开发效率反而不如预期。

后来我建议换 Django,虽然“重”一点,但它自带 Admin 后台、ORM 强大、社区活跃,特别适合这种中小型管理系统,而且可以快速出原型。最终团队采纳了我的建议,我也成为了这个项目的负责人。


项目背景 & 遇到的挑战

系统的整体功能其实并不复杂:

  • 资产类型管理(服务器、笔记本、显示器)
  • 资产申领/归还记录
  • 用户权限分级(普通员工、部门主管、管理员)
  • 审批流程(简单状态流转)

看起来好像挺简单的,但在开发过程中还是遇到了不少问题,其中最突出的有以下几个:

  1. 数据库设计不合理导致后期扩展困难
  2. 对Django ORM理解不深,导致查询性能低下
  3. 用户认证与权限控制没有提前规划,后期返工严重
  4. 静态文件部署在生产环境时出现加载失败

下面我会一一道来这些问题的具体表现和解决思路。


技术方案与实现思路

整体架构设计

我们采用的是经典的前后端分离架构,不过前端当时没时间搭 Vue 项目,就先用 Django 自带的模板系统做了个简易前端页面,主要是为了快速上线和演示。

后端逻辑结构如下:

├── assets              # 资产相关模型和视图
├── users               # 用户系统模块
├── permissions         # 权限验证模块
├── approvals           # 审批流程
└── config/
    └── settings.py     # 配置中心

数据库方面选择了 PostgreSQL(生产环境),开发时用 SQLite 即可满足测试需求。


关键代码片段分享

数据模型设计(models.py)

以资产表为例,这里用了外键关联用户和分类:

from django.db import models
from django.contrib.auth.models import User

class AssetType(models.Model):
    name = models.CharField(max_length=100, unique=True)
    
    def __str__(self):
        return self.name

class Asset(models.Model):
    asset_type = models.ForeignKey(AssetType, on_delete=models.CASCADE)
    serial_number = models.CharField(max_length=100, unique=True)
    status_choices = (
        ('available', '可申领'),
        ('in_use', '已使用'),
        ('broken', '损坏'),
    )
    status = models.CharField(max_length=20, choices=status_choices, default='available')
    owner = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)
    
    def __str__(self):
        return f"{self.asset_type} - {self.serial_number}"

小贴士:on_delete=models.SET_NULL 是为了避免删除用户后资产丢失,这是生产环境中很常见的做法。


视图和权限控制(views.py)

因为项目中涉及不同角色的操作权限,所以我们没有直接用通用视图(generic views),而是封装了一个装饰器来做权限判断:

def admin_required(view_func):
    def wrapped_view(request, *args, **kwargs):
        if not request.user.is_superuser:
            return redirect('home')  # 或者返回403
        return view_func(request, *args, **kwargs)
    return wrapped_view

@admin_required
def manage_assets(request):
    assets = Asset.objects.all()
    return render(request, 'admin/assets.html', {'assets': assets})

当然,如果你希望更灵活,也可以用 Django Guardian 这样的第三方库,但我们当时追求简洁就自己写了装饰器。


开发过程中的几个“坑”

1. ORM 查询写法不当造成性能瓶颈

早期我犯了一个新手常犯的错误——在模板里频繁调用 ORM 查询:

{% for asset in assets %}
    <p>{{ asset.owner.get_full_name }}</p> <!-- 多次触发查询 -->
{% endfor %}

这样会造成 N+1 查询问题,严重影响页面加载速度。

解决方案:使用 select_related() 预加载关联对象:

assets = Asset.objects.select_related('owner').all()

或者对于多层关系,可以用 prefetch_related()


2. 用户系统自定义时没有继承 AbstractUser,导致扩展困难

一开始直接用默认的 User 模型:

from django.contrib.auth.models import User

后来要加手机字段、头像等信息,才发现无法扩展。于是又花了不少时间迁移到自定义用户模型:

from django.contrib.auth.models import AbstractUser

class CustomUser(AbstractUser):
    phone = models.CharField(max_length=20, blank=True)
    avatar = models.ImageField(upload_to='avatars/', null=True, blank=True)

然后还要在 settings.py 中指定:

AUTH_USER_MODEL = 'users.CustomUser'

这一步如果一开始就考虑到后面的功能扩展,就能省不少功夫。


3. 生产环境静态文件配置搞错了路径

在本地调试时一切正常,部署到线上后 CSS 和 JS 文件全都加载失败。

原来是因为没有设置好 STATIC_ROOTSTATIC_URL。正确的做法是:

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')  # 用于收集静态文件

然后在 Nginx 配置中代理 /static/ 路径到该目录。


项目上线后的效果与收益

虽然项目规模不大,但从零开始到上线仅用了两周时间(包括设计、编码、测试、部署),比预估快了整整一周,主要原因有几点:

  • Django 提供了足够完善的组件(Admin 管理后台简直救命)
  • ORM 极大地简化了数据库操作
  • 权限机制通过内置和自定义装饰器很快完成
  • 开发体验优秀,代码结构清晰

上线后运行稳定,用户反馈良好。最重要的是后续维护起来非常方便,新增字段或接口都很简单,为后来的扩展打下了坚实的基础。


我的经验建议

如果你也刚入门 Django 或者正在搭建类似的系统,以下几点是我亲身经历总结下来的建议:

1. 合理设计模型关系,避免后期重构

  • 使用 ForeignKey、ManyToManyField 时一定要考虑业务场景
  • 注意是否允许为空(null=True)、是否唯一(unique=True)
  • 多用 choicesdefault 控制字段行为

2. 早点规划好用户系统和权限机制

  • 如果预计会有较多个性化信息,直接从 AbstractUser 继承
  • 对于多角色系统,可以使用 Group 或者自定义字段(如 role)

3. 关注性能细节,别让 ORM 成为瓶颈

  • 了解 select_relatedprefetch_related 的使用场景
  • 避免在模板中写复杂逻辑或多次数据库访问

4. 部署时不要忽视静态文件和安全配置

  • 在生产环境关闭 DEBUG 模式
  • 设置合适的 ALLOWED_HOSTS
  • 正确配置 STATIC_ROOT,否则会报错 500

5. 善用 Admin 管理后台

  • 只需注册模型就能生成完整的CRUD界面
  • 支持搜索、过滤、字段展示等自定义

最后说几句心里话

作为一名开发者,我觉得 Django 最打动我的不仅是它强大的功能,更是它那种“帮你把基础做好”的态度。它不是最轻量的框架,但确实是能让你专注在业务开发上的工具。

刚开始写第一个 Django 项目的时候,我也经常卡在各种小问题上,比如模板渲染不出、迁移失败、权限跳转不对……但每解决一个问题,就离真正的“产品化”近了一步。

技术成长没有捷径,只能靠一个一个项目慢慢打磨。希望这篇实战经验对你有所帮助。如果你也在学 Django,不妨动手做一个小项目练练手,哪怕只是个 Todo List 或 Blog,也能收获很多。

如果你觉得这篇文章对你有帮助,或者有什么疑问,欢迎留言讨论。我们一起成长!


文章字数:约 2977 字
关键词:Django入门教程、Python网站开发、后端实战经验、Web开发技巧、数据库设计、权限控制、生产部署

评论 0

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