在即将开启的 Flask 学习之旅中,为了能够顺利掌握并运用 Flask 进行 Web 开发,您需要具备一定的基础知识,同时了解相应的运行环境。
需要你具备的知识:Python 编程语言、HTML、CSS、HTTP协议、数据库(如:MySQL、MongoDB)
本文所使用的环境:操作系统Windows11专业版、解释器Python-3.13、集成开发环境PyCharm、浏览器Edge
在Pycharm
中创建一个项目名为web_project
,在Pycharm
终端使用以下命令安装 Flask:
pip install flask
或者你也可以指定版本安装
pip install Flask==
将
替换为您想要安装的具体版本号,例如 1.1.2
。
创建一个名为 app.py
的文件,编写以下代码:
from flask import Flask
# 创建 Flask 应用实例
app = Flask(__name__)
# 定义路由和视图函数
@app.route('/')
def hello_world():
return 'Hello, World!'
# 运行应用
if __name__ == '__main__':
app.run(debug=True)
在Pycharm
运行上述代码,控制台输出如下图表示正常运行。
在浏览器中访问http://127.0.0.1:5000/
,将执行hello_world()
函数,你将浏览器中看到 Hello, World!
字样,或者你也可以直接点击上图中的蓝色链接进行访问。
from flask import Flask
:导入 Flask 类。app = Flask(__name__)
:创建一个 Flask 应用实例,__name__
是一个 Python 内建的变量,它的值取决于代码的执行方式。如果模块是作为主程序直接运行,__name__
的值是 __main__
;如果模块是被导入到其他模块中,__name__
的值是模块的名称。将__name__
传递给Flask
构造函数有几个重要的用途:
通过创建这个 app
对象,后续可以使用它来定义路由、处理请求、设置配置等,从而构建完整的 Web 应用。
@app.route('/')
:这是一个路由的装饰器,用于定义路由。将一个函数与指定的 URL 路径(在这个例子中是 /
,即网站的根路径)关联起来。当用户访问网站的根路径时,Flask 会调用被这个装饰器修饰的函数来处理请求,并返回相应的响应内容给用户。
def hello_world():
:定义一个函数,该函数返回一个字符串 'Hello, World!'
,我们称这个由@app.route()
装饰器修饰的函数为视图函数。
app.run(debug=True)
:用于启动 Flask 应用,debug=True
表示开启调试模式,有以下重要作用:
如果你不想开启调试模式可以不用配置此参数,直接使用app.run()
。
Flask 使用装饰器来定义路由,不同的路由可以对应不同的视图函数。以下是一个示例:
from flask import Flask
app = Flask(__name__)
# 定义根路径的视图函数
@app.route('/')
def index():
return 'This is the index page.'
# 定义/about 路径的视图函数
@app.route('/about')
def about():
return 'This is the about page.'
if __name__ == '__main__':
app.run(debug=True)
在这个示例中,访问 http://127.0.0.1:5000/
会显示 This is the index page.
,访问 http://127.0.0.1:5000/about
会显示 This is the about page.
。
Flask 支持动态路由,允许在路由中使用变量。以下是一个示例:
from flask import Flask
app = Flask(__name__)
# 动态路由,接收一个名为 name 的参数
@app.route('/hello/' )
def hello(name):
return f'Hello, {
name}!'
if __name__ == '__main__':
app.run(debug=True)
在这个示例中,访问 http://127.0.0.1:5000/hello/John
会显示 Hello, John!
。
(1)动态路由还可以支持不同的数据类型:比如整数(
)等,以满足不同的需求。常见支持的数据类型包括:
int
:表示整数。
float
:表示浮点数。
string
:表示字符串(这是默认的数据类型,如果不指定,默认为字符串)。
path
:类似于字符串,但可以包含斜杠 /
(如:/file/
)。请看以下示例:
from flask import Flask
app = Flask(__name__)
@app.route('/file/' )
def show_file(file_path):
return f'您请求的文件路径是: {
file_path}'
if __name__ == '__main__':
app.run(debug=True)
在这个示例中,/file/
是路由定义。当您访问类似于 /file/docs/folder1/file.txt
的 URL 时,docs/folder1/file.txt
都会被作为 file_path
的值传递给 show_file
函数。
(2)自定义转换器:除了内置的数据类型转换器,还可以创建自定义的转换器来满足特定的需求。
from flask import Flask
from werkzeug.routing import BaseConverter
# BaseConverter 类是用于创建自定义路由转换器的基类。
# 自定义转换器,只接受特定格式的手机号码(以 1 开头,后面跟 10 位数字)
class MobileConverter(BaseConverter):
regex = r'1\d{10}'
app = Flask(__name__)
# 注册自定义转换器
app.url_map.converters['mobile'] = MobileConverter
@app.route('/user/' )
def user_info(phone_number):
return f'用户的手机号码是:{
phone_number}'
if __name__ == '__main__':
app.run(debug=True)
在上述示例中,我们创建了一个名为 MobileConverter
的自定义转换器,它的正则表达式 r'1\d{10}'
用于匹配以 1 开头后面跟 10 位数字的手机号码。然后,我们将这个自定义转换器注册到 Flask 的应用中,并在路由中使用 mobile
类型的动态参数 phone_number
。当用户访问符合规则的 URL(例如 /user/13812345678
)时,user_info
函数会被调用,并将匹配到的手机号码作为参数传递给 phone_number
。
app.url_map.converters['mobile'] = MobileConverter
这行代码的主要目的是向 Flask 应用的 URL 映射的转换器集合中添加一个自定义的转换器,并为其指定了一个名称 'mobile'
。具体来说,app.url_map.converters
是一个存储各种转换器的字典。当我们将 MobileConverter
赋值给 ['mobile']
这个键时,就告诉 Flask :在解析路由时,如果遇到形如
的动态路由部分,就使用我们自定义的 MobileConverter
类来处理和转换这个部分的参数。
(3)多个动态参数:可以在一个路由中定义多个动态参数
示例:@app.route('/product/
路由处理函数的参数顺序:当路由中有多个动态参数时,它们在处理函数中的参数顺序必须与在路由定义中的顺序一致。
from flask import Flask
app = Flask(__name__)
@app.route('/book//author//page/' )
def book_info(book_name, author_name, page_number):
return f'您正在查看书籍《{
book_name}》,作者是 {
author_name} ,当前页面是 {
page_number}'
if __name__ == '__main__':
app.run(debug=True)
在这个示例中,/book/
定义了三个动态参数:book_name
(字符串类型)、author_name
(字符串类型)和 page_number
(整数类型)。
当您访问类似于 /book/The_Great_Gatsby/F.Scott_Fitzgerald/10
的 URL 时,book_info
函数会被调用,并且 book_name
的值为 'The_Great_Gatsby'
,author_name
的值为 'F.Scott_Fitzgerald'
,page_number
的值为 10
。
在 Flask 中,视图函数是处理 HTTP 请求并返回响应的函数。视图函数通过 @app.route
装饰器与特定的 URL 路径关联起来。当用户访问对应的 URL 时,Flask 会调用相应的视图函数来生成响应。
from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
return '这是主页'
@app.route('/about')
def about():
return '这是关于页面'
if __name__ == '__main__':
app.run(debug = True)
可以在函数的返回值中嵌入HTML标签,浏览器会自动解析标签。
from flask import Flask
app = Flask(__name__)
@app.route('/login')
def home():
return '''
请输入用户名登录
'''
if __name__ == '__main__':
app.run(debug = True)
常见的请求方法:
GET
:用于从服务器获取资源,通常用于查询操作,不会对服务器上的数据进行修改。它将请求参数附加在 URL 中,数据量有限,且不太安全。POST
:向服务器提交数据,常用于创建或更新资源。数据放在请求体中,更适合发送大量数据和敏感信息。PUT
:用于更新服务器上的资源,要求客户端提供完整的资源数据来替换服务器上的现有数据。DELETE
:用于删除服务器上的指定资源。PATCH
:对资源进行部分更新,只需提供要更改的部分数据。HEAD
:请求方法与 GET
类似,它们的主要区别在于 HEAD
请求只请求资源的首部(headers
),而不请求资源的内容(body
)。这种方法常用于检查资源是否存在、获取资源的缓存信息,或者在下载资源前先了解其基本属性。OPTIONS
:请求方法用于获取关于目标资源所支持的通信选项的信息。客户端可以使用 OPTIONS
请求来查询服务器,了解针对特定资源可以使用哪些 HTTP 方法(如 GET
、POST
、PUT
等),以及服务器支持的其他特性,如跨域资源共享(CORS)相关的信息。在 Flask 中处理:通过 request.method
获取当前请求使用的方法,在定义路由时可通过 methods
参数限定该路由允许的请求方法。
from flask import Flask, request
app = Flask(__name__)
@app.route('/login', methods=['GET', 'POST'])
def login():
method = request.method
if method == 'GET':
return f"这是{
method}请求" + '''
'''
elif method == 'POST':
username = request.form.get('username')
return f"这是{
username}发送的{
method}请求"
if __name__ == '__main__':
app.run(debug = True)
methods=['GET', 'POST']
:指定该路由支持的请求方法,可以指定一个或同时指定多个。request.form.get('username')
:获取 POST 请求中表单数据的name = "username"
的字段。GET
和 POST
,对于其他请求方法,可以使用JavaScript
的fetchAPI
或XMLHttpRequest
对象来发送请求,这里不再给出示例。GET
参数
?param1 = value1¶m2 = value2
。request.args
,它类似字典结构,通过 get
方法获取参数值,可设置默认值以防参数不存在。POST
参数
request.form
,同样类似字典结构,通过 get
方法获取表单参数值。from flask import Flask, request
app = Flask(__name__)
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'GET':
# 获取GET请求中的请求参数
name = request.args.get("name")
age = request.args.get("age")
return '''
请输入用户名登录
'''
elif request.method == 'POST':
# 获取POST请求表单中的数据
username = request.form.get('username')
return f'{
username}用户已登录成功!!'
if __name__ == '__main__':
app.run(debug = True)
http://127.0.0.1:5000/login?name=jone&age=30
便可获取到GET
请求的参数。在 Flask 应用中,使用request.files
来获取上传的文件。每个上传的文件都被表示为一个FileStorage
对象,该对象提供了保存文件等方法。
from flask import Flask, request
app = Flask(__name__)
@app.route('/upload', methods=['GET', 'POST'])
def login():
method = request.method
if method == 'GET':
return '''
'''
elif method == 'POST':
# 检查请求中是否包含名为file的文件部分。如果不存在,返回错误信息和状态码400(表示错误请求)。
if 'file' not in request.files:
return '没有文件部分', 400
file = request.files['file']
# 通过获取文件名称判断否选择文件
if file.filename == '':
return '没有选择文件', 400
if file:
# 这里可以处理文件,例如保存到服务器.可以设置存放路径,没有设置默认项目目录下
file.save(file.filename)
return '文件上传成功'
if __name__ == '__main__':
app.run(debug = True)
包含关于请求的元数据,如客户端信息(User - Agent)、语言偏好(Accept - Language)、认证信息(Authorization)等。通过 request.headers
获取,它是类似字典的结构,可通过键获取对应的值。
获取单个请求头字段
from flask import Flask, request
app = Flask(__name__)
@app.route('/headers')
def get_headers():
user_agent = request.headers.get('User-Agent')
return f'你的客户端是: {
user_agent}'
if __name__ == '__main__':
app.run(debug = True)
获取所有请求头
from flask import Flask, request
app = Flask(__name__)
@app.route('/all_headers')
def get_all_headers():
headers = ""
for key, value in request.headers.items():
headers += f"{
key}: {
value}
"
return headers
if __name__ == '__main__':
app.run(debug=True)
包含请求携带的数据,格式多样,如表单数据、JSON
数据、XML
数据或二进制数据等。使用 request.get_data()
方法获取原始字节数据,对于特定格式数据,有专门方法,如 request.get_json()
用于JSON
数据。以下是一个使用HTML发送JSON
数据,然后使用request.get_json()
获取请求中JSON
数据,然后返回响应数据仍以JSON
格式返回的示例。
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>
b