Django 入门教程:搭建你的第一个 Python 网站

开源路边摊
2025-06-14 13:09
阅读 623

引言:为什么选 Django?

引言:为什么选 Django?

作为一名全栈开发者,我经常需要快速搭建一个 MVP 或者原型网站。在众多后端框架中,Django 是我的首选。不是因为它最流行,而是因为它足够成熟、开箱即用,能够让你专注于业务逻辑而不是重复的基础工作。

这篇文章源于我第一次使用 Django 搭建博客系统的经历。当时我刚从 Node.js 转过来,对 Python 的 Web 开发生态并不熟悉,踩了不少坑,也收获了很多经验。希望通过这篇文章,能够帮助你少走弯路,顺利迈出 Django 开发的第一步。

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

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

去年年底,我接到一个任务:为一位内容创作者搭建一个个人博客网站,要求包括:

  • 文章发布与展示
  • 分类和标签管理
  • 基础的搜索功能
  • 用户登录后台进行内容管理

时间只有一周。作为项目起点,我决定用 Django 来实现这个目标。虽然之前只是了解过 Django,但它的 ORM、管理后台、模板引擎都让我觉得这是个不错的选择。

遇到的问题与挑战

遇到的问题与挑战

尽管 Django 官方文档很详细,但在实际操作过程中还是遇到了一些典型问题:

1. 工程结构不清晰

刚开始的时候,我把所有东西都写在一个 app 里,models.py 很快就变得臃肿不堪。后来才知道,合理的模块划分是维护代码可读性和扩展性的基础。

教训总结:

  • 每个核心实体单独一个 app(比如 blog, user)
  • 把公共部分抽象成 common app
  • 不要让某个 app 变得过于庞大

2. URL 设计混乱

最初没有规划 URL 结构,随便写 path,导致后期修改起来非常麻烦。后来参考了 RESTful 风格,并结合 Django 的命名 URL,才理顺了这一块。

建议做法:

  • 使用 path()re_path() 进行路径匹配
  • 给每个 URL 加上 name 属性,便于反向引用
  • 把 app 的 urls.py 拆分出来,在主项目的 urls.py 中 include

3. 模板继承不熟练

Django 的模板系统非常好用,尤其是 template inheritance。但我一开始直接复制粘贴 HTML,直到第四个页面才发现应该抽象出 base.html。

推荐结构:

<!-- templates/base.html -->
<!DOCTYPE html>
<html>
<head>
    <title>{% block title %}默认标题{% endblock %}</title>
</head>
<body>
    {% block content %}
        默认内容
    {% endblock %}
</body>
</html>

4. 数据库模型设计不合理

早期设计文章表的时候,字段名用了中文拼音如 biaoti,后来意识到规范命名的重要性,立即改为英文字段名:title, content, created_at 等。

优化建议:

  • 使用驼峰或下划线命名法
  • 对时间字段统一命名为 created_atupdated_at
  • 给外键加 related_name 方便查询

解决方案详解

解决方案详解

1. 创建项目和 App

首先安装 Django:

pip install django

然后创建项目和应用:

django-admin startproject myblog
cd myblog
python manage.py startapp article
python manage.py startapp user

目录结构如下:

myblog/
├── manage.py
├── myblog/
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── article/
│   ├── migrations/
│   ├── models.py
│   ├── views.py
│   └── ...
└── user/

别忘了把新 app 加入 INSTALLED_APPS 设置中。

2. 定义数据模型(Models)

以文章为例:

# article/models.py
from django.db import models
from user.models import User

class Article(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='articles')
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    
    def __str__(self):
        return self.title

运行迁移:

python manage.py makemigrations
python manage.py migrate

Django 自动生成数据库表结构,默认表名为 article_article

3. 后台管理配置

Django 的 admin 后台是我最喜欢的特性之一。只需要注册模型即可拥有一个完整的 CRUD 接口。

# article/admin.py
from django.contrib import admin
from .models import Article

admin.site.register(Article)

创建超级用户:

python manage.py createsuperuser

访问 /admin 即可登录并管理文章数据。

4. 编写视图(Views)

Django 支持函数视图(FBV)和类视图(CBV)。初学者可以用 FBV 快速开发,熟悉之后再过渡到 CBV。

例如首页视图:

# article/views.py
from django.shortcuts import render
from .models import Article

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

5. 配置 URL

# myblog/urls.py
from django.urls import path, include
from article.views import index

urlpatterns = [
    path('', index, name='home'),
    path('admin/', admin.site.urls),
    path('article/', include('article.urls')),
]

将 article 的 url 拆分出去:

# article/urls.py
from django.urls import path
from .views import index, detail

app_name = "article"

urlpatterns = [
    path('', index, name='list'),
    path('<int:article_id>/', detail, name='detail'),
]

6. 模板渲染

模板放在 templates 目录下,结构示例:

templates/
├── base.html
├── index.html
└── article/
    └── detail.html

index.html 示例:

{% extends "base.html" %}
{% block title %}首页 - 我的博客{% endblock %}
{% block content %}
    <h1>欢迎来到我的博客</h1>
    <ul>
        {% for article in articles %}
            <li><a href="{% url 'article:detail' article.id %}">{{ article.title }}</a></li>
        {% endfor %}
    </ul>
{% endblock %}

7. 静态文件配置

Django 项目部署时要注意静态文件处理。开发环境下可以这样配置:

# settings.py
STATIC_URL = '/static/'
MEDIA_URL = '/media/'

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static')
]

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

记得导入 os 模块哦!

8. 部署上线

我最终选择 Nginx + Gunicorn 的方式部署到阿里云 CentOS 服务器上。以下是几个关键点:

a. 安装依赖

sudo apt-get update
sudo apt-get install python3-pip nginx
sudo pip3 install gunicorn

b. 配置 Gunicorn

进入项目根目录执行:

gunicorn --bind 0.0.0.0:8000 myblog.wsgi

c. 配置 Nginx

/etc/nginx/sites-available/default 文件示例:

server {
    listen 80;
    server_name your-domain.com;

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

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

    location /media/ {
        alias /path/to/media/;
    }
}

重启 Nginx:

sudo systemctl restart nginx

效果与收益总结

整个博客项目在一周内顺利完成,用户反馈良好。后台操作直观、响应速度快。我从中也获得了一些宝贵的经验:

  1. Django 的 ORM 非常强大:不用再写 SQL,开发效率大大提高;
  2. 管理后台节省了大量人力成本:用户可以直接通过 admin 发布文章;
  3. 模块化设计至关重要:不同业务模块分开维护,方便后续扩展;
  4. 模板系统友好易用:即使是前端小白也能轻松掌握;
  5. 生产环境部署需谨慎处理静态文件:Nginx + Gunicorn 是标准组合,性能和稳定性都不错。

经验分享与建议

作为新手入门 Django,可能会被它的“重”架构吓到。其实只要你理解了 MTV 模式(Model-Template-View),很快就能上手。以下是一些实用建议:

1. 从官方文档入手,不要迷信视频教程

很多人一上来就看视频,结果越看越晕。其实 Django 官网 的教程已经足够清晰,跟着一步步来就行。关键是边学边练,不要只看不动手。

2. 善用 debug 工具

调试时候,可以在 settings.py 中设置 DEBUG = True,浏览器会显示详细的错误信息,有助于定位问题。

3. 学会使用 shell 调试模型

在命令行输入:

python manage.py shell

可以像普通 Python 一样测试模型操作,比如:

from article.models import Article
Article.objects.all()

4. 合理利用中间件

Django 提供了很多现成的中间件,例如安全相关的中间件、CSRF 防护等。线上环境一定要启用。

5. 关注性能问题

虽然 Django 适合中小型项目,但也注意以下几点:

  • 查询尽量使用 select_related / prefetch_related 减少数据库请求
  • 静态资源使用 CDN 加速
  • 数据库索引要合理建立
  • 使用缓存机制,比如 Redis

6. 学习一点前端知识

Django 虽然是后端框架,但掌握基本的 HTML/CSS/JS 会让你如虎添翼。推荐学点 Jinja2 模板语法以及 Bootstrap 框架提升 UI 效果。

写在最后

Django 是一个非常适合用来构建后端服务的框架,尤其对于追求开发效率和个人项目来说,几乎没有比它更适合的工具。这篇文章只是带你迈进了门槛,真正要深入掌握,还需要不断实践和思考。

希望你能通过本文建立起对 Django 的信心和兴趣。记住一句话:“框架不会限制你的能力,只会放大你的效率。”

如果你也有类似的经历或者遇到什么问题,欢迎留言交流。愿我们在技术路上共同成长!

评论 0

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