从抵触AI写代码到真香的转变者:Django入门实战,我用它救了上周五的Deadline
写于2024年6月的一个加班深夜,窗外是上海静安寺写字楼永不熄灭的灯光。
说真的,半年前如果有人跟我说“你以后会靠Django吃饭”,我大概会翻个白眼,顺手切回Vim继续写我的Go微服务。毕竟作为一个骨灰级Vim党,我对“框架”这玩意儿向来有点PTSD——太重、太黑盒、配置像迷宫,还动不动就“约定优于配置”,搞得我连文件放哪儿都得查文档。
更别说公司里那帮后端老哥天天吹Go多快多省资源,动不动就说“Python?那是脚本语言吧”。我也一度信了,直到上周五晚上9点半,产品经理小王在钉钉群里@我:“这个活动页明天上线,后端接口能搞定吗?前端都ready了。”
我看了眼需求:用户登录、表单提交、数据存库、简单管理后台——典型的MVP(Minimum Viable Product)小项目。按我以前的路子,肯定上Go + Gin + 自己搓ORM,再配个Redis缓存,部署到K8s……但问题是,明天上线。
那一刻,我盯着终端里闪烁的光标,突然想起隔壁组那个整天笑嘻嘻的Python后端老李。他上周刚用Django三天搞定了一个内部审批系统,还顺手加了权限控制和Excel导出。
“要不……试试Django?”我心里嘀咕着,一边默默打开了官方文档。
为什么是Django?不是Flask,也不是Go?
先别急着喷。我知道很多人一提Python Web框架就想到Flask,觉得轻量、自由、适合小项目。但这次不一样——时间紧、任务杂、还要有管理后台。
Flask确实灵活,但灵活也意味着你要自己拼装轮子:用户认证?自己集成。Admin界面?自己写。CSRF防护?自己配。而Django呢?开箱即用,连“超级用户创建”这种细节都给你封装好了。
至于Go?别误会,我依然爱它。Go的并发模型、编译速度、内存占用,在高并发API场景下无可替代。我们公司的核心交易系统就是Go写的,稳如老狗。但这次的需求压根不需要扛百万QPS,它要的是快速交付、功能完整、维护方便。
用运维老张的话说:“你们这些开发啊,总想着用屠龙刀切菜。Django就是把瑞士军刀,虽然不如Go锋利,但开瓶器、剪刀、小锯子全都有,关键时刻能救命。”
于是,我决定赌一把——用Django搭这个活动页后端。
环境搭建:别让第一步就劝退你
首先,别在全局Python环境里瞎搞!我吃过亏,上次不小心升级了requests版本,直接导致线上监控脚本报错,被值班电话call醒三次。
所以,第一步:虚拟环境走起。
# 我习惯用venv,轻量又原生
python3 -m venv django_env
source django_env/bin/activate # Linux/Mac
# Windows用 django_env\Scripts\activate
# 升级pip,避免奇怪的依赖冲突
pip install --upgrade pip
# 安装Django,最新稳定版就行
pip install Django
确认安装成功:
django-admin --version
# 输出比如 5.0.6,说明OK
然后创建项目:
django-admin startproject activity_site
cd activity_site
这时候目录结构大概是这样:
activity_site/
├── manage.py
└── activity_site/
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py
别慌,manage.py是你的瑞士军刀,后面所有操作基本靠它。
第一个App:别被“App”这个词吓到
Django里的“App”不是指手机App,而是功能模块。比如用户系统是一个App,文章系统是另一个App。我们的活动页很简单,就叫它entries吧。
python manage.py startapp entries
然后在activity_site/settings.py里注册它:
# settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'entries', # ← 加上这一行
]
模型设计:数据库不用SQL也能写
我之前写Go,都是先画ER图,再手写建表语句。Django反过来了——你先定义Python类,它帮你生成SQL。
比如活动页要收集用户姓名、手机号、留言:
# entries/models.py
from django.db import models
class Entry(models.Model):
name = models.CharField(max_length=100, verbose_name="姓名")
phone = models.CharField(max_length=20, verbose_name="手机号")
message = models.TextField(verbose_name="留言", blank=True)
created_at = models.DateTimeField(auto_now_add=True, verbose_name="提交时间")
class Meta:
verbose_name = "活动报名"
verbose_name_plural = "活动报名"
def __str__(self):
return f"{self.name} - {self.phone}"
是不是比写CREATE TABLE清爽多了?而且verbose_name还能自动生成中文字段名,给后面Admin界面用。
接着,生成迁移文件并应用:
python manage.py makemigrations
python manage.py migrate
这两条命令相当于:
makemigrations:根据模型变化生成SQL变更脚本(存在migrations/目录)migrate:执行这些脚本,更新数据库
默认用的是SQLite,开发够用了。生产环境当然要换PostgreSQL或MySQL,后面再说。
后台管理:Django最香的功能之一
现在,创建一个超级用户:
python manage.py createsuperuser
按提示输用户名、邮箱、密码(密码输入时不会显示,别以为卡了)。
然后启动开发服务器:
python manage.py runserver
访问 http://127.0.0.1:8000/admin,用刚才的账号登录——恭喜!你有了一个功能完整的后台管理系统,增删改查全都有,连日期选择器都带上了。
想让它显示中文?在settings.py里改两行:
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
刷新,界面立马变中文。这体验,比我用Go+Vue手搓后台快了至少两天。
前端对接:写个API让前端调
前端同事早就等不及了。他们需要一个POST接口接收表单数据。
先在entries/views.py里写视图:
# entries/views.py
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from django.utils.decorators import method_decorator
from django.views import View
import json
from .models import Entry
@method_decorator(csrf_exempt, name='dispatch')
class SubmitEntryView(View):
def post(self, request):
try:
data = json.loads(request.body)
name = data.get('name')
phone = data.get('phone')
message = data.get('message', '')
if not name or not phone:
return JsonResponse({'error': '姓名和手机号必填'}, status=400)
# 简单校验手机号(实际项目建议用正则)
if len(phone) < 11:
return JsonResponse({'error': '手机号格式错误'}, status=400)
entry = Entry.objects.create(
name=name,
phone=phone,
message=message
)
return JsonResponse({'id': entry.id, 'msg': '提交成功'})
except Exception as e:
return JsonResponse({'error': str(e)}, status=500)
然后在entries/urls.py(需要新建)里配路由:
# entries/urls.py
from django.urls import path
from .views import SubmitEntryView
urlpatterns = [
path('submit/', SubmitEntryView.as_view(), name='submit_entry'),
]
再在主urls.py里包含它:
# activity_site/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include('entries.urls')),
]
现在前端只要往 /api/submit/ 发POST请求,就能存数据了。
测试一下(用curl):
curl -X POST http://127.0.0.1:8000/api/submit/ \
-H "Content-Type: application/json" \
-d '{"name":"张三","phone":"13800138000","message":"Django真香"}'
返回:
{"id": 1, "msg": "提交成功"}
完美!
生产环境:别把SQLite带上线!
开发爽了,但上线不能马虎。上周运维老张就吐槽:“又是SQLite?上次有个实习生把SQLite当MySQL用,结果多人同时写入直接锁表,活动页挂了半小时。”
所以,生产环境必须换数据库。我选了PostgreSQL,稳定、支持JSON、跟Django兼容好。
在settings.py里加个判断:
# settings.py
import os
if os.getenv('DJANGO_ENV') == 'production':
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': os.getenv('DB_NAME'),
'USER': os.getenv('DB_USER'),
'PASSWORD': os.getenv('DB_PASSWORD'),
'HOST': os.getenv('DB_HOST'),
'PORT': os.getenv('DB_PORT', '5432'),
}
}
else:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
部署时设置环境变量就行。
另外,静态文件也得处理。开发时Django自动serve static files,但生产要用Nginx代理。
# nginx.conf 片段
location /static/ {
alias /path/to/your/project/staticfiles/;
}
记得先收集静态文件:
python manage.py collectstatic --noinput
Go vs Django:不是对立,而是互补
写到这里,可能有Go粉要跳脚了:“你这是背叛!”
其实不是。我在公司里,核心API用Go,内部工具和快速原型用Django。就像厨房里既有菜刀也有水果刀,看切什么。
| 场景 | 推荐技术 | 理由 |
|---|---|---|
| 高并发API、微服务 | Go | 性能强、内存低、编译快 |
| 内部系统、MVP、带Admin的需求 | Django | 开发快、生态全、少造轮子 |
| 数据分析、脚本任务 | Python (非Web) | 库丰富,Pandas/Numpy无敌 |
上周五那个活动页,用Django三天搞定,包括测试和上线。如果用Go,光是搭基础框架就得一天,还不算Admin界面。
最后一点真心话
说实话,以前我觉得用框架是“偷懒”,高手应该从零造轮子。但经历过几次Deadline追杀、线上事故之后,我明白了:工程的本质是交付价值,不是炫技。
Django让我在有限时间内,交出了一个稳定、可维护、带后台的产品。产品经理笑了,前端没骂我,运维也没半夜打电话。
而且,你知道吗?当我用Django快速验证了业务逻辑后,反而更有底气去用Go重构核心模块——因为我知道需求是真实的,不是拍脑袋的。
所以,别抵触工具。Vim党也可以用Django,Go粉也能写Python。技术没有高低,只有合不合适。
对了,现在我已经开始用Copilot写Django模板了——曾经最抵触AI的我,如今每天对着终端喊:“Hey GitHub,帮我生成个表单验证逻辑”。
真香。
附:常用命令速查表
| 功能 | 命令 |
|---|---|
| 创建项目 | django-admin startproject xxx |
| 创建App | python manage.py startapp xxx |
| 生成迁移 | python manage.py makemigrations |
| 执行迁移 | python manage.py migrate |
| 创建超级用户 | python manage.py createsuperuser |
| 启动开发服务器 | python manage.py runserver |
| 收集静态文件 | python manage.py collectstatic |
| 进入Shell调试 | python manage.py shell |
写于上海出租屋,凌晨1:23,咖啡已凉,但心很热。

评论 0