如何在装饰器中传递其他函数的关键字参数并解决缩进错误
错误原因
你当前的代码存在两个层面的问题,直接触发语法报错:
- Python语法规则要求,装饰器(也就是你写的
@app.route('/home/reach_truck'))声明之后,必须紧跟缩进层级的被装饰对象定义(函数定义def xxx()或者类定义class xxx()),你在装饰器下方直接写裸的函数调用machines('Reach Truck'),完全不符合装饰器的语法要求,自然抛出缩进/语法错误。 - Flask框架的路由逻辑要求,每个
@app.route装饰器必须绑定一个可调用的处理函数,用户访问对应URL时,Flask才会调用该函数生成响应。你直接在装饰器下写函数调用,既没有完成路由和处理逻辑的绑定,代码还会在Flask应用启动阶段就执行一次,而非用户访问时执行,完全不符合接口运行逻辑。
修复方案
基础修复:路由函数内调用自定义逻辑
最直接的改法是补全路由对应的处理函数,在处理函数内部调用你写好的machines方法并传入指定参数:
import numpy as np from flask import Flask, render_template app = Flask(__name__) # 原有统计逻辑无需改动 def machines(machine_name): rb = np.array(machines_file.loc[machines_file['Machine'].str.contains(machine_name), 'Resolved By']) rb_o = np.count_nonzero(rb == 'Outsource') rb_ih = np.count_nonzero(rb == 'In-House') return render_template('reachtruck.html', outsource=rb_o, inhouse=rb_ih) # 装饰器下紧跟路由处理函数定义 @app.route('/home/reach_truck') def reach_truck_page(): # 在处理函数内调用统计逻辑,传入目标参数 return machines('Reach Truck') if __name__ == '__main__': app.run()
复用优化:路由默认参数适配多场景
如果你后续需要新增其他设备类型的统计页面,不需要为每个设备单独写一个路由函数,可以通过路由的defaults参数传入默认值,复用同一套逻辑:
# 通用统计逻辑 def machines(machine_name): rb = np.array(machines_file.loc[machines_file['Machine'].str.contains(machine_name), 'Resolved By']) rb_o = np.count_nonzero(rb == 'Outsource') rb_ih = np.count_nonzero(rb == 'In-House') # 建议把模板也改成通用模板,减少重复文件 return render_template('machine_stats.html', outsource=rb_o, inhouse=rb_ih, current_machine=machine_name) # 多个路由可以绑定同一个处理函数,通过defaults传入不同的设备名 @app.route('/home/reach_truck', defaults={'machine_name': 'Reach Truck'}) @app.route('/home/forklift', defaults={'machine_name': 'Forklift'}) def machine_stats_page(machine_name): return machines(machine_name)
注意事项
- 任何装饰器下方都不能直接写函数调用、变量赋值这类执行语句,必须紧跟被装饰的函数/类定义,否则必然触发语法错误。
- 写在装饰器下方、函数外部的代码会在应用启动时全局执行一次,不会在用户每次请求时触发,不要把请求相关的业务逻辑写在这个位置。
内容的提问来源于stack exchange,提问作者Rohaan Sheikh
相关产品推荐
相关产品推荐

