用 Django 快速搭建一个网站:我的第一个项目实战记录

前端散步者
2025-06-17 08:21
阅读 510

我第一次接触 Django,是在一家创业公司做后端开发的时候。公司业务发展快,需要快速上线一个内部管理系统,用来支持销售、客户管理以及报表统计等功能。当时团队只有我和一个前端小伙伴,时间紧任务重。考虑到 Python 的生态和上手速度,我们决定用 Django 来搭建后台服务。

说实话,虽然之前在学校里学过一点 Python,但真正要用 Django 搭建一个完整的 Web 应用,对我来说还是个不小的挑战。好在我身边有同事指点,加上网上教程很多,很快就入了门。不过在实际操作过程中,还是踩了不少坑。今天就来分享一下那次的经历,希望能帮刚入门的你少走些弯路。

背景与需求:为什么选择 Django?

背景与需求:为什么选择 Django?

项目的需求相对明确:我们要构建一个面向内部员工使用的 Web 系统,主要功能包括:

  • 用户注册与登录
  • 客户信息管理(增删改查)
  • 订单数据维护
  • 简单的数据统计页面

整个系统不需要复杂的性能优化,但要求上线快、结构清晰、后期容易扩展。我们选择了 Python + Django 的技术栈,主要原因如下:

  1. 开发效率高:Django 提供了很多开箱即用的功能,比如 Admin 后台、ORM、用户认证模块等。
  2. 结构规范:MVC 分离思想清晰,团队协作方便。
  3. 生态成熟:大量现成的库可以直接用,节省开发时间。
  4. 易于部署:生产环境可用 Nginx + Gunicorn 部署,稳定可靠。

初次尝试:从新建项目开始

初次尝试:从新建项目开始

安装完 Django 之后,第一步就是创建项目。执行下面这条命令就能生成基础目录结构:

django-admin startproject mysite

进入目录后你会看到类似这样的结构:

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

接下来运行服务器试试看:

python manage.py runserver

不出意外的话,访问 http://127.0.0.1:8000 就能看到“Welcome to Django”的默认页面。这一步看起来简单,但也有一些小问题要注意:

💡小插曲:刚开始我不小心在虚拟环境中安装了不同版本的 Django,导致启动时报错。后来意识到是因为环境配置混乱,立即用了 virtualenv 搞定。建议大家一定要用虚拟环境,避免依赖冲突!

创建应用:组织你的代码结构

创建应用:组织你的代码结构

Django 中项目的概念比较宏观,里面可以包含多个“app”,每个 app 对应不同的功能模块。于是我又执行:

python manage.py startapp customer

这里我新建了一个叫 customer 的 app,用于处理客户相关功能。

然后不要忘记把这个 app 加入到 INSTALLED_APPS 里,不然 Django 是不会识别它的。打开 mysite/settings.py,把 'customer.apps.CustomerConfig' 添加进去:

INSTALLED_APPS = [
    ...
    'customer.apps.CustomerConfig',
]

数据模型设计:数据库部分

这是我遇到的第一个挑战点。作为一个后端新手,我对数据库设计不太熟。当时的思路是:

  • 每个客户应该有基本的信息字段,比如姓名、电话、邮箱、地址等。
  • 每个订单对应一个客户。
  • 系统要支持用户登录才能操作。

因此我定义了一个 Customer 模型类:

# customer/models.py
from django.db import models
from django.contrib.auth.models import User

class Customer(models.Model):
    name = models.CharField(max_length=100)
    phone = models.CharField(max_length=20)
    email = models.EmailField()
    address = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)


![数据库设计模型-1](https://code-guide.oss.shanghai.autogptai.club/common/file/download?name=date2025061708/ad28c4de-c86e-4f1d-82bc-43a04818798f.jpg)


    def __str__(self):
        return self.name

还有一个关联订单的模型:

class Order(models.Model):
    customer = models.ForeignKey(Customer, on_delete=models.CASCADE)
    amount = models.DecimalField(max_digits=10, decimal_places=2)
    status = models.CharField(max_length=20, choices=[('pending', 'Pending'), ('paid', 'Paid')])
    created_at = models.DateTimeField(auto_now_add=True)

写完模型后,记得生成迁移文件并同步数据库:

python manage.py makemigrations
python manage.py migrate

这时候数据库表会自动创建好了,默认使用的是 SQLite 数据库。如果你要做正式项目,建议换成 MySQL 或 PostgreSQL。

🧠 经验总结:

  • 不要把所有内容放在一个 model 文件中,随着业务变复杂,建议拆分成 models/ 目录结构。
  • 使用外键时注意 on_delete 参数的选择。
  • 多用 auto_now_addauto_now 字段,简化时间戳管理。
  • 如果将来想对接移动端或开放 API 接口,建议一开始就考虑 RESTful 风格的设计。

Django Admin:快速搭建后台管理界面

这是让我眼前一亮的一块功能。Django 自带了一个后台管理系统,只需要注册模型就能自动生成 CRUD 页面。

customer/admin.py 中加入:

from django.contrib import admin
from .models import Customer, Order

admin.site.register(Customer)
admin.site.register(Order)

然后创建管理员账户:

python manage.py createsuperuser

登录后台后你会发现界面已经帮你做好了搜索、排序、列表展示、新增编辑这些功能。这对于早期验证产品逻辑非常有用。

⚠️小贴士:

后来我发现,在生产环境下不建议直接暴漏这个后台,建议限制访问 IP 或者做二次封装。

视图与路由:搭建页面交互流程

现在数据层准备好了,下一步是提供页面给用户访问。

我首先在 views.py 写了一个简单的视图函数,用来展示客户列表:

# customer/views.py
from django.shortcuts import render
from .models import Customer

def customer_list(request):
    customers = Customer.objects.all()
    return render(request, 'customer/list.html', {'customers': customers})

接着配置 URL:

# customer/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('customers/', views.customer_list, name='customer_list'),
]

主项目的 urls.py 还要 include 这个 app 的路由:

from django.urls import path, include

urlpatterns = [
    path('', include('customer.urls')),
]

最后写一个简单的 HTML 模板,放在 customer/templates/customer/list.html

<h1>客户列表</h1>
<ul>
{% for customer in customers %}
<li>{{ customer.name }} ({{ customer.phone }})</li>
{% endfor %}
</ul>

浏览器访问 /customers/ 成功看到了页面!

💬心得体会:

Django 的模板语法非常直观,而且支持继承复用。不过如果你打算用前后端分离的方式,那就可以跳过这一步,用 DRF(Django REST Framework)来返回 JSON 数据。

接口设计与 DRF:为未来扩展做铺垫

后面我们确实遇到了一个问题:前端小伙伴说他不想用 Django 模板引擎,想自己用 Vue.js 做组件化开发。

于是我决定引入 Django REST Framework 来提供接口。

先装包:

pip install djangorestframework

再把它加进 INSTALLED_APPS

INSTALLED_APPS = [
    ...
    'rest_framework',
]

接着是写一个视图集和序列化器:

# customer/serializers.py
from rest_framework import serializers
from .models import Customer

class CustomerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Customer
        fields = '__all__'
# customer/views.py
from rest_framework import viewsets
from .models import Customer
from .serializers import CustomerSerializer

class CustomerViewSet(viewsets.ModelViewSet):
    queryset = Customer.objects.all()
    serializer_class = CustomerSerializer

配置路由:

# customer/urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import CustomerViewSet

router = DefaultRouter()
router.register(r'customers', CustomerViewSet)

urlpatterns = [
    path('', include(router.urls)),
]

这样就暴露出了 RESTful API 接口,前端可以直接通过 fetch 请求拿到数据,再也不用 Django 的模板引擎了。

👍效果:

一套系统既可以作为传统 MVC 的网站使用,也可以作为前后端分离的 API 接口服务。这套架构灵活度很高,适合后续扩展。

上线部署:从开发机走向生产环境

本地跑得飞起,不代表在线上也能这么顺利。我们最终选择了 Nginx + Gunicorn + Supervisor + PostgresSQL 的组合。

主要步骤如下:

  1. 把数据库从 SQLite 换成 PostgreSQL(修改 settings.py

  2. 安装 gunicorn:

    pip install gunicorn
    
  3. 测试运行:

    gunicorn mysite.wsgi:application
    
  4. 配置 nginx 反向代理:

    server {
        listen 80;
        server_name example.com;
    
        location / {
            proxy_pass http://127.0.0.1:8000;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
    
  5. 使用 supervisor 管理进程(防止崩溃重启)

    [program:mysite]
    command=/path/to/virtualenv/bin/gunicorn mysite.wsgi:application
    directory=/path/to/project
    user=www-data
    autostart=true
    autorestart=true
    redirect_stderr=true
    stdout_logfile=/var/log/mysite.log
    

部署完成后,网站终于跑起来了。虽然过程繁琐,但这一步非常重要 —— 实战中大多数 Bug 并不是出在代码上,而是部署环节的细节。

效果与收获:一次成功的尝试

项目上线后,整个团队都反馈很好:

  • 开发效率高:两天内完成了用户登录+客户管理+订单模块的核心功能。
  • 架构灵活:既可以当传统网站,又能作为 API 服务端。
  • 便于迭代:模块化结构让后续新功能开发更轻松。
  • 运维成本可控:用成熟的方案部署,稳定性较高。

更重要的是,这次实战让我对 Django 的整体架构有了更深的理解:

  • MVT 模式如何组织代码
  • ORM 如何简化数据库交互
  • Admin 后台如何提升产品验证效率
  • REST Framework 怎么配合前端使用
  • 部署流程怎么一步步来操作

给初学者的几点建议

如果你也正在学习 Django,或者打算做一个自己的小项目,我有几个实用的小建议送给你:

✅ 用好虚拟环境

一开始我就忽略了虚拟环境的重要性,直到因为不同项目的依赖冲突浪费了一下午时间。所以强烈建议你:

  • virtualenvconda 创建独立的开发环境
  • .gitignore 忽略掉 venv/__pycache__/
  • pip freeze > requirements.txt 锁定依赖版本

📦 模块化组织代码

一个项目如果只有一个 app,很快就会变得臃肿。建议按功能分多个 apps,比如:

  • users: 管理登录注册
  • orders: 管理订单数据
  • api: 放所有接口视图

这样不仅结构清晰,后期微服务拆分也更容易。

🛠️ 合理使用中间件和第三方库

比如:

  • django-debug-toolbar:调试神器,查看 SQL 查询次数和耗时
  • django-extensions:提供更多便捷命令,如 shell_plus
  • drf-yasg:自动生成 API 文档,特别适合前后端联调
  • sentry:错误日志收集,线上 bug 一眼看出

🚀 生产部署不要怕麻烦

不要图省事直接 runserver 上线,那是测试专用的。正式上线一定要:

  • 用 Gunicorn 替代 devserver
  • 加上 Nginx 做反向代理
  • 用 Supervisor 或 systemd 做进程管理
  • 配好 HTTPS(Let's Encrypt 很方便)

结语:Django,一个值得投入学习的框架

回望那段快速成长的时光,Django 在其中起到了关键的作用。它不像 Flask 那样“裸奔”,也不像 Java Spring Boot 那样繁重。它介于两者之间,既能让你专注于业务逻辑本身,又有丰富的生态支持。

对于想入门 Web 开发的开发者来说,Django 是一个非常适合的选择。希望这篇文章能带你迈出第一步,并在未来走得更远。

如果你还有问题,欢迎留言讨论,我们一起交流成长。毕竟,谁不是从一个小 demo 开始,一路跌跌撞撞走到现在的呢?

评论 0

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