输出 4.2.7(截至2023年10月最新LTS)

王浩宇
2026-01-15 01:59
阅读 2366

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.pyINSTALLED_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 最让我震惊的功能:自带管理后台

只需两步:

  1. 创建超级用户:python manage.py createsuperuser
  2. 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(免费托管平台)把项目部署上线了。

关键步骤:

  1. 添加 requirements.txtpip freeze > requirements.txt
  2. 配置 ALLOWED_HOSTS = ['*'](生产环境记得改!)
  3. 关闭 DEBUG:DEBUG = False
  4. 设置 SECRET_KEY(千万别硬编码!)

Render 自动识别 Django 项目,一键部署。5 分钟后,我的博客有了公网地址。虽然只有三个测试文章,但发给同学看时,他们居然说“看起来像模像样”——虚荣心得到了极大满足。


与 Go / SpringBoot 对比:工具链的取舍

维度 Django (Python) SpringBoot (Java) Go (Gin/GORM)
上手速度 ⭐⭐⭐⭐⭐(极快) ⭐⭐(依赖多,配置复杂) ⭐⭐⭐(需理解并发模型)
开发效率 高(内置功能多) 中(需集成大量 starter) 高(但生态碎片化)
性能 中(适合中小型应用) 极高
面试题出现率 中(常考 ORM/中间件) 高(必考) 上升中(大厂偏爱)
工具生态 丰富(DRF、Celery等) 庞大(Spring全家桶) 精简(标准库强大)

对我这种学生党,Django 的综合性价比最高。它让我在有限时间内做出“看起来专业”的项目,这对找实习至关重要。等以后进了公司,再根据团队技术栈切换到 Go 或 Java 也不迟。


血泪教训:那些让我熬夜的坑

  1. 静态文件 404
    开发时没问题,部署后 CSS 全挂。原因:没配置 STATIC_ROOTcollectstatic。解决方案:阅读官方部署文档第 3 遍。

  2. 时区混乱
    本地显示北京时间,服务器显示 UTC。解决:settings.py 中设置 TIME_ZONE = 'Asia/Shanghai' 并启用 USE_TZ = True

  3. 忘记迁移
    改了模型没执行 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

最热最新
暂无评论
王浩宇Lv.1
0
影响力
0
文章
0
粉丝