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

GC观察员
2025-12-15 11:53
阅读 463

上周五晚上十一点半,我正窝在沙发上用MacBook Pro敲代码,窗外下着小雨,咖啡已经凉了。突然收到一个老同事的消息:“你不是搞Python的吗?能不能教我搭个Django网站?我们运营部想做个活动页面,但前端说他只会写React,后端又全是Java栈……”

说实话,那一刻我真的想回一句“我也不会”,毕竟作为一个远程独立开发者,我已经连续三个月只和Git、Jira还有凌晨三点的Bug打交道了。不过转念一想——这不就是我当初入坑Django的理由吗?


为什么我又一次选择了Django?

三年前我在一家电商公司打工,那时候团队技术栈清一色Spring Boot + MyBatis,Java写得飞起。但有一次双11大促前,运营小姐姐急得快哭了:“老板说要上线一个抽奖活动,明天就要!可Java后端排期到下个月……” 产品经理在会议室拍桌子:“能不能先搞个临时页面顶一下?” 那时候我才第一次听说 Django —— 一个用 Python 写的 Web 框架,号称“开箱即用”。

结果呢?我花了一晚上搭了个原型,第二天演示完,运维小哥居然没骂我(要知道他平时连少打一个日志都要咆哮)。从那以后,我就彻底爱上了这个“能快速交付又能扛生产”的框架。

现在虽然成了自由开发者,不用再应付产品经理的“明天上线”需求,但每当有朋友问起怎么快速建站,我还是会毫不犹豫地推荐 Django。尤其当你面对的是运营同学那种“今天提需求,明早就要上线”的节奏时——Java 显然太重了,而 Django 正好轻快又稳。


别怕,Django 没你想的那么难

很多新手一听到“Web框架”就慌,觉得肯定要配Nginx、调数据库连接池、处理跨域……其实 Django 的哲学就是 Don’t Repeat Yourself (DRY)Convention over Configuration。它把90%的脏活累活都给你包好了,你只需要专注业务逻辑。

举个栗子🌰:你想做一个“用户留言本”网站(别笑,这可是每个程序员的Hello World进阶版)。用 Java Spring Boot,你可能要:

  • 写 Entity、Repository、Service、Controller
  • 配置 DataSource、JPA、Transaction
  • 处理 JSON 序列化、异常拦截……

而在 Django 里?三步走:

  1. 定义模型(Model)
  2. 写视图(View)
  3. 配路由(URL)

剩下的——数据库迁移、Admin后台、表单验证、CSRF防护……全送你!


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

💡 环境要求:Python ≥ 3.8(别用2.7了,真的,2024年了)

# 创建虚拟环境(强烈建议!别污染全局)
python -m venv mysite_env
source mysite_env/bin/activate  # Linux/Mac
# mysite_env\Scripts\activate   # Windows

# 安装Django
pip install django

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

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

浏览器打开 http://127.0.0.1:8000,看到那个火箭🚀页面了吗?恭喜,你已经跑起了一个完整的 Web 服务!比某些 Java 项目启动时间还快(手动狗头)。


加点料:做个真正的“留言本”

现在我们来加个功能:让用户能提交留言,并在首页显示所有留言。

第一步:创建App(Django里的模块单位)

python manage.py startapp guestbook

然后在 mysite/settings.pyINSTALLED_APPS 里加上 'guestbook'

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

第二步:定义数据模型

编辑 guestbook/models.py

from django.db import models

class Message(models.Model):
    name = models.CharField("姓名", max_length=50)
    content = models.TextField("留言内容")
    created_at = models.DateTimeField("创建时间", auto_now_add=True)

    def __str__(self):
        return f"{self.name}: {self.content[:20]}..."  # 方便Admin里看

📌 这里我特意加了中文 verbose_name,因为运营同学将来可能会用 Admin 后台看数据(他们可看不懂 content 是啥意思)。

第三步:生成数据库迁移并执行

python manage.py makemigrations
python manage.py migrate

这时候 SQLite 数据库(默认)里就有 guestbook_message 表了。别小看 SQLite,我线上有个小工具站跑了两年,日活几百,照样稳如老狗。

第四步:写视图和模板

先写视图 guestbook/views.py

from django.shortcuts import render, redirect
from .models import Message
from .forms import MessageForm  # 等下定义

def index(request):
    if request.method == "POST":
        form = MessageForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect("index")  # 提交后刷新页面
    else:
        form = MessageForm()
    
    messages = Message.objects.all().order_by("-created_at")
    return render(request, "guestbook/index.html", {
        "form": form,
        "messages": messages
    })

再定义表单 guestbook/forms.py(Django 的表单超好用!自动校验+渲染):

from django import forms
from .models import Message

class MessageForm(forms.ModelForm):
    class Meta:
        model = Message
        fields = ["name", "content"]
        widgets = {
            "content": forms.Textarea(attrs={"rows": 4})
        }

模板 guestbook/templates/guestbook/index.html(注意目录层级!):

<!DOCTYPE html>
<html>
<head>
    <title>我的留言本</title>
</head>
<body>
    <h1>欢迎留言!</h1>
    
    <!-- 提交表单 -->
    <form method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">提交</button>
    </form>

    <hr>
    <h2>已有留言:</h2>
    {% for msg in messages %}
        <p><strong>{{ msg.name }}</strong> 说:<br>{{ msg.content }}</p>
        <small>{{ msg.created_at|date:"Y-m-d H:i" }}</small>
        <hr>
    {% empty %}
        <p>还没有留言哦~</p>
    {% endfor %}
</body>
</html>

第五步:配置URL路由

guestbook/urls.py(新建):

from django.urls import path
from . import views

urlpatterns = [
    path("", views.index, name="index"),
]

mysite/urls.py(主路由):

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

urlpatterns = [
    path("admin/", admin.site.urls),
    path("", include("guestbook.urls")),  # ← 挂载子路由
]

启动!顺便看看Django Admin有多香

运行:

python manage.py createsuperuser  # 创建管理员账号
python manage.py runserver

访问 http://127.0.0.1:8000/admin,用刚创建的账号登录——哇!你的 Message 模型自动有了增删改查界面!运营同学可以直接在这里管理留言,根本不用你写额外接口。

这要是用 Java,你得额外搭个 Vue 前端 + REST API + 权限控制……想想就头大。


生产环境?别慌,Django 也能扛

我知道你在想:“这不就是玩具吗?线上能用?” —— 我去年帮一个客户做的内部审批系统,就是 Django + PostgreSQL + Gunicorn + Nginx,日均请求 5w+,CPU 占用不到 30%。

关键配置建议:

组件 开发环境 生产环境
数据库 SQLite PostgreSQL / MySQL
Web 服务器 runserver Gunicorn + Nginx
静态文件 Django 自带 CDN 或 Nginx 托管
DEBUG True False(必须!)
SECRET_KEY 随便写 用环境变量,别硬编码

特别提醒:永远不要在线上开 DEBUG=True!否则你的数据库密码、服务器路径全暴露(别问我怎么知道的,那次事故让我请全组喝了三天奶茶)。


为什么我不用 Java 做这种事?

不是黑 Java,我至今仍觉得 Spring Boot 是企业级应用的王者。但如果你的需求是:

  • 快速验证 MVP
  • 内部工具/运营活动页
  • 小型 SaaS 产品

那 Python + Django 的开发效率真的吊打 Java。一个功能,Java 团队可能要开三次会、写 200 行样板代码,而我一个人在家撸两小时就上线了——还能准时去遛狗。

而且 Django 社区生态丰富:用户认证、REST API(DRF)、任务队列(Celery)、缓存(Redis)……全都有成熟方案。代码可读性也高,几个月后回头看,依然知道自己当初在写什么(对比某些 Java 项目的三层嵌套泛型……)


最后一点真心话

作为远程开发者,我最怕的就是“重复造轮子”和“过度设计”。Django 让我能把精力放在真正重要的事上——比如怎么让运营小姐姐少找我改需求(开玩笑的)。

如果你也厌倦了被复杂架构绑架,想快速做出一个能跑、能用、还能维护的网站,那就试试 Django 吧。它可能不够“酷”,但绝对够“稳”。

对了,文开头那个老同事的活动页,我昨晚帮他搭好了。他发来消息:“牛啊!比我们 Java 后端快多了!” —— 我回了个 😏,然后关掉电脑,去煮泡面了。

毕竟,自由开发者的生活,代码写完就得及时奖励自己,不然容易抑郁(真的,别问我是怎么知道的)。


📌 小贴士:完整代码我放 GitHub 了(搜 django-guestbook-tutorial),记得 star!有问题欢迎 issue,但别半夜 @ 我,我得睡觉(远程工作也要 work-life balance 啊!)

评论 0

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