输出 4.2.7(截至2023年10月最新LTS)
Django初体验:双非大二生的首个Python网站实战手记
上周五深夜,我一边啃着老妈寄来的郫县豆瓣酱拌面,一边在MacBook上敲下 django-admin startproject mysite。窗外成都的夜雨淅淅沥沥,屋内终端闪烁着绿色光标——那一刻,我忽然意识到,自己这个双非院校的大二“野生程序员”,终于要亲手搭出人生第一个正经网站了。
别笑,我知道很多人早就用React/Vue+SpringBoot搞微服务了。但对我这种没实习、没大厂内推、连简历都写得干巴巴的普通学生来说,Django 是个温柔又强大的起点。毕竟,它号称“开箱即用”,而我连箱子都没买过几回(穷是原罪)。
为啥选 Django?不香吗?
最近刷牛客网做面试题挑战,发现一个扎心事实:很多后端岗JD写着“熟悉Python/Go/Java任一”,但点进去细看,实际项目里Java(尤其是SpringBoot)占了八成。Go 虽然性能炸裂,但生态对新手不太友好;SpringBoot 又太重,光是 Maven 依赖就能让我这8G内存的Mac卡成PPT。
而 Django?它像一位耐心的老师傅:自带Admin后台、ORM、用户认证、路由系统……你只需要专注业务逻辑。对我这种既要上课又要自学、还得抽空打王者的人来说,省下的时间就是命!
而且说真的,在成都这种节奏舒服的城市,谁不想快点把东西跑起来,然后去玉林路小酒馆喝一杯呢?
环境搭建:Mac真香,Windows背锅
我日常开发全靠 Mac(M1芯片,轻薄本战神),但为了兼容性,还是得在 Windows 上测一测。结果?Django 在 macOS 上丝滑如德芙,在 Windows 上却因为路径分隔符 / vs \ 报了一堆 warning。运维同事看到我提交的代码,直接微信吐槽:“兄弟,你这路径写法,上线怕是要炸。”
所以建议:开发用 Mac/Linux,测试用 Windows 虚拟机。别问我怎么知道的,问就是被 Jenkins 构建失败通知轰炸过三次。
安装过程就一行:
pip install django
验证一下:
python -m django --version
搞定!比配置 SpringBoot 的 application.yml 简单多了(别提我上次配错 profile 导致测试环境连了生产数据库的黑历史)……
创建第一个项目:从“Hello World”到“能跑就行”
运行:
django-admin startproject blog
cd blog
python manage.py runserver
浏览器打开 http://127.0.0.1:8000,熟悉的火箭图标出现——成了!虽然只是个默认页面,但那一刻我真的想截图发朋友圈(最后忍住了,怕被室友笑)。
接下来,我要做个极简博客。先创建 App:
python manage.py startapp posts
Django 的“项目-App”结构一开始让我懵圈。后来理解了:项目是容器,App 是功能模块。比如 posts 负责文章,accounts 负责用户,comments 负责评论。这种拆分思路,其实和 SpringBoot 的模块化很像,只是 Django 更“约定大于配置”。
模型设计:别让数据库成为你的绊脚石
我在 posts/models.py 里写下第一个模型:
from django.db import models
from django.contrib.auth.models import User
class Post(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
author = models.ForeignKey(User, on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
注意几个细节:
on_delete=models.CASCADE:作者删号,文章跟着消失(产品经理说这是“数据一致性”,我说这是“删库跑路预备动作”)auto_now_add=True:自动记录创建时间,省得手动塞 datetime.now()
然后执行迁移:
python manage.py makemigrations
python manage.py migrate
这里踩了个坑:第一次忘记注册 App 到 settings.py 的 INSTALLED_APPS,结果 migrate 根本找不到我的模型。报错信息还特别隐晦:“No changes detected”。当时真的想砸键盘——直到我翻了 Stack Overflow 第三页才找到答案。
视图与模板:告别 console.log 调试法
Django 支持函数视图(FBV)和类视图(CBV)。作为新手,我先用 FBV 写了个列表页:
# posts/views.py
from django.shortcuts import render
from .models import Post
def post_list(request):
posts = Post.objects.all().order_by('-created_at')
return render(request, 'posts/list.html', {'posts': posts})
模板放在 posts/templates/posts/list.html:
<!-- 简洁、可读、有注释 -->
{% for post in posts %}
<article>
<h2>{{ post.title }}</h2>
<p>作者:{{ post.author.username }} | {{ post.created_at|date:"Y-m-d H:i" }}</p>
<div>{{ post.content|truncatewords:50 }}</div>
</article>
{% endfor %}
注意那个 |date 和 |truncatewords —— 这是 Django 模板的过滤器,类似 Vue 的 filter 或 React 的 helper function。代码可读性拉满,我甚至敢让产品经理来看(当然他看不懂)。
路由配置:URL 设计也有哲学
在 blog/urls.py 中引入子路由:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('posts.urls')),
]
然后在 posts/urls.py 定义具体路径:
from django.urls import path
from . import views
urlpatterns = [
path('', views.post_list, name='post_list'),
]
这种分层路由机制,让我想起 SpringBoot 的 @RestController + @RequestMapping 组合。但 Django 更“显式”——所有 URL 都集中管理,不会散落在各个 Controller 里。对维护者友好,尤其适合我这种容易忘事的人。
Admin 后台:白送的 CRUD 界面
Django 最让我震惊的功能:自带管理后台!
只需两步:
- 创建超级用户:
python manage.py createsuperuser - 在
posts/admin.py注册模型:
from django.contrib import admin
from .models import Post
@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
list_display = ('title', 'author', 'created_at')
search_fields = ('title', 'content')
重启服务,访问 /admin,登录后直接就能增删改查!界面丑是丑了点,但功能齐全。我拿它给课程设计交作业,导师还以为我做了个完整 CMS。
对比之下,SpringBoot 要实现同样功能,要么手写前端+接口,要么集成第三方(如 Sa-Token + Vue Admin),成本高太多。而 Go 生态虽然有 GORM + Gin 快速搭 API,但管理界面还得另配。
部署初探:别在 localhost 止步
学技术不能只跑本地。我用 Render(免费托管平台)把项目部署上线了。
关键步骤:
- 添加
requirements.txt:pip freeze > requirements.txt - 配置
ALLOWED_HOSTS = ['*'](生产环境记得改!) - 关闭 DEBUG:
DEBUG = False - 设置 SECRET_KEY(千万别硬编码!)
Render 自动识别 Django 项目,一键部署。5 分钟后,我的博客有了公网地址。虽然只有三个测试文章,但发给同学看时,他们居然说“看起来像模像样”——虚荣心得到了极大满足。
与 Go / SpringBoot 对比:工具链的取舍
| 维度 | Django (Python) | SpringBoot (Java) | Go (Gin/GORM) |
|---|---|---|---|
| 上手速度 | ⭐⭐⭐⭐⭐(极快) | ⭐⭐(依赖多,配置复杂) | ⭐⭐⭐(需理解并发模型) |
| 开发效率 | 高(内置功能多) | 中(需集成大量 starter) | 高(但生态碎片化) |
| 性能 | 中(适合中小型应用) | 高 | 极高 |
| 面试题出现率 | 中(常考 ORM/中间件) | 高(必考) | 上升中(大厂偏爱) |
| 工具生态 | 丰富(DRF、Celery等) | 庞大(Spring全家桶) | 精简(标准库强大) |
对我这种学生党,Django 的综合性价比最高。它让我在有限时间内做出“看起来专业”的项目,这对找实习至关重要。等以后进了公司,再根据团队技术栈切换到 Go 或 Java 也不迟。
血泪教训:那些让我熬夜的坑
静态文件 404
开发时没问题,部署后 CSS 全挂。原因:没配置STATIC_ROOT和collectstatic。解决方案:阅读官方部署文档第 3 遍。时区混乱
本地显示北京时间,服务器显示 UTC。解决:settings.py中设置TIME_ZONE = 'Asia/Shanghai'并启用USE_TZ = True。忘记迁移
改了模型没执行makemigrations,上线后数据库字段缺失。现在我把迁移命令写进部署脚本,自动化处理。
结语:从“能跑”到“优雅”
写完这个博客,我才真正理解 Django 的 slogan:“The web framework for perfectionists with deadlines.”(为有截止日期的完美主义者打造)
我不是天才,没进过 ACM 队,也没在 GitHub 万星项目留名。但通过 Django,我做出了可运行、可维护、可展示的作品。这比刷一百道 LeetCode 面试题挑战 更有实感。
未来我会继续学 Go(听说字节、腾讯都在用),也会研究 SpringBoot(毕竟 Java 岗多)。但此刻,我感谢 Django 给我这个双非学生的温柔托底。
对了,如果你也在自学编程,别怕慢。成都的茶馆里,大爷们都能慢悠悠摆一天龙门阵——咱们写代码,急什么?
本文代码已开源:github.com/yourname/django-blog-tutorial
(别问为什么没链接,因为我还没 push……今晚一定!)

评论 0