Day08-Flask 或 Django 简介:构建 Web 应用程序
Flask 或 Django 简介:构建 Web 应用程序
网络开发领域提供了丰富的工具和框架,而 Python 作为一门多功能的语言,在构建健壮且可扩展的 Web 应用方面脱颖而出。本课程将作为你使用 Python 进行 Web 开发的入门指南,特别聚焦于两个流行的框架:Flask 和 Django。我们将探讨这些框架背后的基本概念,为你创建动态 Web 应用和 RESTful API 奠定基础。理解这些框架对于将 AI 模型集成到 Web 应用中至关重要,这是全栈 AI 开发的关键环节。
Web 框架简介:Flask 和 Django
Web 框架为构建 Web 应用程序提供结构,简化了路由、模板和数据库交互等常见任务。它们提供预构建的组件和工具,使开发者能够专注于应用程序的独特功能,而不是重新发明轮子。Flask 和 Django 是两个最流行的 Python Web 框架,每个都有其自身的优势和适用场景。
Flask:一个微框架
Flask 通常被描述为一个微框架,因为它只提供了构建 Web 应用所需的必要工具和库。它轻量级、灵活,并赋予开发者对其使用结构和组件的高度控制。
-
Flask 的主要功能:
- 轻量级和灵活: Flask 的极简设计允许开发者选择他们需要的组件,使其非常适合小型项目或具有特定需求的应用。
- 路由: Flask 的路由系统允许你将 URL 映射到特定的函数,从而轻松定义应用程序的不同端点。
- 模板化: Flask 使用 Jinja2 作为其默认模板引擎,允许您通过在模板中嵌入 Python 代码来创建动态 HTML 页面。
- WSGI 兼容性: Flask 是一个符合 WSGI(Web 服务器网关接口)规范的框架,这意味着它可以在多种 Web 服务器上部署。
- 可扩展: Flask 的扩展系统允许您轻松地为应用程序添加功能,例如数据库集成、身份验证等。
示例: 想象一下你正在构建一个简单的个人网站。Flask 的轻量级特性让你能够快速为你的主页、关于页面和联系表单设置路由,而无需承担大型框架的额外负担。
反例: 如果你正在构建一个具有复杂用户管理、订单处理和产品目录的大型电子商务平台,与 Django 相比,Flask 可能需要更多的手动配置和外部库的集成。
Django:一个功能完备的框架
Django 是一个高级的 Python Web 框架,为构建复杂的 Web 应用程序提供了一套全面的工具和功能。它遵循“开箱即用”的理念,为用户认证、数据库管理和表单处理等常见任务提供了内置组件。
-
Django 的主要功能:
- ORM(对象关系映射器): Django 的 ORM 允许你使用 Python 代码与数据库交互,抽象了 SQL 的复杂性。
- 管理界面: Django 会自动生成一个管理界面,用于管理应用程序的数据,使创建、读取、更新和删除记录变得容易。
- 安全特性: Django 包含内置的安全特性,例如防范跨站脚本(XSS)、跨站请求伪造(CSRF)和 SQL 注入。
- 模板引擎: Django 有自己的模板引擎,它类似于 Jinja2,但有一些 Django 特有的功能。
- 可扩展性: Django 被设计用来处理大量的流量和数据,因此它适合构建可扩展的 Web 应用程序。
示例: 考虑构建一个社交网站。Django 的内置用户认证、数据库管理和安全功能将显著加快开发速度,并为复杂应用程序提供一个坚实的基础。
反例: 如果你正在创建一个功能简单、单页面的应用程序,Django 的丰富功能可能会过于繁琐,而 Flask 可能是一个更合适的选择。
在 Flask 和 Django 之间进行选择
Flask 和 Django 之间的选择取决于你项目的具体需求。
特性 | Flask | Django |
---|---|---|
尺寸 | 微型框架 | 功能全面的框架 |
学习曲线 | 初始学习更简单 | 学习曲线更陡峭 |
灵活性 | 高度灵活,更多控制 | 灵活性较低,更具主观性 |
内置功能 | 极简,需要更多扩展 | 许多内置功能 |
用例 | 中小型应用程序,API | 大型复杂应用程序,内容管理系统 |
假设场景: 你需要构建一个简单的 API 端点,从传感器接收数据并将其存储在数据库中。Flask 的简单性和灵活性使它成为这项任务的理想选择。你可以快速设置一个路由,使用 SQLAlchemy(我们稍后会介绍)连接到数据库,并处理数据。
设置开发环境
在开始使用 Flask 或 Django 构建 Web 应用程序之前,你需要设置一个开发环境。这通常涉及安装 Python、创建虚拟环境以及安装必要的包。
安装 Python
如果你还没有安装 Python,可以从官方 Python 网站(https://www.python.org/downloads/)下载。确保下载最新版的稳定版 Python 3。
创建虚拟环境
虚拟环境是一个自包含的目录,其中包含特定的 Python 解释器以及为特定项目安装的任何包。这有助于将您项目的依赖项与其他项目以及系统范围的 Python 安装隔离开来。
要创建虚拟环境,您可以使用 Python 3 自带的 venv
模块。
python3 -m venv venv
此命令在名为 venv
的目录中创建一个虚拟环境。
要激活虚拟环境,请使用以下命令:
-
在 macOS 和 Linux 上:
source venv/bin/activate
-
在 Windows 上:
venv\Scripts\activate
虚拟环境激活后,您的 shell 提示符将带有环境的名称作为前缀(例如,(venv)
)。
安装 Flask 或 Django
虚拟环境激活后,您可以使用 Python 包管理器 pip 安装 Flask 或 Django。
-
要安装 Flask:
pip install flask
-
要安装 Django:
pip install django
构建一个简单的"Hello, World!"应用程序
让我们使用 Flask 和 Django 创建一个基本的"Hello, World!"应用程序,以说明每个框架的基本概念。
Flask “你好,世界!”
-
创建一个名为
app.py
的文件:from flask import Flaskapp = Flask(__name__)@app.route('/') def hello_world():return 'Hello, World!'if __name__ == '__main__':app.run(debug=True)
解释:
from flask import Flask
: 从 flask 包中导入 Flask 类。app = Flask(__name__)
: 创建 Flask 类的实例。__name__
参数是一个特殊的 Python 变量,表示当前模块的名称。@app.route('/')
: 这是一个装饰器,告诉 Flask 哪个 URL 应该触发我们的函数。在这种情况下,/
URL(根 URL)将触发hello_world()
函数。def hello_world():
: 当访问/
URL 时,这个函数会被调用。它返回字符串 ‘Hello, World!’,这个字符串将在浏览器中显示。if __name__ == '__main__':
: 这是一个标准的 Python 惯用法,确保只有在脚本直接运行时(而不是作为模块导入时)才会执行app.run()
这一行。app.run(debug=True)
: 启动 Flask 开发服务器。参数debug=True
启用调试模式,提供有用的错误信息,并在你修改代码时自动重新加载服务器。
-
运行应用程序:
python app.py
这将启动 Flask 开发服务器。打开你的网页浏览器并前往
http://127.0.0.1:5000/
(或终端中显示的地址)。你应该能看到"Hello, World!"消息。
Django “你好,世界!”
-
创建一个新的 Django 项目:
django-admin startproject helloworld cd helloworld
这会创建一个名为
helloworld
的新 Django 项目。 -
创建一个新的 Django 应用:
python manage.py startapp hello
这会创建一个名为
hello
的新 Django 应用。 -
编辑
helloworld/settings.py
:在
INSTALLED_APPS
列表中添加'hello'
:INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','hello', # Add this line ]
-
创建一个名为
hello/views.py
的文件:from django.http import HttpResponsedef hello_world(request):return HttpResponse("Hello, World!")
解释:
from django.http import HttpResponse
: 导入HttpResponse
类,该类用于向客户端发送 HTTP 响应。def hello_world(request):
: 当我们下一步定义的 URL 收到请求时,这个函数会被调用。它接受一个request
对象作为参数,该对象包含了关于请求的信息。return HttpResponse("Hello, World!")
: 这行代码创建了一个HttpResponse
对象,其内容为字符串"Hello, World!",并将其返回。这将作为发送给浏览器的响应。
-
创建一个名为
hello/urls.py
的文件:from django.urls import path from . import viewsurlpatterns = [path('', views.hello_world, name='hello_world'), ]
解释:
from django.urls import path
: 导入path
函数,该函数用于定义 URL 模式。from . import views
: 从当前目录(即hello
应用)导入views
模块。urlpatterns = [...]
: 这个列表定义了hello
应用的 URL 模式。path('', views.hello_world, name='hello_world')
: 这行代码定义了一个 URL 模式,将根 URL(''
)映射到hello_world
视图函数,该函数位于views
模块中。name
参数用于为 URL 模式命名,该名称可用于在模板和其他代码部分中引用它。
-
编辑
helloworld/urls.py
:包含
hello
应用的 URLs:from django.contrib import admin from django.urls import include, pathurlpatterns = [path('admin/', admin.site.urls),path('', include('hello.urls')), # Add this line ]
解释:
from django.urls import include, path
: 导入include
函数,用于包含其他应用中的 URL 模式。path('', include('hello.urls'))
: 这行代码包含了在hello/urls.py
文件中定义的 URL 模式。这意味着所有以/
开头的 URL 都将由hello
应用处理。
-
运行迁移:
python manage.py migrate
此命令应用任何待处理的数据库迁移。由于我们尚未定义任何模型,这将仅创建默认的 Django 表。
-
运行开发服务器:
python manage.py runserver
这将启动 Django 开发服务器。打开你的网页浏览器并前往
http://127.0.0.1:8000/
。你应该能看到"Hello, World!"的消息。
路由和 URL 处理
路由是将 URL 映射到 Web 应用程序中特定函数或视图的过程。Flask 和 Django 都提供了定义路由和处理 URL 参数的机制。
Flask 路由
在 Flask 中,你使用 @app.route()
装饰器来定义路由。该装饰器以一个 URL 模式作为参数,并将其与一个函数关联起来。
from flask import Flaskapp = Flask(__name__)@app.route('/')
def index():return 'Index Page'@app.route('/hello')
def hello():return 'Hello, World'@app.route('/user/<username>')
def show_user_profile(username):# show the user profile for that userreturn f'User {username}'@app.route('/post/<int:post_id>')
def show_post(post_id):# show the post with the given id, the id is an integerreturn f'Post {post_id}'
解释:
@app.route('/')
: 将根 URL(/
)映射到index()
函数。@app.route('/hello')
: 将/hello
URL 映射到hello()
函数。@app.route('/user/<username>')
: 将类似/user/john
或/user/jane
的 URL 映射到show_user_profile()
函数。<username>
部分是一个变量,将被作为参数传递给函数。@app.route('/post/<int:post_id>')
: 将类似/post/123
或/post/456
的 URL 映射到show_post()
函数。其中<int:post_id>
部分是一个变量,它将被作为整数参数传递给该函数。而int:
部分则指定该变量应为整数。
Django URL 处理
在 Django 中,你使用 urls.py
文件中的 path()
函数来定义 URL 模式。path()
函数接受一个 URL 模式、一个视图函数和一个可选的名称作为参数。
from django.urls import path
from . import viewsurlpatterns = [path('', views.index, name='index'),path('hello/', views.hello, name='hello'),path('user/<str:username>/', views.show_user_profile, name='show_user_profile'),path('post/<int:post_id>/', views.show_post, name='show_post'),
]
解释:
path('', views.index, name='index')
: 将根 URL(/
)映射到index
视图函数。path('hello/', views.hello, name='hello')
: 将/hello/
URL 映射到hello
视图函数。path('user/<str:username>/', views.show_user_profile, name='show_user_profile')
: 将类似/user/john/
或/user/jane/
的 URL 映射到show_user_profile
视图函数。其中<str:username>
部分是一个变量,将被作为字符串参数传递给该函数。path('post/<int:post_id>/', views.show_post, name='show_post')
: 将类似/post/123/
或/post/456/
的 URL 映射到show_post
视图函数。<int:post_id>
部分是一个变量,它将被作为整数参数传递给该函数。
模板化
模板化允许您通过在模板中嵌入 Python 代码来创建动态 HTML 页面。Flask 和 Django 都有自己的模板引擎。
Flask 模板(Jinja2)
Flask 使用 Jinja2 作为其默认模板引擎。Jinja2 允许你在模板中使用变量、循环和条件语句。
-
在您的
templates
文件与app.py
文件相同的目录下创建一个名为templates
的目录。 -
在
templates
目录下创建一个名为index.html
的文件:<!DOCTYPE html> <html> <head><title>Flask Template Example</title> </head> <body><h1>Hello, {{ name }}!</h1><p>Welcome to my website.</p> </body> </html>
解释:
{{ name }}
: 这是一个 Jinja2 变量,它将被从 Python 代码中传递过来的name
变量的值所替换。
-
修改你的
app.py
文件:from flask import Flask, render_templateapp = Flask(__name__)@app.route('/template/<name>') def index(name):return render_template('index.html', name=name)if __name__ == '__main__':app.run(debug=True)
解释:
from flask import Flask, render_template
: 导入render_template
函数,该函数用于渲染 Jinja2 模板。return render_template('index.html', name=name)
: 这行代码渲染了index.html
模板,并将name
变量传递给模板。
-
运行应用程序:
python app.py
打开你的网页浏览器并前往
http://127.0.0.1:5000/template/John
。你应该能看到 “Hello, John!” 的消息。
Django 模板
Django 有自己的模板引擎,它类似于 Jinja2,但有一些 Django 特有的功能。
-
在你的
hello
应用目录中创建一个名为templates
的目录。 -
在
templates
目录下创建一个名为index.html
的文件:<!DOCTYPE html> <html> <head><title>Django Template Example</title> </head> <body><h1>Hello, {{ name }}!</h1><p>Welcome to my website.</p> </body> </html>
解释:
{{ name }}
: 这是一个 Django 模板变量,它将被从 Python 代码中传递过来的name
变量的值所替换。
-
修改你的
hello/views.py
文件:from django.shortcuts import renderdef index(request, name):return render(request, 'index.html', {'name': name})
解释:
from django.shortcuts import render
: 导入render
函数,该函数用于渲染 Django 模板。return render(request, 'index.html', {'name': name})
: 这行代码渲染了index.html
模板,并将name
变量传递给模板。
-
修改你的
hello/urls.py
文件:from django.urls import path from . import viewsurlpatterns = [path('template/<str:name>/', views.index, name='index'), ]
-
运行开发服务器:
python manage.py runserver
打开你的网页浏览器并前往
http://127.0.0.1:8000/template/John/
。你应该能看到 “Hello, John!” 的消息。