在 Flask 中,路由(Routing)是将 URL 路径映射到视图函数(View Functions)的过程。这允许 Flask 应用步调知道当接收到某个 URL 请求时应该调用哪个函数来处置惩罚该请求。路由是通过 Flask 应用实例上的装饰器来界说的,最常用的装饰器是 @app.route()。
根本路由
- from flask import Flask
- app = Flask(__name__)
- @app.route('/')
- def home():
- return 'Hello, World!'
- if __name__ == '__main__':
- app.run(debug=True)
复制代码 在这个例子中,@app.route('/') 装饰器将根 URL / 映射到了 home 函数。当 Flask 应用步调接收到对根 URL 的请求时,它将调用 home 函数并返回其相应。
在 Flask 中,动态路由和自界说转换器是两个强大的特性,它们允许你以灵活的方式界说 URL 规则。
动态路由
动态路由是指 URL 规则中包罗变量部分,这些变量部分可以根据请求的现实 URL 来动态地匹配和提取。在 Flask 中,你可以通过在 URL 规则中使用尖括号 <variable_name> 来界说动态路由。默认环境下,变量部分会匹配不包罗斜杠的任意文本(即使用 string 转换器)。
例如:
- @app.route('/user/<username>')
- def user_profile(username):
- # username 会根据请求的 URL 动态地匹配并传递给视图函数
- return f'User Profile for {username}'
复制代码 自界说转换器
固然 Flask 提供了一些默认的转换器(如 string、int、float、path、uuid),但你可能必要更复杂的匹配逻辑。这时,你可以通过继承 werkzeug.routing.BaseConverter 并实现 to_python 和 to_url 方法来创建自界说转换器。
自界说转换器允许你界说变量部分应该如何被解析(to_python)以及如何将变量转换回 URL 的一部分(to_url,尽管在许多环境下可能不必要实现此方法)。
下面是一个自界说转换器的例子,它用于匹配由字母和数字组成的用户名,且长度在 4 到 20 个字符之间:
- from werkzeug.routing import BaseConverter
- from flask import Flask
- class RegexConverter(BaseConverter):
- def __init__(self, url_map, regex):
- super(RegexConverter, self).__init__(url_map)
- self.regex = regex
- def to_python(self, value):
- # 可以在这里进行额外的验证或处理
- return value
- def to_url(self, value):
- # 在这个例子中,我们不需要对值进行任何修改来匹配 URL
- # 但如果有需要,可以在这里进行格式化
- return value
- app = Flask(__name__)
- app.url_map.converters['re'] = RegexConverter
- @app.route('/user/<re(r"^[a-zA-Z0-9]{4,20}$"):username>')
- def user_profile(username):
- return f'User Profile for {username}'
- if __name__ == '__main__':
- app.run(debug=True)
复制代码 在这个例子中,我们界说了一个 RegexConverter 转换器,它继承一个正则表达式作为参数。然后,我们在 Flask 应用中注册了这个转换器,并将其定名为 re。之后,在路由界说中,我们使用 <re("正则表达式"):变量名> 的形式来指定使用我们的自界说转换器。在这个例子中,正则表达式用于匹配由 4 到 20 个字母或数字组成的用户名。
请留意,正则表达式字符串在 re 函数中是一个原始字符串(由 r 前缀标识),这是为了防止 Python 字符串中的反斜杠被解释为转义字符。
路由参数
路由装饰器可以继承额外的参数来修改路由的行为。
- methods:指定该路由相应的 HTTP 方法(如 GET、POST)。
- defaults:为视图函数提供默认值。
- strict_slashes:控制 Flask 是否严格遵照尾随斜杠的规则。
- @app.route('/project/<int:project_id>', methods=['GET', 'POST'])
- def project(project_id):
- # 处理项目 ID 为 project_id 的项目
- return f'Project {project_id}'
- @app.route('/about', strict_slashes=False)
- def about():
- return 'About the site'
复制代码 在这个例子中,project 函数可以处置惩罚对 /project/<project_id> 的 GET 和 POST 请求,其中 <project_id> 被指定为整数类型。about 函数展示了如何设置 strict_slashes=False 来允许 URL 尾随或不尾随斜杠。
url_for 和 redirct 函数
在 Flask 中,url_for 和 redirect 函数常常一起使用,以实现 URL 的动态生成和页面重定向。这两个函数在构建动态和可维护的 Web 应用时非常有效。
url_for
url_for 函数是 Flask 提供的一个用于构建 URL 的工具。它允许你根据端点名(endpoint)和可选的参数来生成 URL。端点名通常是视图函数的名称,但也可以是你在注册蓝图或路由时指定的任何名称。
使用 url_for 的好处之一是它可以根据你的应用配置动态地生成 URL,比如当应用部署在差别的子路径下时。别的,它还可以处置惩罚 URL 编码,确保生成的 URL 是有效的。
redirect
redirect 函数用于将用户重定向到另一个 URL。它继承一个 URL 字符串作为参数,并返回一个 HTTP 重定向相应(通常是 302 状态码)。在 Flask 中,当你想要在用户提交表单后显示一个新的页面,大概在用户未登录时重定向到登录页面时,这个函数非常有效。
联合使用
由于 redirect 必要一个 URL 字符串作为参数,而 url_for 可以动态地生成这个 URL 字符串,因此它们常常一起使用。这样做的好处是,你可以保持 URL 的灵活性和可维护性,因为你可以通过更改路由的端点名或参数来更新 URL,而无需在代码中硬编码 URL 字符串。
下面是一个联合使用 url_for 和 redirect 的示例:
- from flask import Flask, redirect, url_for
- app = Flask(__name__)
- @app.route('/')
- def home():
- # 使用 url_for 生成 /about 的 URL,并将其传递给 redirect 函数
- return redirect(url_for('about'))
- @app.route('/about')
- def about():
- return 'This is the about page'
- if __name__ == '__main__':
- app.run(debug=True)
复制代码 在这个例子中,当用户访问根 URL(/)时,home 视图函数会被调用。它使用 url_for('about') 生成 /about 路由的 URL,并将这个 URL 传递给 redirect 函数。然后,redirect 函数返回一个 HTTP 重定向相应,告诉欣赏器加载 /about 路由对应的页面。
通过这种方式,你可以确保你的 Flask 应用中的 URL 是灵活且易于维护的
请求参数
在 Flask 中,处置惩罚请求参数是一个常见的任务,尤其是在构建 Web 应用步调时。Flask 提供了几种方式来访问请求中的参数,包括查询字符串(query string)、表单数据(form data)、JSON 数据以及文件上传等。这些参数可以通过 Flask 的 request 对象来访问,该对象是 Flask 应用上下文中全局可访问的。
查询字符串参数(Query String Parameters)
查询字符串参数是附加在 URL 后面的键值对,以问号(?)开头,并通过与号(&)分隔。在 Flask 中,你可以使用 request.args.get('key', default) 方法来获取查询字符串参数的值。假如参数不存在,则返回默认值(假如提供的话)。
- from flask import Flask, request
- app = Flask(__name__)
- @app.route('/search')
- def search():
- query = request.args.get('q', '')
- return f'Searching for {query}'
- if __name__ == '__main__':
- app.run(debug=True)
复制代码 表单数据(Form Data)
表单数据通常是通过 HTML 表单提交的,可以是 GET 或 POST 请求。在 Flask 中,你可以使用 request.form['key'] 来获取 POST 请求中的表单数据。假如参数不存在,将会抛出一个 KeyError,因此你可能必要使用 get 方法来制止这种环境。
- from flask import Flask, request
- app = Flask(__name__)
- @app.route('/submit', methods=['POST'])
- def submit_form():
- name = request.form['name']
- return f'Hello, {name}!'
- if __name__ == '__main__':
- app.run(debug=True)
复制代码 JSON 数据
对于 API 来说,JSON 数据是一种常见的请求和相应格式。在 Flask 中,你可以通过 request.json 来获取以 JSON 格式发送的请求体数据。留意,request.json 会自动将 JSON 字符串解析为 Python 字典。
- from flask import Flask, request, jsonify
- app = Flask(__name__)
- @app.route('/data', methods=['POST'])
- def handle_data():
- data = request.json
- return jsonify({'received': data}), 200
- if __name__ == '__main__':
- app.run(debug=True)
复制代码 文件上传
Flask 也支持文件上传。你可以通过 request.files['file'] 来访问上传的文件,其中 'file' 是 HTML 表单中 <input type="file"> 元素的 name 属性值。
- from flask import Flask, request
- import os
- app = Flask(__name__)
- UPLOAD_FOLDER = '/path/to/uploads'
- app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
- @app.route('/upload', methods=['POST'])
- def upload_file():
- if 'file' not in request.files:
- return 'No file part'
- file = request.files['file']
- if file.filename == '':
- return 'No selected file'
- if file:
- filename = file.filename
- file_path = os.path.join(app.config['UPLOAD_FOLDER'], filename)
- file.save(file_path)
- return f'File {filename} uploaded successfully'
- if __name__ == '__main__':
- app.run(debug=True)
复制代码 在处置惩罚请求参数时,请确保你的应用可以大概安全地处置惩罚各种输入,以防止跨站脚本(XSS)、SQL 注入等安全毛病。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |