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

技术拾荒者
2025-12-12 19:48
阅读 798

上周五晚上十点半,我坐在公司空荡荡的工位上,盯着屏幕上 kubectl get pods 返回的一堆 CrashLoopBackOff,心里直犯嘀咕:我是不是该换条路走了?

我在成都一家中型互联网公司做后端,日常和 K8s、Helm、Prometheus 打交道,团队氛围不错,节奏也舒服——毕竟“巴适”是刻在成都人 DNA 里的。但最近跳槽的想法越来越强烈。不是因为加班(虽然上周上线新功能时产品经理凌晨三点还在群里@我),而是我发现自己的技术栈太“云原生”了,连个像样的 Web 应用都没亲手搭过。面试官问:“你用过 Django 吗?” 我只能尴尬一笑:“我们全栈 Go + SpringBoot……”

于是,为了给简历加点“Python 味儿”,也为了验证自己是不是真的只会 kubectl apply -f,我决定从零开始搞个 Django 项目。目标很简单:搭一个能跑起来的博客系统,哪怕只有首页和 About 页面。


为什么是 Django?

别笑,我知道现在主流后端要么 Go 起手,要么 SpringBoot 打天下。我们公司新项目清一色用 Go 写微服务,Java 老哥们则死守 SpringBoot 阵地。而 Python?除了写脚本和数据分析,似乎只存在于“历史遗留系统”里。

但翻完《Two Scoops of Django》这本书(对,就是那本被老鸟们吹上天的 Django 圣经),我才发现:Django 的“开箱即用”是真的香。自带 admin、ORM、认证、中间件……不用像 Go 那样从 net/http 开始造轮子,也不用像 SpringBoot 那样配置一堆 application.yml 和注解。对于想快速验证想法的小项目,Django 简直是懒人福音。

顺便吐槽一句:Go 虽然快,但写个 CRUD 接口要定义 struct、写 handler、配路由、连数据库……一套下来半小时没了。SpringBoot 更别提,光是 Maven 依赖冲突就能让你怀疑人生。


动手:5 分钟跑起你的第一个 Django 站点

先别急着设计数据库,先让“Hello World”跑起来。这一步特别重要——很多新人卡在环境配置就放弃了。

# 创建虚拟环境(别污染全局!)
python3 -m venv mysite-env
source mysite-env/bin/activate

# 安装 Django(我用的是 4.2.x)
pip install django

# 创建项目
django-admin startproject mysite
cd mysite

# 启动开发服务器
python manage.py runserver

打开浏览器访问 http://127.0.0.1:8000,看到那个火箭图标没?恭喜,你已经打败了 50% 的初学者(另一半还在纠结 pip 换源)。


加个页面:从“能跑”到“能看”

默认页面太素了,我们加个真正的首页。Django 的 MTV 模式(Model-Template-View)其实和 MVC 差不多,只是把 Controller 叫成 View,容易让人懵。

先写个 View:

# mysite/views.py
from django.http import HttpResponse

def home(request):
    return HttpResponse("<h1>欢迎来到我的博客!</h1><p>正在从云原生叛逃中...</p>")

再配路由:

# mysite/urls.py
from django.urls import path
from . import views

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

刷新页面,搞定!虽然丑得像 2003 年的网页,但至少是我写的。


引入模板:告别 inline HTML

硬编码 HTML 显然不专业。Django 的模板系统支持继承、过滤器、标签,比 Jinja2 还顺手。

创建模板目录:

mkdir -p mysite/templates

配置 settings.py

# mysite/settings.py
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / 'templates'],  # 关键!指定模板路径
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

然后写模板:

<!-- templates/base.html -->
<!DOCTYPE html>
<html>
<head>
    <title>{% block title %}My Site{% endblock %}</title>
</head>
<body>
    {% block content %}{% endblock %}
</body>
</html>
<!-- templates/home.html -->
{% extends "base.html" %}

{% block title %}Home - My Blog{% endblock %}

{% block content %}
<h1>欢迎来到我的博客!</h1>
<p>坐标成都,K8s 老兵,正在学习 Django。</p>
<p>之前项目用 Go 和 SpringBoot,现在想试试 Python 的温柔。</p>
{% endblock %}

更新 View:

from django.shortcuts import render

def home(request):
    return render(request, 'home.html')

刷新,页面立刻有了“框架感”。这时候我才意识到:Django 的模板继承机制,其实比 Vue/React 的组件化更早实现了“复用”。


数据库与模型:别怕 SQL

虽然我们公司现在都用 TiDB 或 MongoDB,但 Django 默认用 SQLite(开发阶段足够了)。要持久化数据,得定义 Model。

假设我们要存博客文章:

# mysite/models.py
from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title

然后生成并应用迁移:

python manage.py makemigrations
python manage.py migrate

这时候数据库里就有 mysite_post 表了。Django 的 ORM 自动处理了字段类型映射、外键、索引等,比手写 SQL 安全多了——尤其对我这种经常把 VARCHAR(255) 写成 TEXT 的人。

有一次线上事故就是因为 Go 项目里手动拼 SQL,忘了转义用户输入,差点被注入。Django 的 ORM 默认防注入,安全感拉满。


Admin 后台:白捡的管理界面

最让我震惊的是 Django Admin。只需两行代码,就能得到一个功能完整的后台:

# mysite/admin.py
from django.contrib import admin
from .models import Post

admin.site.register(Post)

再创建超级用户:

python manage.py createsuperuser

访问 /admin,登录后就能增删改查 Post 了!这要是用 Go 写,得搭个前端 + REST API + 权限控制,至少两天工作量。而 Django?5 分钟。


性能与部署:别只在 localhost 炫技

当然,开发服务器不能上生产。Django 推荐用 Gunicorn + Nginx 部署,或者直接打包进 Docker。

我试了下用 Dockerfile 构建:

FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "mysite.wsgi:application"]

然后丢到 K8s 上跑(职业病犯了):

apiVersion: apps/v1
kind: Deployment
metadata:
  name: django-blog
spec:
  replicas: 2
  template:
    spec:
      containers:
      - name: app
        image: my-django-blog:latest
        ports:
        - containerPort: 8000

虽然有点“杀鸡用牛刀”,但看着 Pod 正常 Running,莫名有种“我终于不只是运维工具人”的成就感。


总结:值不值得学?

说实话,Django 不会取代 Go 或 SpringBoot 在企业级架构中的地位。高并发、低延迟场景还是 Go 更合适,复杂业务逻辑还是 SpringBoot 更稳。

但如果你:

  • 想快速验证产品 idea
  • 需要一个内部管理后台
  • 或者像我一样,想拓宽技术视野为跳槽做准备

Django 绝对值得花几天时间上手。它教会我的不是“怎么写 Web 框架”,而是 “如何用最少的代码解决最多的问题” —— 这种工程哲学,在任何语言里都通用。

至于跳槽?我现在简历上多了“Django 项目经验”,面试时也能聊点 Python 生态。就算最后没走,至少周末能给自己搭个博客,记录下从 K8s 舰长到全栈萌新的心路历程。

对了,刚收到 HR 消息,说下周有个新项目要用 Python 做数据服务…… 啧,看来这波自学没白搞。

评论 0

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