Django 的完整工作流程梳理
Django 是一个功能强大且灵活的 Python Web 框架。最近在搞一个简单的抽奖页面制作,以下将从安装 Django 开始,梳理整个工作流程,包括Django安装、应用的创建、 URL 路由、视图函数、模板渲染等概念的理解和作用,都进行了简短的分析,让初学者能快速理解其整个实现的流程和需要注意的操作规范。
1. 安装 Django
在安装 Django 之前,建议创建虚拟环境来隔离项目的依赖,但是我觉得还是使用pycharm,很简单的就可以完成操作了。
# 方法1
# 创建虚拟环境---指令的操作---个人不是很建议使用这个方法
python -m venv myvenv
# 激活虚拟环境 (Windows)
myvenv\Scripts\activate
# 或 (Linux/macOS)
source myvenv/bin/activate
# 安装 Django
pip install django
# 方法2----强烈推荐
# 在pycharm中, 文件----> 设置 ------> 项目 -----> Python解释器新建一个解释器----->Python版本就根据自己的需要进行选择即可
# 新建好后,此时就相当于有了一个新的虚拟环境了,可以在Python的终端中,打开(command Prompt)
# 此时可以用指令进行 安装 Django, 当然也可以通过设置的方式,直接在新建成功的那个环境界面点+号进行安装
pip install django
2. 创建 Django 项目
Django 项目是一个完整的 Web 应用,包含配置文件和多个子应用,第一步,先创建一个新的Django项目。
# 创建一个新的 Django 项目---直接pycharm终端运行即可(注意环境选中新建的那个)
django-admin startproject myproject2
# 进入项目目录
cd myproject
3. 创建 Django 应用
Django 项目可以包含多个应用,每个应用处理一个独立的功能模块,并且Django 的默认结构是将每个应用单独放在项目根目录下,与主项目目录(例如 myproject/)平级。每个应用都作为一个独立的模块,具有自己的视图、模型、模板和静态资源等。没有必要将所有应用集中到一个特定的目录中。。
# 创建新的 Django 应用----一定要cd到manage.py的目录下
python manage.py startapp myapp
创建后,需要在 Django 项目中注册这个应用,否则 Django 不会识别它。
在 myproject/settings.py 文件中找到 INSTALLED_APPS 部分,将 myapp 添加进去。具体操作如下:
# myproject/settings.py
INSTALLED_APPS = [
# Django 自带的应用
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# 自己创建的应用
'myapp', # 注册你的抽奖应用
]
这样 Django 就知道需要加载并处理你定义的 myapp 应用了。
4. 配置数据库
在 settings.py
中配置数据库。默认使用 SQLite,无需额外配置。
如果你使用的是默认的 SQLite3 数据库,那么在 Django 的 settings.py 文件中,默认已经配置好了相关的数据库设置。因此你无需额外配置或修改 DATABASES 字段。数据库相关的配置在 DATABASES
字段中。
# myproject/settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
5. 定义模型(数据库表)
在 Django 中,模型是与数据库交互的核心。你可以通过定义模型来设计数据库的表结构。
Django 通过 MVT 模型组织代码,以简化和清晰地进行 Web 开发。模型(Model) 是 MVT 模式中的一个重要部分,负责处理与数据库的交互,包括数据的存储、读取、更新和删除。
以抽奖记录表为例:
# myapp/models.py
from django.db import models
# 套餐抽奖记录表 (PackageDrawRecord)
class PackageDrawRecord(models.Model):
user_name = models.CharField(max_length=100) # 用户名
package_type = models.CharField(max_length=50) # 套餐类型,如"9.9套餐"、"19.9套餐"
prize = models.CharField(max_length=100) # 奖项名称,如"一等奖"
draw_date = models.DateField() # 抽奖日期
is_shipped = models.BooleanField(default=False) # 发货状态:是否发货
def __str__(self):
return f'{self.user_name} - {self.package_type} - {self.prize}'
当然,如果你对这部分不懂,其实问题也不大,我们也可以采用AI工具帮我们进行相关的生成,这个如有需要可以再联系我进行指导~
6. 迁移模型到数据库
定义好模型后,需要将模型迁移到数据库中。这是 Django 自动生成 SQL 并应用到数据库的过程。
# 创建迁移文件
python manage.py makemigrations
# 应用迁移,创建数据库表
python manage.py migrate
这里如果想去查看相对应的数据库结构及内容,可以直接用pycharm自带的工具查看,或者安装下面的这个工具也可以
下载链接-点击
7. 配置 URL 路由
Django 的 URL 路由机制将 URL 请求分发到对应的视图函数。我们在 urls.py
文件中配置路由。
# myproject/urls.py
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('myapp.urls')), # 将所有根路径交由 `myapp` 处理
]
# myapp/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.home, name='myapp'), # 配置主页
path('result/', views.result, name='result'), # 配置结果页
# name` 参数的作用 为 URL 模式提供了一个名称,方便我们在模板中通过 `{% url 'myapp' %}` 来反向解析该 URL,无需硬编码 URL。
]
8. 创建视图函数
视图函数负责处理逻辑和渲染 HTML 页面。
# myapp/views.py
from django.shortcuts import render
def home(request):
context = {'welcome_message': '欢迎来到抽奖系统'}
return render(request, 'myapp/home.html', context) # 渲染模板并传参
def result(request):
# 假设你从某处获取了奖项名称,如从数据库或抽奖逻辑中获取
prize_name = "一等奖"
# 将 prize_name 传递给模板
context = {'prize_name': prize_name}
return render(request, 'myapp/result.html',context)
9. 创建模板
模板文件夹默认放置在 app_name/templates/app_name/
中。可以在模板中使用 Django 模板语言来动态生成内容。
<!-- myapp/templates/myapp/home.html -->
<!DOCTYPE html>
<html>
<head>
<title>抽奖页面</title>
</head>
<body>
<h1>{{ welcome_message }}</h1> <!-- 显示传入的参数 -->
<a href="{% url 'result' %}">查看抽奖结果</a> <!-- 通过 name 属性反向解析 URL -->
</body>
</html>
<!-- myapp/templates/myapp/result.html -->
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>抽奖结果</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 0;
background-color: #f4f4f9;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
}
.container {
background-color: white;
padding: 20px;
border-radius: 10px;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
text-align: center;
}
h1 {
color: #4CAF50;
}
.prize {
font-size: 1.5em;
color: #333;
}
.button {
margin-top: 20px;
display: inline-block;
padding: 10px 20px;
background-color: #4CAF50;
color: white;
text-decoration: none;
border-radius: 5px;
}
</style>
</head>
<body>
<div class="container">
<h1>抽奖结果</h1>
<p class="prize">恭喜您获得 <strong>{{ prize_name }}</strong>!</p>
<a href="/myapp" class="button">返回抽奖页</a> <!-- 通过 name 属性反向解析 URL -->
</div>
</body>
</html>
10. 启动 Django 项目
一切配置完成后,可以启动 Django 项目。
python manage.py runserver
在浏览器中打开 http://127.0.0.1:8000/
,你将会看到主页。
11. 数据库操作
在 Django 中,你可以使用 ORM 来操作数据库,如添加、查询、更新和删除数据。
# myapp/views.py
from .models import User
def create_user(request):
# 创建新用户
new_user = User.objects.create(name="张三", email="zhangsan@example.com")
new_user.save()
# 查询用户
user = User.objects.get(name="张三")
# 更新用户信息
user.name = "李四"
user.save()
# 删除用户
user.delete()
return render(request, 'myapp/home.html')
12. 对过程的理解和一些说明
接下来我会更详细地梳理整个过程,包括 URL 解析、视图调用以及模板渲染等步骤,希望能帮助你更加清楚地理解 Django 的请求处理流程。
Django 请求处理流程
-
客户端请求发起:
用户在浏览器中输入一个 URL 地址,向服务器发起 HTTP 请求,比如http://127.0.0.1:8000/generate/
。 -
主路由
urls.py
文件:
Django 的urls.py
文件位于项目的主目录下(如myproject/urls.py
),负责处理所有进入的请求。它根据请求的 URL,将其分发给不同的应用。示例:
myproject/urls.py
from django.contrib import admin from django.urls import include, path urlpatterns = [ path('admin/', admin.site.urls), path('generate/', include('generate_prizes_app.urls')), # 发送到 `generate_prizes_app` path('draw/', include('draw_app.urls')), # 发送到 `draw_app` ]
path('generate/', include('generate_prizes_app.urls'))
的作用是将所有以/generate/
开头的 URL 请求转发给generate_prizes_app
应用的urls.py
处理。
-
应用内的
urls.py
文件:
每个 Django 应用都会有一个自己的urls.py
文件,用来定义应用内部的 URL 路由。它会根据具体的 URL 地址找到对应的视图函数(views)进行处理。示例:
generate_prizes_app/urls.py
from django.urls import path from . import views urlpatterns = [ path('', views.generate_prizes, name='generate_prizes'), # 处理 /generate/ path('result/', views.result_view, name='result'), # 处理 /generate/result/ ]
path('', views.generate_prizes, name='generate_prizes')
表示/generate/
对应视图函数generate_prizes
,这个函数负责处理这个 URL 请求。path('result/', views.result_view, name='result')
表示/generate/result/
对应视图函数result_view
,处理这个 URL 请求。
-
视图函数 (
views.py
):
当 Django 找到对应的 URL 路径后,会调用指定的视图函数来处理请求。视图函数的作用是接收请求,处理业务逻辑,并决定返回什么样的响应。示例:
generate_prizes_app/views.py
from django.shortcuts import render def generate_prizes(request): # 处理生成奖项的业务逻辑 return render(request, 'generate_prizes_app/home.html') # 渲染页面并返回 def result_view(request): # 处理显示抽奖结果的业务逻辑 return render(request, 'generate_prizes_app/result.html') # 渲染抽奖结果页面
generate_prizes
函数通过render
函数渲染generate_prizes_app/home.html
页面。result_view
函数渲染generate_prizes_app/result.html
页面。
-
模板渲染 (
templates
):
render(request, 'generate_prizes_app/home.html')
函数会寻找模板文件夹下的home.html
文件,并将其渲染为 HTML 页面返回给用户。模板目录结构:
generate_prizes_app/ ├── templates/ │ └── generate_prizes_app/ │ ├── home.html # 生成奖项的页面 │ └── result.html # 显示抽奖结果的页面
在视图函数中,
render
函数接收两个参数:request
:请求对象。'generate_prizes_app/home.html'
:模板路径。
这表示 Django 将从
templates
文件夹中寻找home.html
并将其渲染为 HTML 页面返回。 -
响应返回给客户端:
最终,Django 会将渲染后的 HTML 作为响应返回给浏览器,用户就可以看到生成的页面了。
URL 解析与渲染流程总结
-
请求进入 Django 项目,主路由
myproject/urls.py
检查请求路径/generate/
并将其转发给应用generate_prizes_app
的urls.py
。 -
应用路由
generate_prizes_app/urls.py
根据具体的路径/generate/
和/generate/result/
,决定调用哪个视图函数。 -
视图函数 (
views.py
) 负责处理请求的业务逻辑,使用render
函数来渲染相应的 HTML 模板。 -
模板引擎 根据模板路径加载对应的 HTML 文件,将模板中的动态数据与 HTML 结合,生成完整的页面。
-
Django 返回响应,最终 HTML 页面返回给客户端,用户在浏览器中看到渲染结果。
操作注释:
- 虚拟环境:使用虚拟环境隔离项目的依赖,避免与系统中的其他 Python 库产生冲突。
- 应用结构:每个应用处理一个独立功能模块。通过
urls.py
管理 URL 路由,views.py
处理请求,models.py
定义数据库结构。 - 数据库迁移:使用
makemigrations
和migrate
命令管理数据库表的创建和修改。 - 模板渲染:通过
render
函数渲染 HTML 页面,并传递动态数据。
希望这份文档能够帮助你更加清晰地理解 Django 请求处理、URL 路由、视图函数和模板渲染的整个过程。