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

Web创新
2025-12-18 13:43
阅读 1833

上周五晚上十点半,我刚从公司打完卡出来,北京的晚风带着初秋的凉意。地铁13号线上人不多,耳机里放着播客,脑子里却还在复盘今天下午那个突发故障——一个上游Java服务的线程池满了,把我们前端的接口拖垮了。虽然最后是后端兄弟背的锅,但我心里清楚,如果我自己能多懂点后端逻辑,至少能更快定位问题。

这事让我意识到:作为一个在阿里摸爬滚打好几年、经历过三次双11大促洗礼的P7前端工程师,光会写React和搞性能优化已经不够了。尤其是在我们团队现在大力推行“全栈化”、“前后端协同设计”的背景下,不懂点后端,开会时连产品经理画的架构图都看不懂(别笑,真有这种情况)。

所以,我决定系统性地学一门后端语言和框架。Go?太卷了,隔壁组天天吹“云原生”,搞得我压力山大。Java?虽然我们系统里Java服务遍地开花,但那套Spring Boot + MyBatis的组合拳,配置起来能把人绕晕,而且学习曲线陡峭得像西二旗早高峰的地铁扶梯。

思来想去,我选了 Django —— 一个用 Python 写的 Web 框架。为什么?简单、高效、自带Admin后台,对新手极其友好。更重要的是,Python 的语法简洁到让我这个常年和 JavaScript 打交道的人倍感亲切。上周六,趁着周末,我花了半天时间,搭了个最简单的博客网站。过程虽短,但踩的坑不少,收获也满满。今天就借着这篇“技术分享”,把我的入门经验总结一下,希望能帮到同样想跨界的前端兄弟们。


为啥是 Django?而不是 Flask 或 FastAPI?

先说结论:Django 是“开箱即用”的最佳选择

Flask 虽然轻量灵活,但你需要自己拼装 ORM、认证、Admin 等模块,对新手来说容易迷失在各种第三方库的选择中。FastAPI 性能确实猛,异步支持好,但生态还不够成熟,文档也不如 Django 完善。

而 Django,官方号称 “The web framework for perfectionists with deadlines” —— 这不就是我们互联网人的写照吗?产品明天就要上线,你告诉我数据库还没建?Django 自带的 manage.py 命令行工具和 Admin 后台,能让你在20分钟内搞定一个可运行的原型。

小插曲:上周我们组有个实习生被安排做个内部工具,他一开始用 Go 写,结果三天过去了连用户登录都没调通。我建议他换成 Django,第二天他就跑来跟我说:“哥,这玩意儿也太香了吧!”

下面这张表对比了几个主流 Python Web 框架的关键特性:

特性 Django Flask FastAPI
ORM 内置(强大) 需集成 SQLAlchemy 需集成 SQLAlchemy / Tortoise
Admin 后台 ✅ 自带
用户认证 ✅ 内置 需手动实现 需手动实现
学习曲线 中等 低(但后期复杂) 中高(需理解异步)
适合场景 全功能 Web 应用 微服务 / API 高性能 API

看到没?如果你要做一个完整的网站(哪怕只是内部工具),Django 的“电池已包含”哲学真的能救命。


动手!从零开始搭个博客

第一步:环境准备

首先确保你装了 Python(建议 3.8+)。然后创建虚拟环境(别污染全局环境,这是基本素养):

python -m venv myblog_env
source myblog_env/bin/activate  # Linux/Mac
# myblog_env\Scripts\activate   # Windows
pip install django

吐槽一句:我们运维同学总说“你们开发能不能别乱装包”,其实只要用虚拟环境,根本不会影响系统。但每次上线前他们还是要扫一遍依赖,搞得我像在做代码人生里的“合规考试”。

第二步:创建项目和应用

Django 的“项目(Project)”和“应用(App)”概念要分清。一个项目可以包含多个应用。比如你的电商网站,可能有 userproductorder 等多个 App。

django-admin startproject mysite
cd mysite
python manage.py startapp blog

这时候目录结构大概是这样:

mysite/
├── manage.py
├── mysite/
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── blog/
    ├── migrations/
    ├── models.py
    ├── views.py
    └── ...

第三步:定义模型(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

这里用了 Django 内置的 User 模型做外键,省去了自己写用户系统的麻烦——又是一个“偷懒”的好例子。

然后生成并执行迁移:

python manage.py makemigrations
python manage.py migrate

血泪教训:去年双11前,我们有个同事改了模型字段但忘了 makemigrations,结果线上数据库结构和代码不一致,半夜报警。从那以后,我们 CI 流程里加了一条:检测是否有未提交的 migration 文件。

第四步:注册到 Admin 后台

这是 Django 最爽的功能之一!编辑 blog/admin.py

from django.contrib import admin
from .models import Post

@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
    list_display = ('title', 'author', 'created_at')
    search_fields = ('title', 'content')

再创建超级用户:

python manage.py createsuperuser

启动服务:

python manage.py runserver

访问 http://127.0.0.1:8000/admin,输入刚才创建的账号,你就能看到一个功能完整的后台管理系统!增删改查、搜索、分页,全都有。这要是用 Java 手写,估计得两天


写个前端页面:别怕,Django 模板很友好

虽然我是前端,但在 Django 里写模板居然没那么痛苦。编辑 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/list.html', {'posts': posts})

然后在 blog/ 下创建 templates/blog/list.html

<!DOCTYPE html>
<html>
<head>
    <title>我的博客</title>
</head>
<body>
    <h1>最新文章</h1>
    {% for post in posts %}
        <div>
            <h2>{{ post.title }}</h2>
            <p>作者:{{ post.author.username }} | {{ post.created_at }}</p>
            <p>{{ post.content|truncatewords:30 }}</p>
        </div>
    {% empty %}
        <p>暂无文章。</p>
    {% endfor %}
</body>
</html>

Django 模板语言(DTL)虽然不如 JSX 灵活,但逻辑清晰,安全(自动转义防 XSS),对快速原型足够了。

别忘了配置 URL 路由。在 blog/urls.py(需要新建):

from django.urls import path
from . import views

urlpatterns = [
    path('', views.post_list, name='post_list'),
]

然后在 mysite/urls.py 中 include:

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('blog.urls')),
]

刷新页面,你的博客首页就出来了!


生产环境?别急,先考虑这些

虽然本地跑起来了,但离上线还差得远。作为经历过多次线上事故的老兵,我必须提醒几点:

  1. 不要用 runserver 上生产!它只是开发服务器,性能极差。要用 Gunicorn + Nginx。
  2. 数据库别用 SQLite!开发可以,生产必须上 PostgreSQL 或 MySQL。
  3. 静态文件处理:Django 的 STATICFILES_DIRS 只适合开发。生产环境要用 CDN 或配置 Nginx 托管。
  4. 安全设置:务必关闭 DEBUG=True,设置 ALLOWED_HOSTS,启用 HTTPS。

我们团队现在上新服务,必须通过安全扫描和压测。有一次我忘关 DEBUG,被安全团队邮件通报,社死现场。


为什么前端学后端?不只是为了跳槽

说实话,我学 Django 最初动机确实有点功利——看招聘要求,全栈工程师薪资普遍高 20%。但真正动手后,我发现更大的价值在于 沟通效率的提升

以前和 Java 后端联调,他们说“这个接口返回的是 DTO 对象”,我一脸懵。现在我能看懂他们的 Entity 和 Repository,甚至能提建议:“这个字段要不要加索引?”、“分页参数能不能统一成 pagesize?”

上周和 Go 组对接一个新功能,对方用 Protobuf 定义接口。因为我自己搭过后端,一眼看出他们少传了一个必要字段,避免了一次返工。产品经理当场夸我“技术视野广”——虽然我知道他只是想让我多干活。

代码人生,不只是写代码,更是理解系统如何协作


总结:Django 适合谁?

  • 前端想拓展技能边界:语法友好,上手快,能快速验证想法。
  • 学生或个人开发者:想做个 MVP 项目,Django 能帮你省下 80% 的样板代码。
  • 内部工具开发者:Admin 后台简直是神器,比 Excel 强一百倍。

当然,Django 也不是万能的。如果你要做高并发微服务,Go 或 Java 可能更合适。但如果你的目标是“快速做出一个功能完整的网站”,Django 绝对是 Python 阵营里最稳的选择。

最后送大家一句我在技术分享会上常说的:“工具没有高低贵贱,解决问题才是王道。” 别纠结语言之争,Java、Go、Python,都是我们手中的武器。重要的是,你是否能在 deadline 前,把产品平安送上线。

—— 就像今年双11,不管用什么技术,只要用户能顺利下单,我们就能安心吃庆功宴(虽然大概率还是在公司吃泡面)。

Happy coding!

评论 0

最热最新
暂无评论
Web创新Lv.1
0
影响力
0
文章
0
粉丝