代码之家  ›  专栏  ›  技术社区  ›  Konrad Viltersten

无法在基于资源或基于路由的调用之间做出决定

  •  -1
  • Konrad Viltersten  · 技术社区  · 5 月前

    由于对Python(尤其是Flask)的普遍不了解,我对约定、最佳实践和常见技术诀窍感到非常困惑。我试着遵循微软提供的例子(因为我们正在使用Azure),我开始怀疑它们可能是……微软式的(即“它有效,但……”)。

    基于各种示例,我创建了两个端点,执行相同的计算,产生了等效的有效载荷(但不是相同的结构!),我不知道哪种方法是推荐的。一种是使用资源(结合路线),另一种是显式路由。

    from flask import Flask
    from flask_restful import Api, Resource, request
    from logic import compute
    
    app = Flask(__name__)
    api = Api(app)
    
    class computer (Resource):
        def get(self):
            return compute(request.args.to_dict())
    
    api.add_resource(computer, "/compute-resource")
    
    @app.route("/compute-route", methods=["GET"])
    def execute():
        return compute(request.args.to_dict())
    
    if __name__ == "__main__":
        app.run()
    

    我在输出中唯一注意到的(奇怪的是出乎意料的)是,后者似乎按字母顺序对返回的JSON字段进行排序,而第一个则没有。

    1. 这两种方法中哪一种更可取,或者它们是否同样合适?
    2. 字段排序的偏差意味着什么?
    1 回复  |  直到 5 月前
        1
  •  1
  •   Hamedgh2k04    5 月前

    你的问题触及了设计Flask API时的一个常见困境:是否使用 Flask RESTful Resource -基于方法 Flask基于路线的方法 。两者都是有效的,并且都有自己的位置,具体取决于您的用例和偏好。

    主要区别

    1. Flask RESTful( 资源 ):

      • 鼓励面向对象编程。
      • 适用于RESTful API,其中资源(如“用户”或“订单”等实体)映射到URL端点。
      • 轻松组织不同HTTP方法的逻辑( GET , POST , PUT , DELETE )使用类方法。
      • 现场订购 :默认情况下,Flask RESTful不对JSON键进行排序,这就是为什么您会观察到未排序的字段。

      例子:

      class UserResource(Resource):
          def get(self):
              return {"name": "Alice", "age": 25}  # Order preserved.
      
    2. 基于路线的方法( @app.route ):

      • 对于Flask初学者来说,传统且更容易理解。
      • 非常适合小型应用程序或非RESTful API,其中端点是过程性的或一次性的。
      • 现场订购 :The jsonify 函数(Flask隐式使用 @app.route )在序列化为JSON时,默认情况下按字母顺序对键进行排序。

      例子:

      @app.route("/user")
      def user():
          return {"age": 25, "name": "Alice"}  # Alphabetically sorted as {"age": 25, "name": "Alice"}.
      

    最佳实践

    1. 何时使用Flask RESTful:

      • 您的应用程序需要RESTful设计原则。
      • 您有多个需要组织的资源和端点。
      • 您计划扩展API或在团队中工作,基于类的方法有助于提高可读性和可维护性。
    2. 何时使用基于路线的:

      • 应用程序很小,添加Flask RESTful是多余的。
      • 端点的数量有限,不需要复杂的组织。
      • 比起Flask RESTful提供的额外抽象,您更喜欢简单。

    您的案例

    由于这两种方法都会得到相同的结果,唯一的区别是字段顺序:

    1. 如果您正在构建RESTful API(例如,用于Azure集成或更大的项目), 坚持使用Flask RESTful 由于其结构和可扩展性。
    2. 如果这是一个小型实用程序或一次性端点,那么基于路由的方法是完全可以的。

    关于现场订购

    现场排序的偏差是由于:

    • Flask RESTful 使用Python json 直接使用库,保留字典的插入顺序。
    • 基于路线的方法 使用Flask的 jsonify ,适用 sort_keys=True 默认情况下转储JSON时。

    如果你想在基于路由的方法中控制字段排序,你可以像这样禁用排序:

    from flask import jsonify
    
    @app.route("/compute-route", methods=["GET"])
    def execute():
        return jsonify(compute(request.args.to_dict())), 200, {"Content-Type": "application/json"}
    

    建议

    为了可维护性和可扩展性,特别是在使用Azure或类似平台时, 采用Flask RESTful 资源 .它与REST API标准保持一致,并随着项目的发展使代码保持有序。