第65课 - 全栈框架入门:Django 简介与项目创建
学习目标
完成本课学习后,你将能够:
- 理解 Django 框架的定位、特点及其与 Flask 的区别。
- 掌握创建 Django 项目和应用的基本流程与命令。
- 熟悉 Django 项目的标准目录结构及各文件/目录的职责。
- 编写并运行你的第一个 Django 视图(View)和 URL 配置。
- 了解 Django 开发服务器(
runserver)的启动与使用。
核心概念
1. Django 是什么?
Django 是一个用 Python 编写的高级全栈 Web 框架。如果说 Flask 是一个"轻量级工具箱",那么 Django 就是一个"功能完备的工厂"。它鼓励快速开发和简洁、实用的设计。
"全栈" 意味着 Django 提供了一站式解决方案,内置了 Web 开发中常用的功能:
- ORM (对象关系映射):用 Python 代码操作数据库,无需直接写 SQL。
- 管理后台:自动生成一个强大的管理界面,用于管理网站内容。
- 表单处理:方便地创建和验证 HTML 表单。
- 用户认证:内置用户登录、注册、权限管理等系统。
- URL 路由:将 URL 映射到具体的处理函数。
- 模板引擎:将数据动态生成 HTML 页面。
2. Django vs Flask
你可以把它们想象成两种工具:
- Flask:像一个高级智能手机的"基础设置"。它给你核心功能,但更多功能(如用户系统、数据库)需要你通过"安装App(扩展)"来添加。
- Django:像一台"出厂即带全家桶的旗舰机"。它默认集成了大部分你开发复杂网站所需的工具,遵循"电池已包含"的哲学。
选择建议:
- 小型项目、API 服务、需要高度定制化 -> 考虑 Flask。
- 内容驱动型网站(如博客、新闻站)、管理后台、电商、需要快速开发的标准功能 -> 首选 Django。
3. Django 项目架构:MVT 模式
Django 采用 MVT (Model-View-Template) 架构,这与传统的 MVC (Model-View-Controller) 稍有不同,但本质相似。
- Model (模型):负责数据结构和数据库交互。定义数据是什么样的。
- View (视图):负责业务逻辑。处理请求,从 Model 获取数据,并选择合适的 Template 进行渲染。
- Template (模板):负责页面展示。是带有特殊语法的 HTML 文件,用于展示 View 传来的数据。
- (隐含的 Controller):Django 自身的 URL 调度器和框架核心部分承担了"控制器"的角色,负责接收请求并分派给正确的 View。
工作流程:用户请求 URL -> Django URL 调度器找到对应的 View 函数 -> View 函数处理业务(可能查询数据库 Model)-> View 将数据传递给 Template -> Template 渲染生成 HTML -> 返回给用户浏览器。
代码示例
步骤 1:安装 Django
首先,确保你的 Python 环境已激活(推荐使用虚拟环境)。
pip install django
安装完成后,可以通过 django-admin --version 查看版本。
步骤 2:创建项目
使用 django-admin 命令来创建一个新的 Django 项目。项目是网站的"整体配置"。
# 进入你想存放项目的目录
cd ~/projects
# 创建一个名为 `mysite` 的项目
django-admin startproject mysite
执行后,Django 会生成如下结构:
mysite/
manage.py # 项目的管理脚本(用于运行命令)
mysite/ # 项目的 Python 包(核心配置)
__init__.py # 标识这是一个 Python 包
settings.py # 项目的所有配置(数据库、应用、中间件等)
urls.py # 项目的根 URL 配置
asgi.py # ASGI 兼容的 Web 服务器入口(可忽略)
wsgi.py # WSGI 兼容的 Web 服务器入口(可忽略)
步骤 3:创建应用
一个项目可以包含多个应用(App),每个应用负责一块独立的功能(如博客、用户认证、评论系统)。
# 进入项目目录
cd mysite
# 创建一个名为 `blog` 的应用
python manage.py startapp blog
现在项目结构变为:
mysite/
manage.py
mysite/ (项目配置)
blog/ (新创建的应用)
__init__.py
admin.py # 注册模型到管理后台
apps.py # 应用的配置
migrations/ # 数据库迁移文件
__init__.py
models.py # 定义数据模型
tests.py # 测试文件
views.py # 编写视图函数
步骤 4:编写第一个视图
在 blog/views.py 文件中写入以下代码:
from django.http import HttpResponse
def hello_world(request):
"""
一个简单的视图函数。
它接收一个 HttpRequest 对象,返回一个 HttpResponse 对象。
"""
return HttpResponse("<h1>Hello, Django World!</h1><p>这是我的第一个Django页面。</p>")
request 对象包含了所有关于本次 HTTP 请求的信息(如 URL、参数、头信息等)。
步骤 5:配置 URL 路由
将 URL 与视图函数关联起来。
首先,在 blog/ 目录下创建一个新文件 urls.py:
# blog/urls.py
from django.urls import path
from . import views # 从当前目录导入 views 模块
urlpatterns = [
# 当访问路径为空字符串时,调用 views.hello_world 函数
path('', views.hello_world, name='hello_world'),
]
然后,将这个应用的 URL 配置包含到项目的总配置中。编辑 mysite/urls.py:
# mysite/urls.py
from django.contrib import admin
from django.urls import path, include # 新增导入 include
urlpatterns = [
path('admin/', admin.site.urls), # Django 自带管理后台
path('blog/', include('blog.urls')), # 将所有以 `blog/` 开头的 URL 交给 blog 应用的 urls.py 处理
]
这样,当用户访问 http://localhost:8000/blog/ 时,就会被导向到 blog 应用的 hello_world 视图。
步骤 6:启动开发服务器
现在,启动 Django 内置的开发服务器来查看结果。
python manage.py runserver
你将看到类似输出:
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
在浏览器中打开 http://127.0.0.1:8000/blog/,你将看到 "Hello, Django World!" 的页面。🎉
实践练习
练习 1:基础搭建
- 创建一个名为
portfolio的新 Django 项目。 - 在其中创建一个名为
homepage的应用。 - 在
homepage的视图中创建一个函数about_me,返回包含你自我介绍的简单 HTML。 - 配置 URL,使得访问
http://127.0.0.1:8000/about/时显示该页面。 - 启动服务器并验证。
预期输出:访问 /about/ 路径时,浏览器显示你的自我介绍内容。
练习 2:多视图路由
在练习 1 的基础上:
- 在
homepage视图中增加一个新函数my_projects,返回一个包含项目列表的 HTML(可以用无序列表<ul><li>...</li></ul>)。 - 配置新的 URL 路由,使得
/projects/路径指向这个新视图。 - 确保根路径
/也能正常工作(例如,重定向到/about/或显示欢迎页)。
预期输出:
- 访问
/about/:显示自我介绍。 - 访问
/projects/:显示项目列表。 - 访问
/:显示欢迎信息或跳转。
练习 3:探索项目结构(探究型)
- 尝试修改
mysite/settings.py中的TIME_ZONE配置项,将其改为'Asia/Shanghai'。 - 重启开发服务器(在终端按
Ctrl+C停止,然后重新运行python manage.py runserver)。 - 观察终端输出的时间日志格式是否有变化。
- 思考:如果我想让网站在后台显示"网站正在维护",我应该如何快速实现?(提示:修改
settings.py中的一个特定配置)。
预期输出:服务器日志的时间格式符合上海时区,并能回答实现"维护模式"的思路。
常见错误
- 应用名冲突或拼写错误:确保创建的应用名不会与 Python 内置模块或第三方库冲突(如不要命名为
test,django)。在include('blog.urls')和INSTALLED_APPS(下一课会详述) 中引用应用时,确保字符串拼写完全一致。 - 忘记在
settings.py中注册应用:本课示例中,因为我们只是编写视图,还没有创建模型,所以没有演示。但这是一个关键步骤:创建模型后,必须在INSTALLED_APPS列表中添加你的应用名(如'blog.apps.BlogConfig'或'blog'),否则 Django 无法识别该应用提供的模型。 - URL 模式中的斜杠
/:path('blog/', ...)和path('blog', ...)是不同的。前者只匹配/blog/,后者匹配/blog但不匹配/blog/。通常,我们使用带斜杠的版本,并可以设置APPEND_SLASH = True(默认) 来自动补全末尾斜杠。 - 视图函数缺少
request参数:所有视图函数必须接收request作为第一个参数,即使函数内部不使用它。 - 导入错误:检查视图和 URL 文件中的导入语句是否正确。常见错误如
from . import views写成了import views。
小结
- Django 定位:一个"电池已包含"的全栈 Web 框架,适合快速开发数据驱动、功能丰富的网站。
- 项目与应用:项目(Project) 是整个网站的配置,应用(App) 是网站中独立的功能模块。一个项目可以包含多个应用。
- 核心命令:
django-admin startproject <项目名>:创建项目。python manage.py startapp <应用名>:创建应用。python manage.py runserver:启动开发服务器。
- 基本流程:
- 创建项目和应用。
- 在应用的
views.py中编写处理请求的视图函数。 - 在应用的
urls.py中配置 URL 与视图的映射关系。 - 将应用的 URL 配置包含到项目的
urls.py中。 - 运行服务器,访问测试。
- 项目结构:理解
manage.py(管理脚本)、settings.py(总配置)、urls.py(路由入口)、views.py(业务逻辑)等关键文件的用途。
你已经迈出了 Django 开发的第一步!下一课,我们将深入 Django 最核心的部分之一——模型(Models) 和强大的 ORM,学习如何用 Python 代码来定义和操作数据库。