有a catch-all URL example for Flask:
from flask import Flask
app = Flask(__name__)
@app.route('/', defaults={'path': ''})
@app.route('/<path:path>')
def catch_all(path):
return 'You want path: %s' % path
if __name__ == '__main__':
app.run()
装饰器可以转换为以下代码,以使其看起来更类似于 Flask-RESTful ,实现相同功能:
app.add_url_rule('/', 'catch_all', catch_all, defaults={'path': ''})
app.add_url_rule('/<path:path>', 'catch_all', catch_all, defaults={'path': ''})
如果我是对的,则可以将其进一步翻译为等效的 Flask-RESTful 应用程序(至少调试显示它创建了相同的URL路由):
class RESTapp(Resource):
def get(self, path):
# do get something
api.add_resource(RESTapp, '/', '/<path:path>', defaults={'path': ''})
问题是此应用将所有URL重定向到/,并且无法在get()函数中获取请求的路径。我想以与Flask中相同的功能处理所有路径(/和'/'),但要使用Flask-RESTful。
类似的问题:
resource_class_kwargs
关键字参数来初始化该类,并且我只想保留一个实例,所以这对我不利。我尝试过的事情:
add_resource
调用。它以错误结束。add_resource
。它显示了它从端点创建了资源视图函数,并将其提供给add_url_rule
函数。另外,它的作用与随后的两个add_url_rule
函数相同。答案 0 :(得分:0)
通过反复试验,我已经找到了解决方案,该解决方案既没有记录在案,也没有达到预期的实现方式(类似于Flask中的问题)。
必须为get()
和其他函数提供Pythonic默认参数:get(stuff='DEF_VAL')
有效的完整示例:
from flask import Flask
from flask_restful import Api, Resource
app = Flask(__name__)
api = Api(app)
class RESTapp(Resource):
@staticmethod
def get(path=''): # <-- You should provide the default here not in api.add_resource()!
return 'You want path: \'%s\'' % path # do get something
api.add_resource(RESTapp, '/', '/<path:path>') # Here just the URLs must be the arguments!
if __name__ == '__main__':
app.run()