搭个Django网站,比写周报还快
上周五晚上十点,我正窝在出租屋里啃着冷掉的外卖,突然收到外包甲方的消息:“能不能下周二前给我们搭个后台管理页面?就展示下用户数据,能增删改查就行。”
我差点把筷子扔了——这不就是个典型的CRUD需求嘛!但转念一想:正好最近在研究Django,不如拿它练手?毕竟,接外包的人,工具链得灵活,不能只会Node.js和Express。
我是北京一个普通斜杠程序员,白天在一家中型SaaS公司写后端,晚上接点外包单子补贴房租。通勤一小时,地铁上刷文档、午休时调API是常态。最近半年,我重度依赖ChatGPT和Claude辅助开发——不是偷懒,是真的效率高。比如这次,我让Claude帮我生成Django项目结构,省了半小时查官方文档。
为什么选Django?
说实话,我之前主力是用Flask,轻量、自由,但一旦项目复杂起来,就得自己搭轮子:用户认证、Admin后台、ORM迁移……而Django“自带电池”(batteries-included)的设计哲学,简直是为这种“快速交付”场景量身定制的。
尤其这次甲方要的是“后台管理”,Django Admin开箱即用,连前端都不用写。产品经理要是看到这个,估计又要说“技术驱动业务”了(翻白眼)。
从零开始:5分钟跑起一个站点
首先,确保你有Python 3.8+。我本地用的是pyenv管理版本,避免和系统Python打架。
# 创建虚拟环境
python -m venv django-demo
source django-demo/bin/activate # Linux/Mac
# django-demo\Scripts\activate # Windows
# 安装Django
pip install django
# 创建项目
django-admin startproject mysite
cd mysite
# 启动开发服务器
python manage.py runserver
浏览器打开 http://127.0.0.1:8000,看到那熟悉的火箭图标——恭喜,你的第一个Python网站跑起来了!
小贴士:别在生产环境用
runserver!这只是开发服务器,性能差、不安全。上线得用Gunicorn + Nginx,后面会提。
建模:用户数据怎么存?
甲方给的需求很简单:用户有姓名、邮箱、注册时间。但作为后端,我得考虑扩展性。比如,未来可能加手机号、状态字段,甚至关联订单。
于是,我建了一个accounts app:
python manage.py startapp accounts
在 accounts/models.py 里定义模型:
from django.db import models
from django.utils import timezone
class User(models.Model):
name = models.CharField(max_length=100, verbose_name="姓名")
email = models.EmailField(unique=True, verbose_name="邮箱")
created_at = models.DateTimeField(default=timezone.now, verbose_name="注册时间")
is_active = models.BooleanField(default=True, verbose_name="是否激活")
class Meta:
verbose_name = "用户"
verbose_name_plural = "用户"
def __str__(self):
return self.name
注意几点:
EmailField自动校验邮箱格式;unique=True避免重复注册;timezone.now而不是datetime.now(),避免时区问题(Django默认用UTC);verbose_name让Admin后台显示中文,甲方看了会觉得“这人挺专业”。
然后注册app到 settings.py:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
# ... 其他
'accounts', # ← 加这一行
]
接着生成并执行迁移:
python manage.py makemigrations
python manage.py migrate
搞定!数据库表自动创建(默认SQLite,生产环境建议换PostgreSQL)。
Admin后台:不用写一行前端
重头戏来了。Django Admin的强大在于,你几乎不用写UI代码。
在 accounts/admin.py 注册模型:
from django.contrib import admin
from .models import User
@admin.register(User)
class UserAdmin(admin.ModelAdmin):
list_display = ['name', 'email', 'created_at', 'is_active']
list_filter = ['is_active', 'created_at']
search_fields = ['name', 'email']
date_hierarchy = 'created_at'
再创建一个超级用户:
python manage.py createsuperuser
# 按提示输入用户名、邮箱、密码
重启服务,访问 /admin,登录后就能看到漂亮的管理界面!支持搜索、筛选、分页、批量操作——这些功能,如果用Flask手写,至少得两天。
接口设计:预留API扩展
虽然这次甲方只要Admin,但作为有经验的后端,我习惯提前规划API。万一哪天他们说“我们要做小程序对接”呢?
我在 urls.py 里加了个命名空间:
# mysite/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('api/v1/', include('accounts.urls')), # ← 预留API入口
]
然后在 accounts/urls.py:
from django.urls import path
from . import views
urlpatterns = [
# path('users/', views.user_list, name='user_list'),
]
现在虽然没实现view,但路径已经预留。等真要加API,直接用Django REST Framework(DRF)几行代码就能出RESTful接口。
生产部署:别踩我的坑
去年双11前,我帮一个电商客户紧急上线Django后台,结果因为没配静态文件,Admin的CSS全挂了,运维在群里@我:“兄弟,页面裸奔了!” 当时真的想砸电脑。
所以这次,我提前配置好:
- 静态文件收集:设置
STATIC_ROOT,运行collectstatic; - 数据库切换:开发用SQLite,生产务必换PostgreSQL或MySQL;
- 关闭DEBUG:
settings.py里DEBUG = False,否则会泄露敏感信息; - 用Gunicorn:
pip install gunicorn,启动命令:gunicorn mysite.wsgi:application --bind 0.0.0.0:8000; - Nginx反向代理:处理静态文件和SSL。
部署清单我整理成表格,方便以后复用:
| 项目 | 开发环境 | 生产环境 |
|---|---|---|
| 数据库 | SQLite | PostgreSQL |
| DEBUG | True | False |
| 静态文件 | 开发服务器托管 | Nginx托管 + collectstatic |
| 服务器 | runserver | Gunicorn + Nginx |
| SECRET_KEY | 本地写死 | 环境变量注入 |
开发心得:外包党的生存之道
这次用Django搭站,从需求到交付不到8小时。对比我之前用Flask手撸,效率提升至少3倍。关键在于:
- 不要重复造轮子:Django Admin、Auth、ORM都是经过千万项目验证的,稳定可靠;
- 快速验证MVP:甲方往往自己也不清楚要什么,先给个可交互的Demo,比画100页PRD有用;
- 善用AI辅助:我让Claude帮我写Model字段的help_text,省了写文档的时间;
- 留扩展接口:哪怕现在用不上,也要为未来留门。
当然,Django也有缺点:学习曲线比Flask陡,灵活性稍差。但对“快速交付”场景,它绝对是Python后端的最优解之一。
最后,周二早上我把链接发给甲方,对方回了个“👍”。那一刻,我觉得通勤一小时、吃冷外卖都值了——毕竟,副业收入到账的感觉,比年终奖还爽。
如果你也在接外包,或者想快速验证产品想法,不妨试试Django。它可能不会让你成为架构师,但绝对能让你准时下班,甚至……多接一单。

评论 0