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

AppAI
2025-12-14 00:21
阅读 796

嗨,我是阿哲。一个刚入职新公司两个月、白天敲Go晚上啃Rust的在职程序员,目前正一边肝项目deadline,一边偷偷备考公务员——没错,就是传说中的“技术岗转行政编”选手。今天这篇Django入门,其实是上周五加班到凌晨两点后突然想写的。为啥?因为产品经理又提了个“简单需求”:搞个内部工具,展示我们区块链节点的实时状态。运维说:“你不是会Python吗?随便搭个Web界面就行。” 我心想:行吧,反正比写周报强。


说实话,我已经很久没碰Django了。上一次用还是在读研的时候,那会儿还在用Sublime Text写代码(别笑,Vim党也有黑历史)。如今主力开发语言是Go,业余时间还被Rust的ownership模型折磨得睡不着觉。但这次需求明确:快、稳、能跑就行。毕竟谁也不想在考公复习间隙,还要调试前端CSS兼容性问题。

于是Django这个“自带全家桶”的框架就成了最优解——它开箱即有Admin后台、ORM、用户认证、静态文件处理……简直是懒人(或者说赶DDL的人)的福音。

为什么选Django?而不是Flask or FastAPI?

先说结论:项目复杂度低 + 需求变动频繁 + 前端不想写太多JS = 选Django

我们这个内部工具的需求很简单:

  • 展示几个区块链节点的IP、区块高度、同步状态
  • 支持手动刷新数据
  • 后台能增删改查节点配置

听起来像CRUD模板?没错!这种场景下,用Flask得自己拼轮子,FastAPI虽然快但得配前端框架(我可不想在Vue和React之间做选择题),而Django直接给你一套完整的MVC架构,连表单验证都帮你写好了。

而且,团队里没人会前端。产品经理说“UI参考Bootstrap就行”,测试同学说“只要能点就行”。在这种“糙快猛”的氛围下,Django Admin + 模板继承 + 少量jQuery,三天就能上线。

环境搭建:从零到Hello World

⚠️ 提醒:以下操作默认你在类Unix环境(Mac/Linux),Windows用户请自备WSL或忍一忍。

首先,新建虚拟环境(别污染全局Python,这是职业素养):

python3 -m venv djangoproject-env
source djangoproject-env/bin/activate

然后安装Django(最新版即可,我用的是5.0.x):

pip install django

创建项目:

django-admin startproject blockchain_monitor
cd blockchain_monitor

运行开发服务器:

python manage.py runserver

浏览器打开 http://127.0.0.1:8000,看到那个火箭图标了吗?恭喜,你已经比90%的“学Python想做网站”的人走得更远了。

设计数据模型:把区块链节点存进数据库

我们的核心资源是“区块链节点”,每个节点有:

  • 名称(比如 eth-mainnet-node-01
  • RPC地址(如 http://192.168.1.100:8545
  • 最新区块号
  • 同步状态(布尔值)
  • 最后更新时间

blockchain_monitor/settings.py 中确认数据库配置(默认是SQLite,够用):

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

然后创建app(Django里叫app,别和移动端混淆):

python manage.py startapp nodes

nodes/models.py 中定义模型:

from django.db import models

class BlockchainNode(models.Model):
    name = models.CharField(max_length=100, unique=True)
    rpc_url = models.URLField()
    latest_block = models.IntegerField(default=0)
    is_synced = models.BooleanField(default=False)
    last_updated = models.DateTimeField(auto_now=True)

    def __str__(self):
        return f"{self.name} (Block: {self.latest_block})"

接着注册app到 settings.pyINSTALLED_APPS

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'nodes',  # ← 加这一行
]

生成并执行迁移:

python manage.py makemigrations
python manage.py migrate

搞定!数据库表自动建好了,连外键约束都不用手写。

快速拥有后台管理界面

Django最爽的功能之一:Admin后台。

先创建超级用户:

python manage.py createsuperuser
# 按提示输入用户名、邮箱、密码

然后在 nodes/admin.py 中注册模型:

from django.contrib import admin
from .models import BlockchainNode

@admin.register(BlockchainNode)
class NodeAdmin(admin.ModelAdmin):
    list_display = ('name', 'rpc_url', 'latest_block', 'is_synced', 'last_updated')
    list_filter = ('is_synced',)
    search_fields = ('name', 'rpc_url')

重启服务,访问 http://127.0.0.1:8000/admin,用刚才的账号登录。你会发现,增删改查、搜索、筛选全都有了!这还没写一行前端代码

🤯 当时我真的惊了——这要是让前端同事知道,怕是要哭着问:“你们后端是不是偷偷用了低代码平台?”

前端页面:用Django模板快速渲染

虽然Admin很好用,但产品经理想要一个“更直观的监控看板”。行吧,那就写个前端页面。

Django用的是自己的模板系统(类似Jinja2),支持继承、过滤器、标签等。

先在项目根目录建 templates 文件夹,并在 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>
    <meta charset="utf-8">
    <title>Blockchain Monitor</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
    <div class="container mt-4">
        {% block content %}{% endblock %}
    </div>
</body>
</html>

再写具体页面 templates/nodes/list.html

{% extends "base.html" %}

{% block content %}
<h1>区块链节点监控</h1>

<table class="table table-striped">
    <thead>
        <tr>
            <th>名称</th>
            <th>RPC地址</th>
            <th>最新区块</th>
            <th>同步状态</th>
            <th>最后更新</th>
        </tr>
    </thead>
    <tbody>
        {% for node in nodes %}
        <tr class="{% if not node.is_synced %}table-danger{% endif %}">
            <td>{{ node.name }}</td>
            <td><code>{{ node.rpc_url }}</code></td>
            <td>{{ node.latest_block }}</td>
            <td>
                {% if node.is_synced %}
                    <span class="badge bg-success">已同步</span>
                {% else %}
                    <span class="badge bg-warning text-dark">同步中</span>
                {% endif %}
            </td>
            <td>{{ node.last_updated|date:"Y-m-d H:i:s" }}</td>
        </tr>
        {% empty %}
        <tr><td colspan="5" class="text-center">暂无节点</td></tr>
        {% endfor %}
    </tbody>
</table>

<a href="/admin/nodes/blockchainnode/add/" class="btn btn-primary">添加节点</a>
{% endblock %}

接着写视图函数,在 nodes/views.py 中:

from django.shortcuts import render
from .models import BlockchainNode

def node_list(request):
    nodes = BlockchainNode.objects.all().order_by('-last_updated')
    return render(request, 'nodes/list.html', {'nodes': nodes})

配置URL路由:

  • blockchain_monitor/urls.py 中引入app路由:
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('nodes.urls')),
]
  • 创建 nodes/urls.py
from django.urls import path
from . import views

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

刷新页面,一个带Bootstrap样式的监控看板就出来了!全程没碰npm、webpack、vite这些前端工程化工具,对只想专注逻辑的后端来说太友好了。

性能与生产部署考虑

虽然这是个内部小项目,但作为有经验的程序员,我还是做了几件事确保它不至于半夜报警:

1. 数据库查询优化

node_list 视图中,如果节点很多,BlockchainNode.objects.all() 可能变慢。好在目前只有不到20个节点,但为了养成好习惯,还是加了 .only() 限制字段:

nodes = BlockchainNode.objects.only(
    'name', 'rpc_url', 'latest_block', 'is_synced', 'last_updated'
).order_by('-last_updated')

2. 静态文件处理

开发时Django自动serve静态文件,但生产环境必须用Nginx。我在部署脚本里加了:

python manage.py collectstatic --noinput

然后Nginx配置指向 STATIC_ROOT 目录。

3. 定时任务更新节点状态

真正的挑战来了:如何定期拉取区块链节点的最新区块?

我写了个management command(Django自定义命令):

# nodes/management/commands/fetch_node_status.py
import requests
from django.core.management.base import BaseCommand
from nodes.models import BlockchainNode

class Command(BaseCommand):
    help = 'Fetch latest block from all nodes'

    def handle(self, *args, **options):
        for node in BlockchainNode.objects.all():
            try:
                resp = requests.post(node.rpc_url, json={
                    "jsonrpc": "2.0",
                    "method": "eth_blockNumber",
                    "params": [],
                    "id": 1
                }, timeout=5)
                if resp.status_code == 200:
                    data = resp.json()
                    if 'result' in data:
                        block_hex = data['result']
                        node.latest_block = int(block_hex, 16)
                        node.is_synced = True
                        node.save()
            except Exception as e:
                node.is_synced = False
                node.save()
                self.stderr.write(f"Error fetching {node.name}: {e}")

然后用crontab每分钟跑一次:

* * * * * cd /path/to/project && source venv/bin/activate && python manage.py fetch_node_status >> /var/log/node_cron.log 2>&1

💡 小技巧:日志重定向很重要!上次因为没打日志,一个节点挂了三天都没人发现,测试同学差点把我名字刻在区块链上。

总结:Django真的适合“考公程序员”吗?

写完这个项目,我反而有点矛盾。

一方面,Django确实快——从零到上线只用了两天,剩下的时间全在调RPC接口的超时参数。它把Web开发中最繁琐的部分(用户、权限、表单、URL路由)都封装好了,特别适合业务逻辑简单、交付压力大的场景。

但另一方面,它的“魔法”太多。比如 makemigrations 自动生成SQL,有时候会出错;模板系统虽然简单,但复杂交互还得靠前端补。如果你追求微服务、高并发、极致性能,可能FastAPI+React才是未来。

不过对我这种白天写Go、晚上刷行测、周末还在看Rust所有权文档的人来说,Django就像一碗热腾腾的泡面——不健康,但能救命。

而且说真的,当看到运维大哥在群里发“监控页面真香”,测试同学不再追着我要Excel报表时,那种成就感,比解决一个Rust生命周期错误还爽。

所以,如果你也处在“想快速做个Web工具”、“不想碰前端工程化”、“项目deadline压顶”的状态——试试Django吧。它可能不是最先进的,但绝对是最稳的“生产力工具”。

最后附上我的学习资源清单(亲测有效):

资源类型 推荐内容 适合人群
官方文档 Django Docs 所有人必看
视频教程 Corey Schafer的Django系列(YouTube) 新手友好
实战项目 Two Scoops of Django 进阶参考
社区 Django Forum / Reddit r/django 遇坑求助

写完这篇,已经是凌晨一点。明天还要改Go项目的gRPC超时配置,后天模考行测。但至少,这个小项目不用再占用我的脑内存了。
—— 一个想上岸的Vim党程序员,于工位咖啡渍旁

评论 0

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