Django入门教程:搭建你的第一个Python网站

代码里的小宇宙
2025-06-17 16:46
阅读 308

从零到上线:我的第一个 Django 网站实战记录

从零到上线:我的第一个 Django 网站实战记录


引言:为什么要写这篇教程?

去年我刚从 Java 转型 Python,公司接了个小型项目,需要快速搭建一个内部管理系统。客户要求功能不复杂但要快,考虑到我之前对 Django 有点了解,决定尝试用它来开发。

这是我第一次真正使用 Django 完整地构建一个网站,过程中遇到了不少坑,也积累了不少经验。今天我想以一个“老程序员”的视角,和大家分享这段真实的经历,讲讲我是怎么一步步把一个空目录变成可以上线的网站的。

这篇文章会从实际项目背景出发,带你一步步搭建你的第一个 Django 网站,同时穿插我在开发中踩过的坑和解决方案。如果你是刚入门 Django 的开发者,或者想系统性学习 Web 开发的朋友,相信你一定能在这篇文章里找到一些共鸣。


项目背景:一个简单的员工管理系统

项目目标很明确:我们要为一家小型企业搭建一个内部使用的员工信息管理系统。需求如下:

  • 员工信息管理(增删改查)
  • 支持部门分类
  • 搜索、分页展示
  • 后台管理员可以登录管理内容
  • 对外提供接口供移动端调用

当时团队只有我和一名前端实习生,时间两周。我们决定采用前后端分离的架构,后端使用 Django + DRF(Django REST Framework)搭建 API,前端用 Vue.js 实现界面渲染。

接下来我就结合这个项目的开发过程,带大家走一遍 Django 的入门流程,并分享真实场景中的实践经验。


第一步:初始化 Django 项目

安装与环境搭建

我习惯用虚拟环境隔离依赖,所以第一步就是创建 Python 虚拟环境:

python3 -m venv venv
source venv/bin/activate
pip install django djangorestframework

然后用 startproject 初始化项目结构:

django-admin startproject employee_system .

这时会生成如下的项目结构:

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

数据库配置

打开 settings.py 文件,修改数据库配置。默认是 SQLite,但对于生产级应用来说不太合适。我们最终选用了 PostgreSQL:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'employee_db',
        'USER': 'admin',
        'PASSWORD': 'yourpassword',
        'HOST': 'localhost',
        'PORT': '5432',
    }
}

小贴士:在开发阶段也可以先用 SQLite,等部署时再切换。不过尽早适应生产数据库有助于提前发现问题。


第二步:设计数据模型与创建 App

我们在项目下创建了一个新的 app 叫 employees

python manage.py startapp employees

然后把这个 app 添加进 INSTALLED_APPS 中:

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

接着,在 employees/models.py 中定义模型:

from django.db import models

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

class Employee(models.Model):
    GENDER_CHOICES = (
        ('male', '男'),
        ('female', '女'),
    )
    
    name = models.CharField(max_length=100)
    gender = models.CharField(max_length=10, choices=GENDER_CHOICES)
    age = models.IntegerField()
    department = models.ForeignKey(Department, on_delete=models.CASCADE)
    email = models.EmailField(null=True, blank=True)
    phone = models.CharField(max_length=20, null=True, blank=True)

    def __str__(self):
        return self.name

这里有几个设计上的考虑点:

  1. 关联关系处理:员工与部门是多对一的关系,所以用 ForeignKey
  2. 字段合理性控制:比如性别使用 choices 限制输入范围,年龄用 IntegerField
  3. 空值处理:联系方式这些非必填字段都设置 null=True, blank=True
  4. 字符串友好表示:给每个模型加上 __str__() 方法,方便在后台或调试时阅读。

迁移数据库

python manage.py makemigrations
python manage.py migrate

这一步很重要!很多人会忘记运行迁移导致数据库表没建好,结果卡半天不知道哪错了。建议执行完迁移到数据库手动检查一下是否真的生成了对应的表格。


第三步:编写接口 & 后台管理

创建 Admin 管理界面

Django 自带非常强大的 Admin 系统,我们可以用来快速实现管理员操作页面。

employees/admin.py 中注册模型:

from django.contrib import admin
from .models import Employee, Department

admin.site.register(Employee)
admin.site.register(Department)

然后创建管理员账户:

python manage.py createsuperuser

访问 /admin 页面就能看到图形化管理界面啦!

使用 DRF 构建 API 接口

我们的前端同学要用 Vue.js 来渲染页面,所以得提供 JSON 格式的 API 接口。

首先创建序列化器 employees/serializers.py

from rest_framework import serializers
from .models import Employee, Department

class DepartmentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Department
        fields = '__all__'

class EmployeeSerializer(serializers.ModelSerializer):
    department = DepartmentSerializer(read_only=True)
    department_id = serializers.PrimaryKeyRelatedField(
        queryset=Department.objects.all(),
        source='department'
    )
    
    class Meta:
        model = Employee
        fields = ['id', 'name', 'gender', 'age', 'department', 'department_id', 'email', 'phone']

然后创建视图类和路由:

views.py

from rest_framework.viewsets import ModelViewSet
from .models import Employee
from .serializers import EmployeeSerializer

class EmployeeViewSet(ModelViewSet):
    queryset = Employee.objects.all()
    serializer_class = EmployeeSerializer

urls.py

from django.urls import path, include
from rest_framework.routers import DefaultRouter
from employees.views import EmployeeViewSet

router = DefaultRouter()
router.register(r'employees', EmployeeViewSet)

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

这样就完成了 GET / POST / PUT / DELETE 全套 RESTful 接口。

踩坑经验:刚开始的时候我直接用了 .read() 方法读取整个查询集,结果并发量稍微大一点就卡死了。后来才知道应该用分页器优化,后面我会专门讲这一点。


第四步:部署上线与性能优化

项目做完后,我们要把它部署到阿里云服务器上供内网访问。这一块也是最容易出问题的地方。

部署流程概览

部署步骤大致如下:

  1. 安装 Nginx 做反向代理
  2. 用 Gunicorn 运行 Django 应用
  3. 用 Supervisor 管理进程
  4. 用 Let's Encrypt 配置 HTTPS

部署成功后的结构大概是这样的:

[User] -> [HTTPS] -> [Nginx] -> [Gunicorn] -> [Django App]

性能相关经验分享

1. 分页器的引入

最开始没有加任何限制,Employee.objects.all() 直接返回全部数据。某天测试导出了两千条员工记录,导致整个接口响应非常慢。

后来我们加入了分页支持:

from rest_framework.pagination import PageNumberPagination

class StandardResultsSetPagination(PageNumberPagination):
    page_size = 20
    page_size_query_param = 'page_size'
    max_page_size = 100

并在 ViewSet 中指定:

class EmployeeViewSet(ModelViewSet):
    pagination_class = StandardResultsSetPagination

这样前端就可以灵活控制每页显示多少条数据,大大提高了性能。

2. 缓存策略

有些部门信息几乎不会变,我们对这类只读数据做了一个 Redis 缓存策略:

from django.core.cache import cache
from .models import Department

def get_departments(request):
    departments = cache.get('departments')
    if not departments:
        departments = list(Department.objects.all().values())
        cache.set('departments', departments, timeout=60 * 60)  # 缓存一小时
    return Response(departments)
3. 查询优化

避免 N+1 查询是一个常见的 ORM 性能问题。比如当我们遍历所有员工并访问其所属部门时,如果不用预加载,就会发起很多次额外查询。

正确方式是在查询时使用 select_related

Employee.objects.select_related('department').all()

这条语句会在一次 SQL 查询中完成关联,效率高了很多。


踩过的大坑 & 解决办法总结

问题 表现 原因 解决方案
接口响应慢 打开页面加载时间很长 查询未做分页、大量数据一次性返回 加入分页器,前端分页渲染
线上报错 500 本地没问题,线上出错 生产环境未启用 DEBUG,且静态资源路径配置不对 修改 settings.py 中 STATIC_ROOT 并运行 collectstatic
登录后台失败 输入正确账号密码也提示错误 数据库未同步 执行 python manage.py migrate && createsuperuser
字段更新无效 提交后字段值没变化 Serializer 没有 properly 设置 source 或 read_only 检查字段映射,适当使用 update() 方法自定义逻辑

最终效果与收益评估

项目按时上线,整体运行稳定。前端同学对接 API 也很顺利。管理员通过后台管理界面每天维护员工信息,系统响应良好,高峰期也没有出现明显延迟。

技术收益总结

  • Django 的开发效率很高:特别是自带的 Admin 和 ORM 系统节省了大量重复工作。
  • DRF 是个宝藏:RESTful 接口写起来非常简单,扩展性强。
  • 性能优化必须提前规划:分页、缓存、连接池这些措施越早加入越好。
  • 部署不能马虎:尤其是静态资源管理和权限控制,容易引发安全问题。

给新手的一些建议

  1. 不要一开始就把注意力放在框架细节上,先理解 MVC 的基本结构。
  2. 学会看官方文档,Django 文档虽然啰嗦但非常权威,遇到问题优先查阅。
  3. 保持代码整洁,特别是模型和视图解耦要做好,否则后期维护很痛苦。
  4. 多动手实践,网上教程可以跟着敲一遍,更重要的是自己独立做一个完整的项目。
  5. 重视日志和监控,哪怕是小型项目也要养成记录错误日志的习惯。

写在最后:成长比速度更重要

回想当初接手这个项目的时候,我对 Django 的认识还停留在“听说挺厉害”的阶段。现在再回头看,Django 不仅帮助我快速实现了客户需求,也在不断教会我如何更好地组织代码结构、设计数据库、提升性能。

技术这条路没有捷径,只有不断地练、不断地犯错、不断地总结才会进步。希望你能从我的这段经历中学到一些东西,少走些弯路。

如果你正在学习 Django 或者正准备迈出第一步,别犹豫,去动手做一个属于自己的项目吧。哪怕只是一个简陋的小网站,那也会是你走向专业的第一步。

祝你好运!

评论 0

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