从零开始,用 Django 搭建我的第一个网站

半个架构师
2025-06-13 03:25
阅读 484

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

初识 Django:为什么选择它?

初识 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 %}

API接口文档-1

对应的视图函数也很直观:

# 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

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