Django 入门实战:从零搭建你的第一个 Python 网站

郑艳
2025-06-22 22:14
阅读 279

引子:为什么选择 Django?

引子:为什么选择 Django?

作为一名后端开发者,我已经在实际项目中使用 Django 多年。第一次接触它的时候,是被它“开箱即用”的理念深深吸引。相比其他框架需要手动配置大量组件,Django 把大部分后端开发流程都帮你做好了,让你可以把精力集中在业务逻辑本身。

今天我想通过一个真实的项目场景,带你一步步了解如何使用 Django 搭建自己的第一个网站。我会结合自己早期工作中的经验、踩过的坑和收获分享一些实用技巧,并尽量还原真实开发过程中的点滴。


项目背景:一个小而完整的博客系统

项目背景:一个小而完整的博客系统

去年我刚入职一家小型创业公司时,被安排做一个内部使用的知识管理系统。说白了就是个简易博客平台,支持发布文章、分类管理、用户权限控制等功能。时间紧迫,两周内上线 MVP。

需求简述:

  • 支持管理员撰写并发布文章
  • 文章可按分类浏览
  • 支持访客评论功能
  • 用户分级(普通访客 vs 管理员)
  • 数据可视化(统计每周发布量)

考虑到时间和团队技术栈,我们最终决定采用 Django 快速搭建。事实证明,在这个场景下,Django 的表现超出预期。


开发准备阶段

开发准备阶段

在动手上代码之前,首先要确认好几点:

  1. Python 环境 —— 建议使用 Python 3.8+,目前 Django 官方支持到 3.2.x
  2. 虚拟环境 —— 每个项目单独建立 venv,确保依赖隔离。
  3. 项目结构规划 —— 初期就定好 app 划分策略,避免后期难以拆解。
# 创建项目目录和虚拟环境
mkdir my_blog_project
cd my_blog_project
python -m venv env
source env/bin/activate
pip install django

安装完成后,就可以创建项目和应用了:

django-admin startproject blog_project .
python manage.py startapp blog

现在项目结构大概是这样的:

my_blog_project/
├── blog/
├── blog_project/
├── env/
├── manage.py

核心挑战一:数据库设计怎么做才不踩坑?

核心挑战一:数据库设计怎么做才不踩坑?

在实际工作中,最怕的就是初期设计随意,导致后面频繁重构。因此一开始就要认真对待模型定义。比如我们的博客系统核心实体有以下几个:

  • 文章(Article)
  • 分类(Category)
  • 用户(User)
  • 评论(Comment)

模型示例:

# blog/models.py

from django.db import models
from django.contrib.auth.models import User

class Category(models.Model):
    name = models.CharField(max_length=100, unique=True)
    
    def __str__(self):
        return self.name


class Article(models.Model):
    title = models.CharField(max_length=255)
    content = models.TextField()
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.title


class Comment(models.Model):
    article = models.ForeignKey(Article, on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)

经验点:

  • 外键关系要清晰:例如,文章属于某个分类,删除分类时可以考虑是否允许为空 (on_delete=models.SET_NULL)。
  • 时间字段一定要加created_atupdated_at 对于运营数据分析非常关键。
  • 模型描述建议加上 __str__ 方法:这样在 admin 后台或者调试时更直观。

使用 Django Admin 提升效率

Django 自带的 admin 接口真的太省事了!我们只需要注册一下模型即可实现后台增删改查操作,对于内容编辑人员来说非常友好。

服务器部署方案-2

示例代码:

# blog/admin.py

from django.contrib import admin
from .models import Article, Category, Comment

admin.site.register(Category)
admin.site.register(Article)
admin.site.register(Comment)

访问 /admin 登录后就可以看到自动构建的界面。如果你希望自定义展示格式,也可以扩展 ModelAdmin 类来定制列表页显示、过滤等细节。


构建 API 接口:前后端分离的起点

虽然这是一个简单的博客系统,但未来可能会接入移动端或小程序。因此我们提前埋下了 RESTful 风格的 API 接口设计。

技术选型:Django REST Framework (DRF)

DRF 是 Django 最常用的 API 插件库,能帮助我们快速生成接口。这里给出一个简单的文章接口示例:

序列化器(Serializer)

# blog/serializers.py

from rest_framework import serializers
from .models import Article, Category

class CategorySerializer(serializers.ModelSerializer):
    class Meta:
        model = Category
        fields = ['id', 'name']

class ArticleSerializer(serializers.ModelSerializer):
    category = CategorySerializer(read_only=True)

    class Meta:
        model = Article
        fields = ['id', 'title', 'content', 'author', 'category', 'created_at']

视图函数

# blog/views.py

from rest_framework.views import APIView
from rest_framework.response import Response
from .models import Article
from .serializers import ArticleSerializer

class ArticleListView(APIView):
    def get(self, request):
        articles = Article.objects.all()
        serializer = ArticleSerializer(articles, many=True)
        return Response(serializer.data)

URL 配置

# blog/urls.py

from django.urls import path
from .views import ArticleListView

urlpatterns = [
    path('api/articles/', ArticleListView.as_view()),
]

再加上全局路由引入:

# blog_project/urls.py

from django.urls import include, path

urlpatterns = [
    ...
    path('', include('blog.urls')),
]

这样我们就有了一个 GET 获取所有文章的接口,后续还可以加入身份验证、分页、搜索、排序等功能。


路由与视图:写 Web 页面也要讲究套路

除了 API 接口,我们还需要页面级的前端展示。Django 的模板引擎其实也很强大,尤其适合中小型项目。

模板目录结构:

blog/
├── templates/
│   └── blog/
│       ├── index.html
│       ├── article_detail.html
│       └── base.html

views 示例:

# blog/views.py

from django.shortcuts import render
from .models import Article

def home(request):
    articles = Article.objects.all().order_by('-created_at')[:5]
    return render(request, 'blog/index.html', {'latest_articles': articles})


def article_detail(request, pk):
    try:
        article = Article.objects.get(pk=pk)
    except Article.DoesNotExist:
        raise Http404("文章不存在")
    return render(request, 'blog/article_detail.html', {'article': article})

再配上对应的 URL:

# blog/urls.py

from django.urls import path
from .views import home, article_detail

urlpatterns = [
    path('', home, name='home'),
    path('article/<int:pk>/', article_detail, name='article-detail'),
]

这基本上就是一个完整的页面结构了,剩下的就是 HTML + CSS 渲染。


实战踩坑记录 & 解决方案

以下是一些我在实际开发过程中遇到的问题和应对方法:

❌ 问题1:迁移文件冲突或失败

现象: 数据库迁移时报错,提示无法创建表或已有列存在。

解决思路:

  • 检查是否有人动了原来的迁移文件。
  • 使用 makemigrations --empty <app> 新建空白迁移进行调整。
  • 如果确定没问题可以直接清理 migrations 文件夹并重新运行。

❌ 问题2:静态资源加载失败

现象: 开发环境下静态文件(CSS/JS)加载 404。

解决方案:

  • 确保在设置里配置好了 STATIC_URLSTATIC_ROOT
  • 添加中间件 'django.middleware.common.CommonMiddleware'
  • 使用 {% load static %}<link rel="stylesheet" href="{% static 'style.css' %}"> 这种语法加载资源

❌ 问题3:生产环境部署出错

现象: 上线后出现数据库连接错误、权限问题等。

解决办法:

  • 生产设置务必使用 .env 或者环境变量管理敏感信息(如 SECRET_KEY、数据库密码)
  • 使用 gunicorn + nginx 替代开发服务器(runserver)
  • 记得跑一遍 collectstatic 把静态资源集中处理

性能优化初探

缓存策略对比-1

尽管只是个小型博客系统,但从一开始就应关注性能。以下是几个常见的优化点:

✅ 缓存优化

使用缓存减少数据库压力是一个通用手段。Django 提供了多种缓存机制,比如 Redis。

# 设置 cache backend(settings.py)

CACHES = {
    'default': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': 'redis://127.0.0.1:6379/0',
    }
}

然后在 view 中使用:

from django.core.cache import cache

def home(request):
    key = 'latest_articles'
    articles = cache.get(key)
    if not articles:
        articles = Article.objects.all().order_by('-created_at')[:5]
        cache.set(key, articles, timeout=300)  # 缓存五分钟
    return render(request, 'blog/index.html', {'latest_articles': articles})

✅ 查询优化

  • 使用 .select_related().prefetch_related() 来优化 ForeignKey 查询
  • 避免在模板中执行 N+1 查询
  • 使用 QuerySet 批量操作代替循环更新/插入数据

效果总结:一次成功的尝试

项目如期上线,两周内完成了 MVP,并且顺利交付给了公司内部用户使用。由于采用 Django,开发效率大大提高,同时也为后续维护提供了良好的基础。

几个月后,当我们要增加新的功能模块(比如标签系统、推荐算法)时,发现整个项目的结构清晰,模块划分合理,大大减少了开发成本。


我的 Django 使用经验总结

回顾这几年的 Django 使用经历,我总结了几条实用建议:

  1. 不要小看内置工具:admin、auth、forms、cache、sessions 等都是多年打磨下来的经典组件。
  2. 坚持合理的工程实践:版本控制、单元测试、CI/CD 流程尽早引入。
  3. 注意项目结构清晰:多个 app 划分合理,各司其职。
  4. 多看看社区最佳实践:比如 Cookiecutter-Django、Django Girls 教程、Two Scoops of Django 等书籍。
  5. 学会取舍:Django 功能虽强,但在某些场景(如高并发微服务),可能更适合搭配 FastAPI、Go 等技术栈。

结语:技术的成长永远来自实践

这篇文章讲的是我早期在公司做一个内部博客系统的完整过程。虽然简单,但它教会我如何快速地把一个想法变成可用的产品,也让我认识到,好的工具能让人专注于创造价值而不是重复造轮子

如果你是刚刚起步的开发者,别担心复杂的概念。Django 不仅仅是框架,它是一种思维方式——一种“高效解决问题”的方式。只要愿意动手试,你就能感受到它的魅力。

最后送一句话给正在学习的你:“代码不是用来写完美的,是用来不断打磨的。”共勉!


希望这篇结合真实项目经验的入门教程能为你打开 Django 的大门。如果对你有所帮助,欢迎点赞留言,或者跟我交流更多技术话题 😊

评论 0

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