搭建第一个Django网站:从秋招焦虑到上线部署的实战记录
上周五晚上十点半,我瘫在出租屋的小沙发上刷LeetCode,突然想起室友阿哲——那个已经拿到拼多多Offer的大佬——昨天随口问了句:“你Django练得咋样了?听说字节后端岗最近特别看重这个。” 我心里一咯噔。作为985计算机大三狗,Python基础尚可,但Django?除了课程大作业里跑过个Hello World,几乎没碰过。
眼看秋招提前批7月就开了,简历上“熟悉Web开发”几个字显得格外苍白。更惨的是,我连一个能展示的完整项目都没有。于是周末两天,我咬牙决定:用Django搭一个能跑起来的网站,不为别的,就为了面试时能把“做过项目”说得理直气壮一点。
为什么选 Django?别被“重”吓退
很多人(包括我)一听Django就觉得“太重”,不如Flask轻量。但实际用下来发现,Django的“重”恰恰是它的护城河——自带Admin、ORM、用户认证、安全防护,一套打完省心省力。尤其是对我这种前端还行、后端刚起步的选手,不用从零造轮子,直接聚焦业务逻辑。
而且!翻了几本秋招面试题集(比如《剑指Offer:后端篇》和《Python Web开发实战》),发现Django高频出现。某厂甚至直接问:“Django中间件怎么写?请求生命周期是怎样的?” —— 这要是没亲手撸过,光背八股文根本扛不住。
开搞!从零搭建“读书笔记”网站
我想做个极简的“读书笔记”平台:用户注册登录后,可以添加/查看自己读过的书,附上简短书评。名字我都想好了,叫 BookLog。
第一步:环境 & 初始化
先装Django(我用的是Python 3.10):
pip install django
django-admin startproject booklog
cd booklog
python manage.py startapp books
这时候目录结构长这样:
booklog/
├── booklog/ # 项目配置
├── books/ # 我的App
├── manage.py
└── db.sqlite3 # 默认数据库(先凑合用)
吐槽一句:上海租房小,电脑放桌上,旁边就是泡面桶。每次敲命令都怕手抖删库,还好Django默认用SQLite,至少不会炸生产环境(虽然现在还没生产环境 😅)。
第二步:设计模型 —— 别忽视数据库思维
我在 books/models.py 里定义两个核心模型:
from django.db import models
from django.contrib.auth.models import User
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.CharField(max_length=100)
isbn = models.CharField(max_length=13, unique=True) # ISBN唯一
def __str__(self):
return self.title
class ReadingNote(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
book = models.ForeignKey(Book, on_delete=models.CASCADE)
note = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
class Meta:
unique_together = ('user', 'book') # 一人一书一条笔记
这里有几个面试常考点:
on_delete=models.CASCADE:级联删除,用户删了,笔记也跟着消失unique_together:防止重复提交同一本书的笔记- 使用Django内置的
User模型,省去自己实现登录注册的麻烦
踩坑实录:一开始我把
isbn设成IntegerField,结果ISBN带X(比如 978-7-02-014633-X),直接报错。改用CharField才搞定。真实世界的数据永远比你想象的脏!
第三步:写视图 & 模板 —— 前端仔的舒适区?
因为对前端动画有点兴趣,我特意加了个小交互:点击“添加笔记”按钮时,表单淡入。不过后端逻辑才是重点。
在 books/views.py 中:
from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from .models import Book, ReadingNote
from .forms import BookForm, NoteForm
@login_required
def add_note(request):
if request.method == 'POST':
form = NoteForm(request.POST)
if form.is_valid():
note = form.save(commit=False)
note.user = request.user
note.save()
return redirect('note_list')
else:
form = NoteForm()
return render(request, 'books/add_note.html', {'form': form})
关键点:
@login_required装饰器自动跳转登录页,安全又省事commit=False先不存数据库,手动绑定当前用户再保存
模板用Django自带的模板引擎,虽然比不上React/Vue灵活,但做简单页面够用。我还用了Bootstrap快速美化,毕竟秋招项目颜值不能太低。
部署上线:从本地到公网,运维初体验
本地跑通只是开始。为了让面试官能点开看,我决定部署到云服务器。
选择工具链
| 工具 | 用途 | 为什么选它 |
|---|---|---|
| Gunicorn | WSGI服务器 | 比Django自带的runserver稳定 |
| Nginx | 反向代理 | 处理静态文件 + 负载均衡 |
| PostgreSQL | 数据库 | SQLite不适合生产,PostgreSQL免费且强大 |
| Docker | 容器化 | 方便本地和服务器环境一致 |
真实场景:上次课程项目直接用SQLite上线,结果并发一高就锁表,被助教嘲讽“这也能叫Web应用?”。这次学乖了。
关键配置片段
settings.py 中区分环境:
# 生产环境关闭DEBUG
DEBUG = os.getenv('DEBUG', 'False').lower() == 'true'
# 数据库切换
if DEBUG:
DATABASES = { ... } # SQLite
else:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': os.getenv('DB_NAME'),
'USER': os.getenv('DB_USER'),
'PASSWORD': os.getenv('DB_PASS'),
'HOST': os.getenv('DB_HOST'),
}
}
# 静态文件交给Nginx
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
然后写了个超简陋的 Dockerfile:
FROM python:3.10
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
RUN python manage.py collectstatic --noinput
CMD gunicorn booklog.wsgi:application --bind 0.0.0.0:8000
最后用宝塔面板(别笑,学生党图快)配Nginx反代,域名解析一搞,BookLog终于能被外网访问了!
面试题复盘:这些坑我替你踩过了
做完项目,我回头翻面试题,发现很多问题现在能答得很溜:
Q:Django如何防止CSRF攻击?
A:模板中加{% csrf_token %},Django中间件自动校验。但AJAX请求要手动处理,我用的axios加了X-CSRFTokenheader。Q:ORM查询性能怎么优化?
A:用select_related减少SQL查询次数。比如查笔记时顺便查书信息:ReadingNote.objects.select_related('book').filter(user=request.user)Q:部署时静态文件怎么处理?
A:collectstatic收集到STATIC_ROOT,Nginx直接serve,不走Python进程,性能提升明显。
写在最后:工具是杠杆,但别当ChatGPT的提线木偶
说实话,整个过程我重度依赖Claude和ChatGPT。比如写Dockerfile时卡住,直接问:“Django+PostgreSQL的Dockerfile怎么写?”,它秒回。但我坚持每行代码都自己理解后再粘贴——毕竟面试官一问“为什么这么配”,答不上来就露馅了。
现在BookLog虽然简陋,但至少是个完整闭环:用户系统、数据持久化、前后端交互、线上部署。投简历时,我能指着链接说:“这是我独立完成的项目,代码和部署文档都在GitHub上。”
秋招压力山大,但有时候,动手做一个小项目,比刷十道算法题更能建立信心。如果你也在焦虑,不妨今天就 django-admin startproject 一下?
P.S. 项目地址放GitHub了(私信可要),欢迎Star(不是)。下周打算加个“书籍搜索”功能,用Elasticsearch——听说这也是后端岗加分项?唉,卷不动了,但还得卷。

评论 0