当前位置:   article > 正文

【Flask 系统教程 2】路由的使用

【Flask 系统教程 2】路由的使用

Flask 是一个轻量级的 Python Web 框架,其简洁的设计使得构建 Web 应用变得轻而易举。其中,路由是 Flask 中至关重要的一部分,它定义了 URL 与视图函数之间的映射关系,决定了用户请求的处理方式。在本文中,我们将深入探讨 Flask 路由的多种用法,包括创建路由、经典路由、动态路由等。

创建路由

在 Flask 中,通过装饰器 @app.route() 可以轻松地创建路由。下面是一个简单的示例:

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return 'Hello, Flask!'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

上述代码中,@app.route('/') 表示将 URL / 映射到了名为 index 的视图函数上,当用户访问根目录时,将会返回 ‘Hello, Flask!’。


使用add_url_rule创建路由

在 Flask 中,除了使用装饰器 @app.route 来定义路由外,你还可以使用 add_url_rule 方法来手动添加路由。add_url_rule 方法允许你在 Flask 应用中动态地添加路由规则,这在一些特定场景下可能会很有用,例如在运行时根据配置信息添加路由。

  • 语法如下:
app.add_url_rule(rule, endpoint=None, view_func=None, **options)
  • 1
  • rule:URL 规则,即路由的路径。
  • endpoint:端点名称,选填,用于标识路由(即 url_for函数对应使用的标识名)。
  • view_func:视图函数,处理路由请求的函数。
  • options:其他路由选项,例如 methodsdefaults 等。

  • 示例
from flask import Flask

app = Flask(__name__)

def hello_world():
    return 'Hello, World!'

# 使用 add_url_rule 方法添加路由,并指定支持的请求方法
app.add_url_rule('/', 'hello', hello_world, methods=['GET', 'POST'])

# 如果不设置methods,默认使用GET
if __name__ == '__main__':
    app.run(debug=True)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

在这个示例中,我们首先定义了一个视图函数 hello_world,它返回字符串 'Hello, World!'。然后,我们使用 add_url_rule 方法手动添加了一个路由,将根路径 / 映射到 hello_world 视图函数,并指定了端点名称为 'hello'

  • 注意事项
  • 当使用 add_url_rule 方法手动添加路由时,需要确保视图函数已经定义。
  • 如果你使用了 add_url_rule 方法添加路由,那么你不能再使用 @app.route 装饰器添加相同的路由,否则会出现路由冲突。

经典路由

经典路由即静态路由,它直接将 URL 与视图函数一一对应。例如:

@app.route('/about')
def about():
    return 'About Us'
  • 1
  • 2
  • 3

上述代码中,当用户访问 /about 时,将会触发名为 about 的视图函数,返回 ‘About Us’。

动态路由

动态路由允许在 URL 中包含可变的部分,这使得我们能够处理更加灵活的请求。例如,我们可以接受用户传递的参数:

@app.route('/user/<username>')
def show_user_profile(username):
    return 'User %s' % username
  • 1
  • 2
  • 3

在上述示例中,<username> 表示动态部分,Flask 将会将实际的用户名作为参数传递给视图函数 show_user_profile

给动态路由设定变量类型

默认情况下,动态路由中的变量被视为字符串。但是,我们可以使用 <converter:variable_name> 的语法指定变量的类型。常见的类型包括 intfloatpath 等。

@app.route('/post/<int:post_id>')
def show_post(post_id):
    return 'Post %d' % post_id
  • 1
  • 2
  • 3

上述示例中,<int:post_id> 指定了 post_id 应当是一个整数。

  • converter用于指定变量类型
  • variable_name表示变量名

  • 类型参考表
URL规则描述示例
/user/<string:username>字符串类型。匹配任何字符串,不包括斜杠/user/johndoe
/post/<int:post_id>整数类型。匹配正整数。/post/123
/price/<float:price>浮点数类型。匹配浮点数。/price/9.99
/path/<path:path>路径类型。匹配包含斜杠的字符串。/path/foo/bar
/uuid/<uuid:uuid_value>UUID 类型。匹配 UUID 格式的字符串。/uuid/123e4567-e89b-12d3-a456-426614174000
/any/<any:any_value>任意类型。匹配任何类型的字符串。 /<any(geek,item):tmp>/<int:id>
  • 各种类型参考
from flask import Flask

app = Flask(__name__)


# 字符串类型
@app.route('/user/<string:username>')
def user_profile(username):
    return f'User Profile: {username}'


# 整数类型
@app.route('/post/<int:post_id>')
def show_post(post_id):
    return f'Showing post #{post_id}'


# 浮点数类型
@app.route('/price/<float:price>')
def show_price(price):
    return f'The price is: {price}'


# 路径类型
@app.route('/path/<path:path>')
def show_path(path):
    return f'The path is: {path}'


# UUID类型
@app.route('/uuid/<uuid:uuid_value>')
def show_uuid(uuid_value):
    return f'The UUID is: {uuid_value}'


# 任意类型
@app.route('/<any(geek,item):tmp>/<int:id>')
def get_any(tmp, id):
    if tmp == "geek":
        return f"geek:{id}"
    elif tmp == "item":
        return f"item:{id}"
    else:
        return None


if __name__ == '__main__':
    app.run(debug=True)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49

自定义路由变量类型

除了内置的变量类型外,我们还可以自定义路由变量类型。通过在应用对象上注册转换器,我们可以创建自己的转换逻辑。

import typing as t

from flask import Flask
from werkzeug.routing import BaseConverter

app = Flask(__name__)


# 自定义手机号码类型转换器
class PhoneConverter(BaseConverter):
    regex = "1[1-9]\d{9}"

    def to_python(self, value: str) -> t.Any:
        return int(value)


# 注册自定义手机号码类型转换器
app.url_map.converters['phone'] = PhoneConverter


# 使用自定义手机号码类型转换器的动态路由
@app.route('/phone/<phone:user_phone>')
def user_profile(user_phone):
    return f'你的手机号是: {user_phone}'


if __name__ == '__main__':
    app.run(debug=True)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

自定义类中的 to_python函数决定访问后传入路由对应函数得到的Python对象是什么。

url_for函数

url_for 函数是 Flask 框架提供的一个便捷工具,用于构建 URL。它接受视图函数的名称作为参数,并返回该视图函数对应的 URL。使用 url_for 的主要好处是,它允许您在应用程序中动态地生成 URL,而不必硬编码它们。

下面是 url_for 函数的基本用法:

from flask import Flask, url_for

app = Flask(__name__)

@app.route('/')
def index():
    return 'Hello, World!'

@app.route('/user/<username>')
def profile(username):
    return f'Hello, {username}!'

if __name__ == '__main__':
    with app.test_request_context():
        print(url_for('index'))  # 输出: /
        print(url_for('profile', username='john'))  # 输出: /user/john
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
/
/user/john
  • 1
  • 2

在上面的示例中,当您调用 url_for('index') 时,它会返回根路径 / 对应的 URL。当您调用 url_for('profile', username='john') 时,它会返回匹配 profile 路由规则并传递 username 参数的 URL,例如 /user/john

url_for 还接受其他参数,比如 external_schemeexternal 参数用于生成绝对 URL,而不仅仅是相对路径。_scheme 参数用于指定 URL 的协议(例如 httphttps)。

with app.test_request_context():
    print(url_for('index', _external=True))  # 输出: http://localhost/
  • 1
  • 2
http://localhost/
  • 1

url_for 函数是 Flask 应用程序中非常实用的工具,可以帮助您轻松地构建 URL,使得代码更加清晰和可维护。

结语

通过本文的介绍,我们对 Flask 路由的使用有了更深入的了解。除了基本的路由创建外,我们还学习了如何处理动态路由,以及如何自定义路由变量类型。这些功能使得 Flask 在构建 Web 应用时更加灵活和强大。希望本文对您有所帮助!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/538453
推荐阅读
相关标签
  

闽ICP备14008679号