Django入门教程:搭建你的第一个Python网站
上周五晚上十点半,我坐在公司空荡荡的工位上,盯着屏幕上 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