三、Flask基本内容介绍之路由

简介: 三、Flask基本内容介绍之路由

路由(Routes)

在 Flask 中,路由用于定义 URL 和处理函数之间的映射关系。可以通过装饰器 @app.route() 来定义路由。

from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
    return 'Hello, World!'
@app.route('/about')
def about():
    return 'About page'
if __name__ == '__main__':
    app.run()

在上面的例子中,@app.route(‘/’) 定义了根路径的路由,对应的处理函数是 index(),当用户访问根路径时,将返回 ‘Hello, World!’

类似地,@app.route(‘/about’) 定义了 ‘/about’ 路径的路由,对应的处理函数是 about(),当用户访问 ‘/about’ 时,将返回 ‘About page’。

视图函数(View Functions)

视图函数是路由映射的处理函数,负责处理请求并返回响应。可以使用装饰器 @app.route() 将视图函数与具体的路由关联起来。

from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
    return 'Hello, World!'
@app.route('/user/<username>')
def show_user(username):
    return f'User: {username}'
if __name__ == '__main__':
    app.run()

在上面的例子中,show_user() 是一个视图函数,它接受一个参数 username,可以通过路由中的 部分进行传递。例如,当用户访问 ‘/user/john’ 时,将返回 ‘User: john’。

请求和响应(Request and Response)

Flask 提供了访问请求和生成响应的功能。可以使用全局变量 request 访问当前请求的信息,并使用 return 语句生成响应。

from flask import Flask, request
app = Flask(__name__)
@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        # 进行登录验证等操作
        return 'Login successful!'
    else:
        return 'GET request - show login form'
if __name__ == '__main__':
    app.run()

在上面的例子中,request.form 可以访问 POST 请求中提交的表单数据。根据请求的方法不同,可以执行不同的操作。当请求方法为 POST 时,进行登录验证等操作,并返回 ‘Login successful!’。当请求方法为 GET 时,返回 ‘GET request - show login form’,即显示登录表单。

模板(Templates)

Flask 使用模板引擎来生成动态的 HTML 页面。可以使用 Jinja2 模板语言来编写模板,模板文件通常存放在一个名为 templates 的文件夹中。

from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
    return render_template('index.html', name='John')
if __name__ == '__main__':
    app.run()

在上面的例子中,render_template() 函数用于加载名为 index.html 的模板,并传递参数 name=‘John’ 给模板。模板文件可以包含动态的内容和逻辑,通过模板引擎进行渲染后生成最终的 HTML 页面。

在 index.html 文件中,可以使用模板语法来插入动态数据、循环和条件语句等。

<!DOCTYPE html>
<html>
<head>
    <title>Flask Template Example</title>
</head>
<body>
    <h1>Hello, {{ name }}!</h1>
</body>
</html>

在上面的例子中,{{ name }} 是一个模板变量,将被实际的值替换。在浏览器中访问根路径时,将显示 “Hello, John!”。

以上就是 Flask 中路由、视图函数、请求和响应、模板的基本概念和用法。

路由的详细介绍

当使用 Flask 的路由时,除了基本的路由定义外,还有一些高阶的使用方式可以帮助更灵活地处理请求和构建路由。

动态路由

动态路由允许在路由中使用变量,以便根据变量的不同值执行相应的操作。可以通过在路由规则中使用 <variable_name> 来定义动态路由。对应的变量将作为参数传递给视图函数。

动态路由使用尖括号 < > 来定义可变部分,其中的内容被视为参数名。以下是一个简单的例子。

其中可以嵌套执行。

from flask import Flask
app = Flask(__name__)
@app.route('/user/<username>')
def show_user(username):
    return f'User: {username}'
@app.route('/post/<int:post_id>')
def show_post(post_id):
    return f'Post ID: {post_id}'
if __name__ == '__main__':
    app.run()

在上面的例子中,<username> 和 <post_id> 是动态路由参数。当用户访问 ‘/user/john’ 时,show_user() 视图函数将接收到 username 参数并返回 ‘User: john’。当用户访问 ‘/post/123’ 时,show_post() 视图函数将接收到 post_id 参数并返回 ‘Post ID: 123’。

在路由中,可以指定支持的 HTTP 方法,以限制路由仅响应特定的请求方法。可以通过 methods 参数传递一个包含支持的方法的列表。

from flask import Flask
app = Flask(__name__)
@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        # 处理 POST 请求
        return 'Login successful!'
    else:
        # 显示登录表单
        return 'Please log in'
if __name__ == '__main__':
    app.run()

在上面的例子中,/login 路由仅支持 GET 和 POST 方法。当请求方法为 POST 时,执行登录验证等操作并返回 ‘Login successful!’。当请求方法为 GET 时,返回 ‘Please log in’,即显示登录表单。

URL 构建

Flask 提供了方便的方法来生成 URL,以便在应用中构建链接。可以使用 url_for() 函数根据视图函数的名称和参数生成对应的 URL。

from flask import Flask, url_for
app = Flask(__name__)
@app.route('/')
def index():
    return 'Home Page'
@app.route('/user/<username>')
def show_user(username):
    return f'User: {username}'
@app.route('/post/<int:post_id>')
def show_post(post_id):
    return f'Post ID: {post_id}'
@app.route('/login')
def login():
    return 'Login Page'
if __name__ == '__main__':
    with app.test_request_context():
        print(url_for('index'))            # 输出:/
        print(url_for('show_user', username='john'))    # 输出:/user/john
        print(url_for('show_post', post_id=123))         # 输出:/post/123
        print(url_for('login'))            # 输出:/login

在上面的例子中,url_for() 函数根据视图函数的名称和参数生成对应的 URL。通过传递视图函数的名称和参数,可以轻松地构建出正确的 URL。在上述代码中,url_for() 函数生成了不同视图函数的 URL。输出结果如下:

/
/user/john
/post/123
/login

以上是一些 Flask 路由的高阶使用方式,包括动态路由、HTTP 方法和 URL 构建。这些功能可以帮助您更灵活地处理请求和构建路由,使应用程序更加强大和可扩展。

Flask 的路由系统是其核心功能之一,它负责将请求的 URL 与相应的视图函数进行映射,以便正确地处理请求并生成响应。下面我将深入解析 Flask 路由的工作原理。

装饰器和路由映射

在 Flask 中,使用装饰器 @app.route() 来定义路由。这些装饰器负责将路由规则与对应的视图函数进行关联。当应用接收到一个请求时,Flask 将遍历所有的路由规则,找到与请求 URL 匹配的路由规则,然后调用相应的视图函数来处理该请求。

@app.route('/user/<username>')
def show_user(username):
    return f'User: {username}'

在上面的例子中,@app.route(‘/user/’) 装饰器将 /user/ 这个路由规则与 show_user() 视图函数进行映射。当用户访问 /user/john 时,Flask 将调用 show_user(‘john’) 来处理该请求。

动态路由参数提取

Flask 支持动态路由,允许在路由规则中使用变量。通过在路由规则中使用 <variable_name> 的形式定义动态参数,可以从请求的 URL 中提取相应的值,并作为参数传递给视图函数。

@app.route('/user/<username>')
def show_user(username):
    return f'User: {username}'

在上面的例子中, 是一个动态参数,它将从请求的 URL 中提取出相应的值。当用户访问 /user/john 时,Flask 将调用 show_user(‘john’) 来处理该请求。

HTTP 方法和多路由规则

Flask 路由不仅可以匹配 URL,还可以根据请求的 HTTP 方法进行匹配。可以通过 methods 参数指定视图函数支持的 HTTP 方法。

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        # 处理 POST 请求
        return 'Login successful!'
    else:
        # 显示登录表单
        return 'Please log in'

在上面的例子中,/login 路由规则通过 methods=[‘GET’, ‘POST’] 指定支持 GET 和 POST 方法。当请求方法为 POST 时,执行登录验证等操作并返回 ‘Login successful!’。当请求方法为 GET 时,返回 ‘Please log in’,即显示登录表单。

此外,Flask 还支持在同一个视图函数上定义多个路由规则,以便处理不同的 URL。

@app.route('/')
@app.route('/home')
def home():
    return 'Home Page'

在上面的例子中,home() 视图函数同时定义了两个路由规则:‘/’ 和 ‘/home’。当用户访问这两个 URL 时,都会调用 home() 视图函数来处理请求

URL 构建

Flask 提供了 url_for() 函数用于根据视图函数的名称和参数生成对应的 URL。这样可以避免在代码中直接硬编码 URL,使得 URL 的构建更加灵活和可维护。

@app.route('/user/<username>')
def show_user(username):
    return f'User: {username}'
with app.test_request_context():
    print(url_for('show_user', username='john'))

在上面的例子中,url_for() 函数根据视图函数的名称 ‘show_user’ 和参数 username=‘john’ 生成了 /user/john 的 URL。这样可以确保生成的 URL 与实际路由规则保持一致,避免了硬编码 URL 的问题。

路由的执行顺序

当应用接收到一个请求时,Flask 会按照路由规则的定义顺序逐个匹配请求的 URL。因此,定义路由规则的顺序非常重要。通常,将更具体的路由规则放在前面,将通用的路由规则放在后面,以确保匹配最合适的路由规则。

例如,以下代码中 /user/ 的路由规则应该放在 /user/all 的前面,这样 /user/all 就不会匹配到 /user/。

@app.route('/user/all')
def show_all_users():
    return 'All Users'
@app.route('/user/<username>')
def show_user(username):
    return f'User: {username}
蓝图(Blueprints)

为了组织大型应用程序中的路由,Flask 提供了蓝图(Blueprints)的概念。蓝图允许将路由和视图函数分组到模块化的组件中,以便更好地组织和管理应用的路由。

from flask import Blueprint
auth_bp = Blueprint('auth', __name__)
@auth_bp.route('/login')
def login():
    return 'Login Page'

在上面的例子中,通过创建一个名为 auth_bp 的蓝图,定义了 /login 的路由规则。然后,可以在应用中注册蓝图,将其与特定的 URL 前缀关联起来。

app.register_blueprint(auth_bp, url_prefix='/auth')

上述代码将 auth_bp 蓝图注册到应用中,并将 URL 前缀设置为 /auth。因此,/auth/login 将与 login() 视图函数进行映射。

这是 Flask 路由的深入解析,包括装饰器和路由映射、动态路由参数提取、HTTP 方法和多路由规则、URL 构建、路由的执行顺序以及蓝图的使用。这些知识将帮助您更好地理解 Flask 路由的工作原理

魔改Flask路由

可以顺便魔改一下flask的路由嘛

当然可以!Flask 的路由系统非常灵活,您可以根据自己的需求进行定制和魔改。下面是一个示例,展示了如何自定义 Flask 的路由装饰器,以添加额外的功能或逻辑:

from flask import Flask, request
app = Flask(__name__)
def custom_route(rule, **options):
    def decorator(f):
        endpoint = options.pop('endpoint', f.__name__)
        app.add_url_rule(rule, endpoint, f, **options)
        return f
    return decorator
@custom_route('/hello', methods=['GET'])
def hello():
    name = request.args.get('name', 'Guest')
    return f'Hello, {name}!'
if __name__ == '__main__':
    app.run()

在上述示例中,我们定义了一个名为 custom_route() 的装饰器函数。该装饰器函数接受一个路由规则和其他选项,并返回一个装饰器。装饰器内部使用 app.add_url_rule() 方法来手动添加路由规则和视图函数的映射关系。

使用 @custom_route() 装饰器来定义路由规则时,可以指定额外的选项,例如请求方法(methods)等。在示例中,我们定义了 /hello 路由规则,并限定它只接受 GET 请求。

通过这种方式,您可以自定义路由装饰器,并根据需求添加更多的功能、验证、中间件等。

请注意,在自定义路由装饰器时,需要确保将请求上下文(如 request 对象)传递给视图函数,以便在视图函数中访问请求的数据。

相关文章
|
7月前
|
网络架构 Python
Flask的路由讲解
Flask的路由讲解
76 0
|
6月前
|
Python
Flask三种添加路由的方法
Flask 是一个流行的 Python Web 框架,它提供了多种方法来添加路由。路由是将 URL 映射到特定函数的过程,它是构建 Web 应用程序的基础。本文将介绍 Flask 中几种常用的路由添加方法,并附带代码示例。
90 3
|
6月前
|
API 网络架构 开发者
Flask Web开发基础【路由和Jinja2模板引擎】
# Flask Web开发基础 Flask是轻量级Web框架,专注于核心功能:请求响应、模板渲染和URL路由。本文档介绍了使用Flask的基础知识,包括命令行和Python两种运行模式,以及如何修改入口文件、端口和地址。此外,还讨论了URL路由的概念和其在Flask中的实现,展示了动态路由和多URL绑定的例子。最后,提到了Jinja2模板引擎,解释了其基本语法,并通过电影列表案例展示了如何结合Flask使用模板。
75 1
|
3月前
|
Python
Flask路由
现代Web框架使用路由技术来帮助用户记住应用程序URL。 无需从主页导航即可直接访问所需页面。
44 0
|
6月前
|
开发框架 开发者 Python
使用 Flask 为 Web 应用添加路由
通过学习 Flask 中的视图函数和路由规则,你可以使用 Flask 构建强大的 Web 应用程序并为其添加功能。在 Flask 中,视图函数以 Python 函数的形式定义,每个视图函数都与一个 URL 相关联。在 Flask 中,URL 处理程序被称为视图函数,它们用于响应客户端请求并返回响应。在 Flask 应用程序中,这是可选的。在这里,我们将其命名为 'hello',并将其与 URL '/hello/<name>' 绑定在一起。在上面的示例中,我们使用了默认的视图函数名称 'hello'。
54 2
|
7月前
|
网络架构 Python
在Flask中,如何定义路由并处理HTTP请求的不同方法(GET、POST等)?
【4月更文挑战第25天】在Flask中,使用`@app.route()`装饰器定义路由,如`/hello`,处理GET请求返回&#39;Hello, World!&#39;。通过添加`methods`参数,可处理不同HTTP方法,如POST请求。单一函数可处理多种方法,通过检查`request.method`区分。动态路由使用 `&lt;variable_name&gt;` 传递URL变量到视图函数。这些基础构成处理HTTP请求的Flask应用。
125 1
|
7月前
|
JSON 数据格式 Python
如何在Flask框架中定义路由和处理请求?
【4月更文挑战第18天】在Flask框架中,创建应用实例、定义路由和处理请求涉及5个步骤:1) 导入Flask并实例化应用;2) 使用`app.route()`装饰器定义路由,指定URL和HTTP方法;3) 编写视图函数处理请求逻辑;4) 视图函数返回响应内容,Flask会自动转换格式;5) 用`app.run()`启动服务器。
104 3
|
7月前
|
开发框架 中间件 网络架构
Flask路由机制深度剖析
【4月更文挑战第15天】Flask是一款轻量级Web框架,其路由机制是核心功能之一,负责将URL映射到处理函数。路由通过`@app.route()`装饰器定义,如`@app.route(&#39;/&#39;)`将根URL映射到`index`函数。动态路由如`/user/&lt;username&gt;`允许传入变量,支持`methods`、`defaults`和`strict_slashes`等参数定制行为。Flask还提供多种路由转换器(如`int`、`float`)确保URL参数类型。`url_for()`函数用于动态构建URL。理解这些机制有助于高效构建和扩展Flask Web应用。
|
7月前
|
网络架构 Python
Flask路由与视图:构建你的第一个Web应用
【4月更文挑战第15天】Flask是Python的Web框架,其核心是路由和视图。路由通过`@app.route()`装饰器定义,将URL映射到视图函数。视图函数处理请求并返回响应。动态路由允许URL包含可变部分,如`&lt;username&gt;`,将参数传递给函数。本文通过示例展示了如何创建显示待办事项列表的Web应用,包括定义路由、视图、使用模板以及运行应用。这为基础的Flask应用开发提供了基础。
|
7月前
|
测试技术 Apache 项目管理
软件测试|探索Flask接口路由技术:构建灵活可拓展的Python应用
软件测试|探索Flask接口路由技术:构建灵活可拓展的Python应用