从抵触AI写代码到真香的转变者:Django入门实战,我用它救了上周五的Deadline

Prometheus小骑士
2025-12-15 19:29
阅读 275

写于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

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