从零搭建你的第一个Django网站:一个前端出身的AI工具博主的后端初体验

甜美的花朵
2026-01-05 10:04
阅读 756

上周五晚上十点半,我正蹲在公司楼下的全家便利店啃饭团,突然收到产品经理的消息:“能不能先搭个简单的后台原型?下周三演示用。”
我当时差点把饭团捏碎——毕竟,我的主战场是前端,最近还在沉迷Rust的ownership机制,哪有时间搞Python后端?

但转念一想:这不正好是个机会吗?一直听说Django“自带轮子多”、“开箱即用”,不如趁这个需求,亲手搭个真正的网站试试。于是周六一早8点,我泡好咖啡,打开VS Code,正式开启了我的Django初体验。


为什么选Django?一个被Go“诱惑”过的程序员的选择

说实话,最近团队里吹Go的风特别大。隔壁组用Gin框架三天搭了个API服务,性能跑分吊打我们老Python项目。我也一度心动,甚至本地装了Go环境,写了个Hello World。但冷静下来一想:这次要的是快速交付,不是极致性能

Django的优势太明显了:

  • 自带Admin后台(省掉至少两天开发)
  • ORM抽象了数据库操作(我不用再手写SQL防注入)
  • 开发服务器热重载(改完代码不用重启)
  • 社区文档巨全(Stack Overflow上90%的问题都有答案)

更重要的是——它对新手极其友好。作为一个常年和React、Vue打交道的“前端仔”,我需要的是能让我快速看到成果的工具,而不是在配置文件里迷失三天。


环境准备:别让第一步就劝退你

很多人卡在第一步:Python版本、虚拟环境、pip安装…… 我直接上命令(我用的是macOS + pyenv,Windows用户请自行替换):

# 创建项目目录
mkdir my_first_django && cd my_first_django

# 使用pyenv(可选)确保Python 3.10+
pyenv local 3.11.5

# 创建虚拟环境(强烈推荐!)
python -m venv venv
source venv/bin/activate  # Windows: venv\Scripts\activate

# 安装Django(当前最新稳定版4.2)
pip install django

📌 实战经验提醒:千万别全局装Django!我去年就因为全局装包导致两个项目依赖冲突,凌晨三点还在修环境,差点被运维拉黑。

验证安装成功:

django-admin --version
# 输出类似:4.2.7

第一行代码:比“Hello World”更有成就感

Django的哲学是“约定优于配置”,所以它提供了一套标准项目结构。我们用命令生成骨架:

django-admin startproject mysite .

注意那个 . —— 很多人漏掉它,结果项目嵌套两层目录,后期部署时哭都来不及。

接着启动开发服务器:

python manage.py runserver

浏览器打开 http://127.0.0.1:8000,看到那只可爱的火箭图标了吗?恭喜,你的第一个Django站点跑起来了!


添加一个“博客”功能:从前端视角理解MVT

作为前端,我习惯把页面拆解成组件。而Django用的是 MVT 模式(Model-View-Template),其实和MVC很像:

  • Model:数据结构(对应数据库表)
  • View:业务逻辑(处理请求、返回响应)
  • Template:前端模板(HTML + Django模板语法)

1. 创建App

Django项目由多个App组成。我们创建一个叫 blog 的App:

python manage.py startapp blog

然后在 mysite/settings.pyINSTALLED_APPS 里注册它:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    # ... 其他默认项
    'blog',  # ← 加这一行
]

2. 定义Model(数据表)

blog/models.py 中定义文章模型:

from django.db import models
from django.contrib.auth.models import User

class Post(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title

这里有个坑:外键关联User时,on_delete=models.CASCADE 很重要。意思是如果用户被删,他的文章也一起删——否则数据库会报错。

3. 生成并执行数据库迁移

Django用迁移文件管理数据库变更:

python manage.py makemigrations
python manage.py migrate

这两条命令会自动在SQLite(默认数据库)中创建表。生产环境建议换PostgreSQL,但入门用SQLite完全够用。

4. 注册到Admin后台(超爽的功能!)

blog/admin.py 中:

from django.contrib import admin
from .models import Post

admin.site.register(Post)

然后创建超级用户:

python manage.py createsuperuser

按提示输入用户名、邮箱、密码。之后访问 http://127.0.0.1:8000/admin,用刚创建的账号登录——天呐!一个完整的后台管理系统自动生成了! 我可以在这里增删改文章,连富文本编辑器都不用写。

💡 真实感吐槽:当年我在某创业公司,光是写这种CRUD后台就花了两周。现在Django五分钟搞定,真香!


写个前端页面:Django模板 vs 现代前端框架

我知道你在想:“这模板语法是不是太原始了?”

确实,Django模板没有React那么灵活,但对于简单页面完全够用。比如展示文章列表:

创建 blog/templates/blog/post_list.html

<!DOCTYPE html>
<html>
<head>
    <title>我的博客</title>
    <style>
        body { font-family: Arial, sans-serif; margin: 40px; }
        .post { margin-bottom: 20px; padding: 15px; border-left: 4px solid #007bff; }
    </style>
</head>
<body>
    <h1>所有文章</h1>
    {% for post in posts %}
        <div class="post">
            <h2>{{ post.title }}</h2>
            <p><small>作者: {{ post.author.username }} | {{ post.created_at|date:"Y-m-d H:i" }}</small></p>
            <p>{{ post.content|truncatewords:30 }}</p>
        </div>
    {% empty %}
        <p>暂无文章。</p>
    {% endfor %}
</body>
</html>

然后在 blog/views.py 中写视图函数:

from django.shortcuts import render
from .models import Post

def post_list(request):
    posts = Post.objects.all().order_by('-created_at')
    return render(request, 'blog/post_list.html', {'posts': posts})

最后配置URL路由(blog/urls.py + mysite/urls.py),页面就能访问了。

🤔 前端视角思考:如果你要做复杂交互(比如实时评论、拖拽排序),建议Django只做API后端,前端用Vue/React单独开发。但如果是内容展示型网站(如博客、企业官网),Django模板+少量JS完全够用,还能省掉跨域、部署等问题。


性能与部署:别只顾着本地跑得欢

很多新手教程到这就结束了,但真正的挑战在上线

数据库优化小贴士

  • 给经常查询的字段加索引(比如 title
  • 避免N+1查询:用 select_related()prefetch_related()
  • 示例:获取文章及其作者信息时
# 坏:每次循环都查一次User表
posts = Post.objects.all()

# 好:一次JOIN搞定
posts = Post.objects.select_related('author').all()

部署到生产环境

我用的是 Gunicorn + Nginx + PostgreSQL 组合(上海租房党表示云服务器月付100块真的香):

组件 作用
Gunicorn Python WSGI HTTP服务器
Nginx 反向代理 + 静态文件服务
PostgreSQL 生产级数据库

关键配置片段(gunicorn.conf.py):

bind = "0.0.0.0:8000"
workers = 4  # CPU核心数 * 2 + 1
timeout = 120

⚠️ 血泪教训:千万别在生产环境用Django自带的runserver!它单线程、无安全加固,扛不住真实流量。


回到“代码人生”:为什么我要学Django?

写这篇文章的时候,窗外是上海阴沉的梅雨天。我租的房子离公司步行10分钟,桌上还放着没喝完的瑞幸。最近研究Rust让我对系统编程着迷,但现实是——大多数业务需求,根本不需要造轮子

Django教会我的不是某个框架的用法,而是如何用最小成本解决实际问题。当产品经理说“周三要演示”,我能花一个周末交付可用原型;当朋友想做个个人博客,我可以半小时帮他搭好。

这大概就是“代码人生”的真相:技术没有高低贵贱,只有适不适合。Go固然快,Rust固然安全,但Django能让我今晚准时下班——这才是打工人最珍贵的奢侈品。


最后的小建议

如果你是前端想学后端:

  • 别一上来就纠结“Flask vs FastAPI vs Django”
  • 先用Django跑通一个完整流程(模型→视图→模板→部署)
  • 再横向对比其他框架,你会有更深体会

如果你是纯新手:

  • 别怕看英文文档(Django官方文档是业界标杆)
  • 遇到报错先复制错误信息搜Stack Overflow
  • 记住:每个大神都曾被“ModuleNotFoundError”折磨过

现在,去创建你的第一个Django项目吧。说不定下周,你也能在全家便利店一边啃饭团,一边淡定回复产品经理:“后台搞定了,地址发你了。”

评论 0

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