从零到一:用 Django 搭建我的第一个 Python 网站

云端小木屋
2025-06-29 04:54
阅读 586

开篇:为什么是 Django?

开篇:为什么是 Django?

作为一名后端开发者,我接触过不少 Web 框架。Node.js、Flask、Ruby on Rails 都用过,但当我真正想快速搭建一个功能齐全的网站时,还是 Django 给了我最大的信心。

Django 是一个基于 Python 的高级 Web 框架,它以“开箱即用”的理念著称,提供了很多内置功能,比如 ORM(对象关系映射)、管理后台、用户认证系统等。如果你像我一样既想要开发效率,又不想在底层反复造轮子,那么 Django 是个非常不错的选择。

这篇文章会结合我第一次使用 Django 搭建个人博客的经历,带你从零开始一步步构建自己的第一个网站,并分享我在过程中踩过的坑和收获的心得。


背景与项目需求

背景与项目需求

去年年底,我想搭建一个自己的技术博客站点,用来记录学习笔记和项目经验。之前一直在用静态博客平台(如 Jekyll),但我希望这次能实现一些动态交互的功能,比如:

  • 用户评论功能
  • 后台文章管理界面
  • 数据统计模块(阅读量、点赞数)
  • 可扩展性:后续接入 RESTful API 和移动端 App

考虑到开发周期和可维护性,我最终决定选择 Django 来完成这个项目。


第一步:环境搭建

第一步:环境搭建

安装 Python 和 Virtualenv

我使用的 Python 版本是 3.10(建议至少使用 3.8+)。Django 对 Python 的版本有要求,选对版本可以避免很多兼容问题。

为了隔离项目的依赖环境,我用的是 virtualenv

python -m venv venv
source venv/bin/activate

激活虚拟环境后,安装 Django:

pip install django

安装完成后执行:

django-admin --version

确认是否输出了正确的版本号(我当时用的是 4.1.x)。


初始化项目结构

初始化项目结构

接下来创建项目:

django-admin startproject myblog
cd myblog

项目目录如下:

myblog/
├── manage.py
└── myblog/
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

这时你可以先启动服务器看看效果:

python manage.py runserver

浏览器访问 http://127.0.0.1:8000,出现 Django 的欢迎页面就说明环境没问题了。


创建应用并设计数据模型

Django 项目由多个“app”组成,每个 app 负责一个具体的功能。我这里先创建一个 blog 应用:

python manage.py startapp blog

然后别忘了把这个 app 添加进 settings.pyINSTALLED_APPS 中:

INSTALLED_APPS = [
    ...
    'blog',
]

数据模型设计

博客的核心就是文章,所以我定义了一个 Article 模型:

# blog/models.py
from django.db import models
from django.contrib.auth.models import User

class Article(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

这里有几个关键点需要注意:

  • 使用 ForeignKey 关联了内置的 User 模型,方便后期做权限控制。
  • 自动添加了时间戳字段,这样不用手动维护创建和更新时间。
  • __str__ 方法用于在管理后台显示更友好的名称。

然后执行数据库迁移:

python manage.py makemigrations
python manage.py migrate

此时数据库表已经生成完毕。


管理后台配置

Django 内置了一个非常强大的管理后台,我只需要简单配置就可以使用。

编辑 blog/admin.py

from django.contrib import admin
from .models import Article

admin.site.register(Article)

接着创建超级用户:

python manage.py createsuperuser

输入用户名、邮箱、密码后,在 http://localhost:8000/admin 登录,就能看到我们注册的 Article 表,可以直接通过界面上新增内容。

这是我第一次体验 Django 的管理后台,真的太方便了,省去了自己写 CRUD 接口的时间!


页面展示逻辑

接下来要实现文章列表页和详情页。这需要编写视图函数和模板文件。

编写视图

blog/views.py 中添加:

from django.shortcuts import render, get_object_or_404
from .models import Article

def article_list(request):
    articles = Article.objects.all().order_by('-created_at')
    return render(request, 'blog/article_list.html', {'articles': articles})

def article_detail(request, pk):
    article = get_object_or_404(Article, pk=pk)
    return render(request, 'blog/article_detail.html', {'article': article})

这两个函数分别用于展示文章列表和详情页。注意这里用了 get_object_or_404,如果找不到对应的文章,就会返回 404 页面,而不是异常堆栈,这对用户体验很好。

模板渲染

创建 templates/blog/article_list.html 文件:

<h1>My Blog</h1>
<ul>
{% for article in articles %}
<li><a href="{% url 'article_detail' article.id %}">{{ article.title }}</a></li>
{% endfor %}
</ul>

以及 article_detail.html

<h1>{{ article.title }}</h1>
<p>{{ article.content }}</p>
<p><small>Published at {{ article.created_at }}</small></p>

记得在项目设置中配置模板路径:

myblog/settings.py 中找到 TEMPLATES,把模板目录加入进去:

TEMPLATES = [
    {
        ...
        'DIRS': [BASE_DIR / 'templates'],
        ...
    }
]

URL 配置

最后在 blog/urls.py 中定义路由:

from django.urls import path
from . import views

urlpatterns = [
    path('', views.article_list, name='article_list'),
    path('article/<int:pk>/', views.article_detail, name='article_detail'),
]

然后在项目的主 urls.py 中引入:

from django.urls import include, path

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

运行服务再次访问首页 http://localhost:8000,你就能看到文章列表了。


遇到的挑战和解决过程

🛠️ 模板加载失败

在刚开始的时候,我犯了个低级错误——忘记在 settings.py 中配置模板路径,结果一直提示 TemplateDoesNotExist。

教训: 确保你在 TEMPLATES['DIRS'] 中正确设置了模板目录,并且文件结构和引用路径一一对应。

🔒 权限控制没有做好

初期我忽略了权限控制的问题,所有人都可以访问任何文章详情页,包括删除、修改操作。后来才意识到,必须加一层用户认证。

解决办法是在视图中加上:

from django.contrib.auth.decorators import login_required

@login_required
def article_detail(request, pk):
    ...

并在前端判断用户是否登录:

{% if user.is_authenticated %}
<a href="#">发布新文章</a>
{% else %}
请 <a href="#">登录</a> 后评论
{% endif %}

Django 的用户系统真的很强大,基本不需要自己写登录逻辑。

🧪 测试用例缺失导致上线出错

一开始我没写单元测试,结果部署到生产环境后发现某个查询语句写了错的字段名,程序直接崩溃。后来我加上了简单的测试:

# blog/tests.py
from django.test import TestCase
from .models import Article
from django.utils import timezone

class ArticleModelTest(TestCase):
    def test_article_creation(self):
        article = Article(title="Test", content="Test", author_id=1)
        article.save()
        self.assertEqual(article.title, "Test")

测试虽然简单,但能提前发现很多潜在问题。


性能优化和部署经验

💾 数据库索引优化

随着文章数量增加,我发现文章列表的查询速度变慢。于是开始检查数据库性能,在 Django ORM 层面对 created_at 字段增加了索引:

created_at = models.DateTimeField(auto_now_add=True, db_index=True)

同时避免在视图中频繁使用 select_relatedprefetch_related 以外的嵌套查询,减少 N+1 查询问题。

📦 静态资源处理

网站上线后静态资源无法加载?那是因为开发环境下 Django 默认不会处理静态文件。你需要运行:

python manage.py collectstatic

然后在 nginx 或其他 Web 服务器配置中指向静态资源目录:

location /static/ {
    alias /path/to/static_root/;
}

别忘了把 STATIC_ROOT = BASE_DIR / 'static_root' 设置好。

🚀 生产环境部署

我使用的是 Gunicorn + Nginx 的组合,部署流程大致如下:

  1. 将代码上传到服务器
  2. 安装依赖:pip install -r requirements.txt
  3. 执行迁移:python manage.py migrate
  4. 收集静态文件:python manage.py collectstatic
  5. 配置 gunicorn 服务(建议配合 systemd 管理)
  6. 配置 nginx 作为反向代理

另外,推荐将数据库换成 PostgreSQL,它更适合中大型项目,比 SQLite 更稳定。


结果与收益总结

经过两周的开发,我的博客站点顺利上线,不仅满足了最初的动态功能需求,还为后续拓展打下了良好的基础。现在支持:

  • 用户登录与权限控制
  • 文章增删改查
  • 后台管理界面
  • 基础性能优化和部署能力

最让我满意的一点是,整个项目只用了不到 1k 行代码,却完成了完整的基础功能,这就是 Django 的魅力所在。


我的经验建议

作为一位实际经历过从零开发到部署上线的开发者,我想给刚入门的朋友几个建议:

  1. 别一开始就想着完美设计架构,先把功能跑起来更重要。Django 很适合迭代式开发。
  2. 合理利用管理后台,它可以帮你省下大量 CRUD 时间。
  3. 重视测试环节,哪怕只是小项目,也能大幅减少 Bug。
  4. 性能优化不必过早介入,但一定要在项目中期考虑扩展性和数据库瓶颈。
  5. 多看官方文档和社区项目,比如 Django Girls,它们提供了丰富的实战例子。

微服务架构示意图-2

结语

服务器部署方案-1

Django 是一个值得每一位 Python 开发者深入掌握的框架。它不仅能提升你的开发效率,还能让你写出结构清晰、易于维护的代码。无论是做内部工具、小型产品原型,还是中大型系统的后端部分,Django 都能胜任。

希望这篇文章能帮到正在学习或即将尝试 Django 的你。如果你也有自己的 Django 故事,欢迎留言交流~

评论 0

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