搭建第一个Django网站:从秋招焦虑到上线部署的实战记录

前端搬砖侠
2025-12-25 22:31
阅读 701

上周五晚上十点半,我瘫在出租屋的小沙发上刷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-CSRFToken header。

  • 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

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