创建并激活虚拟环境

向量宇航员
2025-06-18 23:03
阅读 254

从零搭建你的第一个 Django 网站:实战经验分享

从零搭建你的第一个 Django 网站:实战经验分享

记得我刚入行那会儿,老板让我两周内上线一个内部使用的资产管理后台。说实话,我当时对 Python 还算熟悉,但从来没用 Django 做过项目。面对这个任务,心里其实有点发虚。不过好在 Django 的文档很清晰,社区活跃,再加上自己一点点摸索和踩坑,最后顺利完成了任务,还收获了不少宝贵的经验。

今天我想以亲身经历为基础,结合一些常见问题,带大家一步步完成一个基础但完整的 Django 网站搭建流程。不是那种“hello world”级别的演示,而是真正面向实际开发、贴近生产环境的实战教程。

初识 Django:为什么选择它?

我们先来简单介绍一下 Django。Django 是一个基于 Python 的高级 Web 框架,内置了 ORM(对象关系映射)、Admin 后台、模板引擎、用户认证系统等一系列功能,特别适合快速开发数据库驱动型网站。

它的官方口号是:“为完美主义者设计的框架”。这话不假,Django 的设计理念强调“约定优于配置”,让我们能更专注于业务逻辑而不是底层细节。


项目背景:一个小型资产管理系统

为了方便说明,我将以我当初那个资产管理系统的开发过程为例,带大家走一遍 Django 的基本使用流程。

这个系统的业务需求相对简单:

  • 登录认证;
  • 展示公司内部设备的基本信息(如电脑、服务器、打印机等);
  • 支持增删改查操作;
  • 提供搜索与分类展示的功能;
  • 有权限控制,普通用户只能查看,管理员可编辑。

这正是 Django 擅长处理的场景。


第一步:搭起项目骨架

我们先安装 Django。建议使用虚拟环境,这样不会污染全局的 Python 环境。

python3 -m venv venv
source venv/bin/activate

# 安装 Django
pip install django

接下来创建项目:

django-admin startproject asset_management .

此时你会看到这样的目录结构:

asset_management/
├── manage.py
└── asset_management/
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

运行一下测试服务器:

python manage.py runserver

如果看到“Starting development server...”说明一切正常。

小插曲:有一次我在 Windows 上跑 runserver 总是失败,后来发现是因为杀毒软件拦截了本地服务绑定端口。这个问题虽然不大,但也提醒我们要留意环境层面的限制。


第二步:创建 App 和模型

Django 鼓励模块化开发,每个功能模块作为一个 App。我们可以创建一个叫 assets 的 App 来管理我们的资产数据。

python manage.py startapp assets

别忘了把它添加到 settings.py 中的 INSTALLED_APPS 里。

接着是定义模型(model),也就是我们数据的结构。打开 assets/models.py 添加如下内容:

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

class Asset(models.Model):
    DEVICE_TYPES = [
        ('computer', '计算机'),
        ('server', '服务器'),
        ('printer', '打印机'),
        ('network', '网络设备'),
    ]

    name = models.CharField(max_length=100)
    serial_number = models.CharField(max_length=50, unique=True)
    device_type = models.CharField(max_length=20, choices=DEVICE_TYPES)
    owner = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True)
    purchase_date = models.DateField()
    notes = models.TextField(blank=True)

    def __str__(self):
        return self.name

这里有几个关键点需要注意:

  • 使用了 Django 自带的 User 模型进行关联;
  • 对序列号做了唯一性约束;
  • 设备类型使用 choice 字段提升可维护性;
  • 备注字段支持空值,提升扩展性。

然后生成迁移文件并执行数据库迁移:

python manage.py makemigrations
python manage.py migrate

踩坑记录:一开始我把 serial_number 设置成了非唯一字段,结果后期发现重复入库导致统计错误。后来意识到这类字段一定要加 unique=True


第三步:注册 Admin,快速构建后台管理界面

Django 最让人惊喜的就是自带的 Admin 系统,几乎不需要写任何代码就能得到一套完整的后台界面。

首先,在 assets/admin.py 注册我们的 Asset 模型:

from django.contrib import admin
from .models import Asset

admin.site.register(Asset)

然后创建超级用户用于登录:

python manage.py createsuperuser

启动服务后访问 http://localhost:8000/admin,输入你刚才设置的账号密码,就可以看到资产表单了!

优化体验:你可以自定义 admin 页面显示的字段、筛选条件、排序方式等。比如:

@admin.register(Asset)
class AssetAdmin(admin.ModelAdmin):
    list_display = ('name', 'serial_number', 'device_type', 'owner', 'purchase_date')
    list_filter = ('device_type', 'purchase_date')
    search_fields = ['name', 'serial_number']

这一部分虽然是后台功能,但对于产品早期快速验证非常有用,特别是在团队内部试用阶段。


第四步:实现前端页面和接口

接下来我们需要对外提供访问页面或接口。

创建视图和模板

Django 的视图机制可以同时支持传统 HTML 页面渲染,也可以返回 JSON 数据做前后端分离。

这里我们先实现一个简单的资产列表页。

首先修改 urls.py

from django.urls import path
from assets import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('assets/', views.asset_list, name='asset_list'),
]

然后编写视图函数 views.py

from django.shortcuts import render
from .models import Asset

def asset_list(request):
    assets = Asset.objects.all()
    return render(request, 'assets/list.html', {'assets': assets})

接着创建模板路径:assets/templates/assets/list.html,内容如下:

<!DOCTYPE html>
<html>
<head>
    <title>资产列表</title>
</head>
<body>
    <h1>资产清单</h1>
    <ul>
        {% for asset in assets %}
            <li>{{ asset.name }} - {{ asset.serial_number }}</li>
        {% endfor %}
    </ul>
</body>
</html>

访问 http://localhost:8000/assets/ 就能看到效果啦!

注意性能问题:当数据量大时,直接取全部 Asset.objects.all() 可能导致性能下降,建议加上分页逻辑。

我们可以用 Django 的 Paginator 类:

from django.core.paginator import Paginator
from django.shortcuts import render
from .models import Asset

def asset_list(request):
    asset_list = Asset.objects.all()
    paginator = Paginator(asset_list, 20) # 每页显示20条

    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)

    return render(request, 'assets/list.html', {'page_obj': page_obj})

再稍微调整下模板中的循环语句即可。


构建 API 接口(RESTful)

如果你的产品需要接入移动端或其他服务,API 接口就必不可少。我们可以使用 Django REST framework(DRF)来做这件事。

先安装依赖:

pip install djangorestframework

添加到 INSTALLED_APPS 中:

INSTALLED_APPS = [
    ...
    'rest_framework',
    'assets'
]

然后创建 serializers.py:

from rest_framework import serializers
from assets.models import Asset

class AssetSerializer(serializers.ModelSerializer):
    class Meta:
        model = Asset
        fields = '__all__'

再写个视图类:

from rest_framework.generics import ListAPIView
from assets.models import Asset
from assets.serializers import AssetSerializer

class AssetListView(ListAPIView):
    queryset = Asset.objects.all()
    serializer_class = AssetSerializer

修改路由配置:

from django.urls import path
from assets.views import AssetListView

urlpatterns = [
    path('api/assets/', AssetListView.as_view()),
]

现在访问 /api/assets/ 就可以看到返回的 JSON 数据了,支持过滤、分页、认证等功能都可以在此基础上扩展。


第五步:部署上线前的关键准备

当开发完成后,部署是另一个重要环节。以下是几个我在真实项目中遇到的问题和应对策略。

使用 Gunicorn + Nginx 部署生产环境

Gunicorn 是一个常用的 WSGI HTTP Server,适合部署 Python Web 应用。

安装 Gunicorn:

pip install gunicorn

运行:

gunicorn -w 4 asset_management.wsgi:application

但直接使用 Gunicorn 并不合适,通常我们会配合 Nginx 做反向代理,好处包括:

  • 更好的静态文件处理;
  • 负载均衡;
  • 请求过滤(例如限流、SSL 终止);

配置示例(Nginx):

server {
    listen 80;
    server_name yourdomain.com;

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    location /static/ {
        alias /path/to/staticfiles/;
    }
}

设置安全措施

上线之前,务必检查以下几点:

  • Debug 模式关闭:DEBUG=False
  • 设置 ALLOWED_HOSTS,防止 Host 头攻击
  • 使用 HTTPS(Let's Encrypt 免费证书)
  • 设置 CSRF 和 Session Cookie 的安全属性

还有个小技巧:在生产环境中开启缓存中间件也能提升响应速度。

数据库优化建议

  • 使用 PostgreSQL 替代 SQLite(尤其在并发高时)
  • 为常用查询字段建立索引
  • 定期清理无效数据
  • 做好备份策略(可以用 django-dbbackup 工具)

开发感悟与总结

通过这个项目,我总结出几点经验:

  • Django 的优势在于开发效率和生态完善。对于中小项目来说,它能帮助我们快速上手,节省大量时间。
  • 架构要提前规划。不要等做到一半才发现模型设计不合理。我曾经因为没考虑权限粒度,导致后期重构花了很多精力。
  • 性能优化不能忽视。即使是一个简单的 CRUD 应用,在数据量上涨之后也会面临瓶颈。分页、缓存、异步任务这些能力都要提前布局。
  • 运维要尽早介入。从部署方式、日志监控到自动发布流程,都要在开发过程中同步跟进。

写给想入门的同学的建议

  1. 动手实践比看文档更重要:Django 文档写得确实很好,但你不亲手敲一次代码是体会不到其中奥妙的。
  2. 学会借助社区力量:Stack Overflow、GitHub issues、Reddit/Django 子版块都是解决问题的好地方。
  3. 不要怕踩坑:每一个错误都是一次成长的机会。我在第一次部署的时候,花了半天排查到底是 Gunicorn 配置还是 Nginx 的问题。
  4. 逐步加入工程规范:项目初期可以不那么严格,但一旦进入团队协作阶段,就要引入 Git、单元测试、CI/CD 流程等标准工程实践。

结语:Python 与 Django 的未来趋势

如今,Django 不仅在中小型项目中依然占据主流地位,在大型系统中也有越来越多的应用场景。像 Instagram 这样的超大规模平台也是基于 Django 扩展而来。

而随着 FastAPI 的崛起,很多同学也在思考是否应该转向其他框架。我的观点是:Django 在通用业务系统上的竞争力仍然很强,尤其是在企业级应用、CMS、CRM 这一类场景中依旧不可替代

当然,技术没有绝对的好坏,关键是根据项目需求合理选择工具。希望这篇分享能够帮助你少走弯路,顺利踏上 Django 的旅程。

评论 0

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