Flask-restful路由功能的使用是否正确?

时间:2015-12-07 08:43:13

标签: python flask flask-restful

我可以访问/v1/folder但无法访问/v1/folder/<folder-id>。你能告诉我原因吗?在flask-request document中说add_resource()可以路由多个URI。但是我不能。也许我误解了一些事情。如果你找到了线索,请告诉我。

from flask import request
from flask_restful import Resource, abort

class Folder(Resource):
  def post(self, folder_id):
      return { "message":"post with folder_id"}, 200


  def post(self):
      return { "message":"post without folder_id"}, 201



app = Flask(__name__)

.....

api_bp = Blueprint('api', __name__)
api = Api(api_bp, serve_challenge_on_401=True)
api.add_resource( Folder, '/v1/folder', '/v1/folder/<string:folder_id>')
app.register_blueprint(api_bp)

if __name__ == "__main__":
    app.run(host='0.0.0.0', debug=True )

错误消息是&#34; TypeError:post()得到了一个意外的关键字参数&#39; folder_id&#39; &#34 ;.怎么了?

1 个答案:

答案 0 :(得分:1)

Python不支持函数/方法重载,因此您最后声明的post方法将始终是使用的方法。相反,您应该使用Python提供的工具 - 参数的默认值。

我个人会做以下事情:

from flask import request
from flask_restful import Resource, abort

class Folder(Resource):
  def post(self, folder_id=None):
      if folder_id is None:
          return self.__simple_post()
      else:
          return self.__parameter_post(folder_id)

  def __parameter_post(self, folder_id):
      return { "message":"post with folder_id"}, 200

  def __simple_post(self):
      return { "message":"post without folder_id"}, 201



app = Flask(__name__)

.....

api_bp = Blueprint('api', __name__)
api = Api(api_bp, serve_challenge_on_401=True)
api.add_resource( Folder, '/v1/folder', '/v1/folder/<string:folder_id>')
app.register_blueprint(api_bp)

if __name__ == "__main__":
    app.run(host='0.0.0.0', debug=True )

或者你可以处理post方法中的逻辑,如果逻辑足够相似且不太长。但是,如果逻辑最终不可读,请考虑使用我建议的方法。