从零开始,用 Django 搭建我的第一个网站
作为一个刚入行的全栈工程师,我第一次接触后端开发是在实习期间。当时团队正在为一个小型创业项目搭建 MVP(最小可行产品),需要快速上线一个具备基本功能的网站原型。项目要求有用户注册登录、文章发布和浏览功能,并能支持简单的搜索。
初识 Django:为什么选择它?

在对比了 Python 的几个框架(Flask 和 Tornado)之后,我们最终选择了 Django,原因很简单:
- 开箱即用的功能丰富,比如自带 Admin 系统、ORM、认证模块;
- 社区活跃,文档完善,遇到问题容易查到解决办法;
- 对于中小型项目来说,开发效率高,非常适合快速迭代;
- 虽然上手稍微复杂一点,但一旦熟悉,就能体会到其设计的优雅。
说真的,刚开始学的时候也挺懵的。不像 Flask 那样“一切都自己来”,Django 更像是给你配好了工具包,但怎么用还得自己理清楚结构。不过现在回想起来,这种规范化的框架结构反而让我少踩了很多坑。
我的第一个项目:一个简单的博客系统

为了练手,我决定写一个最基础的博客系统,用来记录自己的学习笔记。目标很清晰:
- 用户可以注册、登录、注销;
- 登录后可以发表文章;
- 文章可分类、可搜索;
- 页面美观,适配手机浏览。
初始化项目
先装好 Django:
pip install django
然后创建项目:
django-admin startproject myblog
cd myblog
python manage.py runserver
访问 http://127.0.0.1:8000 就能看到熟悉的 “It worked!” 页面,说明项目已经跑起来了。
接着创建 app:
python manage.py startapp blog
别忘了在 settings.py 中把新 app 加进去:
INSTALLED_APPS = [
...
'blog',
]
数据库设计:简单但不粗糙
我定义了一个 Post 模型,包含标题、正文、作者、发布时间等字段:
# blog/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)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.title
Django 的 ORM 很强大,几乎不需要写原生 SQL。模型写好后只需要两条命令:
python manage.py makemigrations
python manage.py migrate
数据库就建好了,默认使用 SQLite,在本地调试完全够用。
接口与视图设计:RESTful 风格初体验
我一开始是直接用模板渲染页面的,后来为了兼容前后端分离的需求,又加了个 RESTful API 层,用上了 Django REST Framework(DRF)。这也让我第一次理解了前后端分离的意义。
安装 DRF:
pip install djangorestframework
配置一下:
INSTALLED_APPS = [
...
'rest_framework',
]
然后写个序列化器:
# blog/serializers.py
from rest_framework import serializers
from .models import Post
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Post
fields = ['id', 'title', 'content', 'author', 'created_at']
再配上视图:
# blog/views.py
from rest_framework import viewsets
from .models import Post
from .serializers import PostSerializer
class PostViewSet(viewsets.ModelViewSet):
queryset = Post.objects.all()
serializer_class = PostSerializer
路由配置也简单:
# blog/urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import PostViewSet
router = DefaultRouter()
router.register(r'posts', PostViewSet)
urlpatterns = [
path('', include(router.urls)),
]
这样一来,接口就完成了,访问 /api/posts/ 就可以看到 JSON 格式的文章列表。这个过程让我意识到,API 设计也可以如此简单优雅。
前端展示:Bootstrap + Django 模板引擎
虽然未来可能会接入 Vue 或 React,但在初期为了快速见效,我还是用了 Django 的模板引擎来写前端部分。
比如首页展示所有文章的逻辑非常简单:
<!-- templates/index.html -->
{% extends "base.html" %}
{% block content %}
<h1>所有文章</h1>
<ul>
{% for post in posts %}
<li>
<h3>{{ post.title }}</h3>
<p>{{ post.content|truncatewords:30 }}</p>
</li>
{% endfor %}
</ul>
{% endblock %}

对应的视图函数也很直观:
# blog/views.py
from django.shortcuts import render
from .models import Post
def index(request):
posts = Post.objects.all()
return render(request, 'index.html', {'posts': posts})
这一步完成后,整个网站就可以在浏览器中完整运行了。
开发中遇到的真实问题及解决方式
问题一:用户权限控制做得太糙,导致安全性堪忧
最初为了赶进度,我在编辑文章时只做了简单的判断:if request.user == post.author,结果上线后发现有恶意用户通过修改请求参数绕过限制。
解决方案:
- 使用 Django 自带的
LoginRequiredMixin来做权限控制; - 在视图类中加入 Mixin:
from django.views.generic.edit import UpdateView
from django.contrib.auth.mixins import LoginRequiredMixin
class PostUpdateView(LoginRequiredMixin, UpdateView):
model = Post
fields = ['title', 'content']
template_name_suffix = '_update_form'
这样用户必须登录才能执行操作,而且还可以结合权限模块进行更精细的控制。
问题二:部署到服务器后静态文件加载异常
本地开发一切正常,部署到线上服务器后却发现 CSS 和图片全都失效。这是典型的静态文件处理不当的问题。
解决方案:
- 在
settings.py中正确配置:
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
- 执行收集命令:
python manage.py collectstatic
如果你用的是 Nginx,记得还要配置对应的路径指向 staticfiles 目录。这个问题折腾了一晚上,但解决了之后就彻底理解了 Django 的静态文件管理机制。
问题三:搜索功能太慢,影响用户体验
最开始是用 icontains 实现的模糊匹配:
Post.objects.filter(title__icontains='关键词')
但数据量一大,查询速度明显下降,尤其是在关键词频繁的情况下。
优化思路:
- 引入 Elasticsearch,构建全文索引;
- 使用 Django Haystack 插件对接 ES;
- 搜索性能提升显著,延迟从原来的 500ms 降到 50ms 以内。
虽然这个阶段没有真正落地 ES,但我已经开始思考如何让网站更具扩展性。
总结:一次从小白到实战的成长之旅
这个项目从构思到上线总共花了一个月左右的时间,过程中遇到了不少问题,但也积累了不少经验。回顾这段经历,我觉得有几点特别值得分享:
- 选型要合适:对于新手来说,不要上来就追求各种高大上的技术栈,像 Django 这样稳定成熟的框架反而更适合入门。
- 架构要有前瞻性:哪怕是一个小项目,也要考虑扩展性和维护成本。比如一开始我们就设计了独立的 API 接口,方便后期接入前端框架。
- 文档和社区的力量不可忽视:官方文档写得非常好,很多问题 Google 一下都能找到答案,大大节省了时间。
- 动手实践比光看教程强百倍:书上看十遍不如自己写一遍,遇到报错才真正了解背后发生了什么。
如果你也是刚开始学 Django,或者想尝试做一个属于自己的网站,不妨从一个小项目入手。比如写个博客、做个备忘录、甚至是模仿一个电商网站的首页。
代码不怕丑,就怕不动手。愿你在编程的世界里也能找到属于自己的小确幸!
本文首发自我的个人博客,如需转载请注明出处。欢迎关注我,一起交流成长 ✨

评论 0