如何在Flask/Flask-RESTX中从外部函数向服务端传参
解决Flask-RESTX中外部函数参数传递的问题
先明确你现有代码的几个核心问题:
- 定义
parent模型时直接调用get_answer(a,b)是错误的——这里a和b未定义,且模型是静态结构,不能在此处动态传入请求参数。 - 你的
get方法返回固定字典,未调用get_answer生成目标结果。
下面给你几种可行的实现方式:
方式一:通过URL路径参数传递参数
把参数嵌入API路径,请求时直接通过路径传入a和b:
from flask_restx import Api, fields, Resource from flask import Flask # 导入外部的get_answer函数 from your_module import get_answer app = Flask(__name__) api = Api(app) # 仅定义返回模型的字段结构,无需提前调用函数 parent = api.model('Parent', { 'name': fields.String(description='get_answer的计算结果'), 'class': fields.String(discriminator=True) }) @api.route('/language/<string:a>/<string:b>') class Language(Resource): @api.marshal_with(parent) @api.response(403, "Unauthorized") def get(self, a, b): # 调用外部函数计算结果 calc_result = get_answer(a, b) # 返回符合模型结构的数据 return {"name": calc_result, "class": "default"}
请求示例:访问http://localhost:5000/language/hello/world,会返回{"name": "helloworld", "class": "default"}。
方式二:通过URL查询参数传递参数
如果不想把参数放在路径里,可用查询参数(格式:/language?a=xxx&b=yyy):
from flask_restx import Api, fields, Resource from flask import Flask, request from your_module import get_answer app = Flask(__name__) api = Api(app) parent = api.model('Parent', { 'name': fields.String(description='get_answer的计算结果'), 'class': fields.String(discriminator=True) }) @api.route('/language') class Language(Resource): @api.marshal_with(parent) @api.response(403, "Unauthorized") def get(self): # 从查询参数中获取a和b a = request.args.get('a') b = request.args.get('b') if not a or not b: # 参数缺失时返回400错误 api.abort(400, "参数a和b不能为空") calc_result = get_answer(a, b) return {"name": calc_result, "class": "default"}
请求示例:访问http://localhost:5000/language?a=hello&b=world,同样返回计算结果。
方式三:启动服务时传入固定参数(参数不随请求变化)
如果a和b是服务启动时就固定的参数,可通过命令行参数传入,再存入Flask配置:
from flask_restx import Api, fields, Resource from flask import Flask from your_module import get_answer import sys def create_app(a, b): app = Flask(__name__) # 将参数存入配置,方便后续调用 app.config['FIXED_A'] = a app.config['FIXED_B'] = b api = Api(app) parent = api.model('Parent', { 'name': fields.String(description='get_answer的计算结果'), 'class': fields.String(discriminator=True) }) @api.route('/language') class Language(Resource): @api.marshal_with(parent) @api.response(403, "Unauthorized") def get(self): # 从配置中读取固定参数 a = app.config['FIXED_A'] b = app.config['FIXED_B'] calc_result = get_answer(a, b) return {"name": calc_result, "class": "default"} return app if __name__ == '__main__': # 从命令行获取参数,运行时输入:python app.py hello world a = sys.argv[1] b = sys.argv[2] app = create_app(a, b) app.run(debug=True)
这种方式下,所有请求都会使用启动时传入的固定参数计算结果。
另外,你提到把服务端封装为函数是完全合理的——上面的create_app就是标准的Flask应用工厂模式,即使内部包含Language(Resource)类也没问题,类会在函数内部完成定义和注册,不影响正常使用。
内容的提问来源于stack exchange,提问作者Youkijiudai
相关产品推荐
相关产品推荐

