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 开发中常见的一种模式,可以帮助我们更好地组织和管理应用程序的路由逻辑。

相关推荐
kobe_OKOK_4 小时前
DRF接口幂等操作
python·django
SomeB1oody4 小时前
【RustyML入门】6.3. 并行归约
开发语言·后端·机器学习·rust·教程
廿士4 小时前
python脚本使用相关
python
青 春 记 忆4 小时前
零基础入门python19:Flask账本第一步——应用工厂、蓝图和健康检查
python·flask·后端开发
朦胧之4 小时前
Python 后端核心知识
python
Profile排查笔记4 小时前
指纹浏览器哪个好?从 Profile、代理、权限和自动化能力判断是否适合
前端·人工智能·后端·自动化
用户938515635075 小时前
用 AI 结对编程从 0 搭一个"单词后台管理系统":Next.js + Supabase + Drizzle + shadcn/ui 全记录
后端·postgresql·next.js
denggun123455 小时前
yield
前端·数据库·python
爱学习的小邓同学5 小时前
Golang --- (1)第一个Golang程序
开发语言·后端·golang
zx_741484816 小时前
【Python 入门】面向对象基础:类、对象、成员变量与构造方法
开发语言·python