Flask 路由基础和封装

Flask 路由

Flask中的路由是用来定义应用程序中的 URL 和处理函数之间的映射关系的,而URL则是用户访问应用程序的入口点。通过路由,我们可以将用户访问的 URL 映射到对应的视图函数上,从而实现不同的功能。

一、路由基础

1.定义路由:

我们可以使用 @app.route() 装饰器来定义路由。例如:

python 复制代码
@app.route('/')
def index():
    return 'Hello, World!'

这样就定义了一个根路径 / 对应 index() 视图函数。

2.动态路由:

除了静态路径,Flask还支持动态路径。我们可以在路径中定义变量部分,然后在试图函数中通过参数获取这个动态值,如:

python 复制代码
@app.route('/user/<username>')
def hello_user(username):
   return f'hello {username}!'
3.URL构建:

除了定义路由,我们还可以使用 url_for() 函数根据视图函数名生成相应的URL。

python 复制代码
from flask import Flask,redirect,url_for,render_template
app = Flask(__name__)

@app.route('/admin')
def hello_admin():
    return 'hello admin'

@app.route('/guest/<guest>')
def hello_guest(guest):
    return f'hello {guest} as guest'

@app.route('/user/<name>')
def hello_user(name):
    if name=='admin':
        return redirect(url_for('hello_admin'))
    else:
        return redirect(url_for('hello_guest',guest=name))


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

在上面代码中, url_for('hello_admin') 会生成路径 /adminurl_for('hello_guest',guest=name) 会生成 /guest/<guest>。这样做可以避免在代码中硬编码URL,提高了灵活性和可维护性。

4.URL转换器:

Flask提供了多种URL转换器,如 int、float、path 等,可以用于更复杂的路由需求。

例如: @app.route('/post/<int:post_id>') 表示 post_id 参数必须是整数类型。

5.路由前缀:

有时我们需要为一组相关的路由添加公共的前缀,如 /api/v1/users。

这可以通过使用 Blueprint 实现,在注册Blueprint时指定前缀。

python 复制代码
from flask import Flask, Blueprint
 
# 创建一个Flask应用
app = Flask(__name__)
 
# 创建一个Blueprint对象,并指定一个前缀
blueprint = Blueprint('my_blueprint', __name__, url_prefix='/api/user')
 
# 在这个 blueprint 中定义一个路由
@blueprint.route('/hello')
def hello():
    return 'Hello, World!'
 
# 将 blueprint 注册到应用上
app.register_blueprint(blueprint)
 
if __name__ == '__main__':
    app.run(debug=True)

当你访问/api/user/hello时,会调用hello函数并返回Hello, World!

总之,Flask的路由机制提供了灵活强大的URL管理功能,可以帮助我们高效地组织和管理应用程序的URLs。合理利用路由和URL可以提高代码的可读性、可维护性和可扩展性。

二、路由的封装

对于Flask中的路由,除了直接使用@app.route() 装饰器定义路由外,我们还可以将其进行封装,以提高代码的可读性和可维护性。

一种常见的封装方式是创建一个独立的文件或模块来管理路由,然后在主应用程序中导入并使用。例如:

python 复制代码
# app.py
from flask import Flask
from routes import init_routes

app = Flask(__name__)
init_routes(app)

if __name__ == '__main__':
    app.run()
python 复制代码
# routes.py
from flask import Blueprint, render_template

bp = Blueprint('main', __name__)

@bp.route('/')
def index():
    return render_template('index.html')

@bp.route('/about')
def about():
    return render_template('about.html')

def init_routes(app):
    app.register_blueprint(bp)

在这个例子中:

我们在 routes.py 文件中创建了一个 Blueprint 对象 bpBlueprintFlask 提供的一种组织和管理路由的机制,可以将相关的路由和视图函数封装在一起。

routes.py 中,我们定义了两个路由函数 index()about()

app.py 中,我们导入 init_routes() 函数并调用它,将 app 对象传递给它。这个函数会将 bp Blueprint 注册到 app 上,从而将路由信息与主应用程序关联起来。

这样做的好处是:

将路由相关的代码集中在一个单独的文件或模块中,使得主应用程序更加简洁和可读。

可以在 routes.py 中添加更多的路由和视图函数,而不需要改动 app.py 中的代码。

如果需要对路由进行修改或扩展,只需要在 routes.py 中进行即可,而不会影响主应用程序的其他部分。

这种路由的封装方式是 Flask 开发中常见的一种模式,可以帮助我们更好地组织和管理应用程序的路由逻辑。

相关推荐
乔巴先生244 小时前
LLMCompiler:基于LangGraph的并行化Agent架构高效实现
人工智能·python·langchain·人机交互
程序员码歌4 小时前
明年35岁了,如何破局?说说心里话
android·前端·后端
橙*^O^*安4 小时前
Go 语言基础:变量与常量
运维·开发语言·后端·golang·kubernetes
工程师小星星4 小时前
Golang语言的文件组织方式
开发语言·后端·golang
张子夜 iiii5 小时前
实战项目-----Python+OpenCV 实现对视频的椒盐噪声注入与实时平滑还原”
开发语言·python·opencv·计算机视觉
哈喽姥爷5 小时前
Spring Boot---自动配置原理和自定义Starter
java·spring boot·后端·自定义starter·自动配置原理
Miya_Ye5 小时前
Azure AI-102 自学记录
microsoft·flask·azure
困鲲鲲6 小时前
Flask 核心基础:从 路由装饰器 到 __name__ 变量 的底层逻辑解析
python·flask
njxiejing6 小时前
Python NumPy安装、导入与入门
开发语言·python·numpy
Rhys..6 小时前
Python&Flask 使用 DBUtils 创建通用连接池
开发语言·python·mysql