三、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 方法

在路由中,可以指定支持的 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 对象)传递给视图函数,以便在视图函数中访问请求的数据。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值