Django入门教程:搭建你的第一个Python网站
嗨,我是阿哲。一个刚入职新公司两个月、白天敲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.py 的 INSTALLED_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