2017-01-12 23 views
1

私は現在、かなり大きなデータベースにまたがるCRUDアプリケーションに取り組んでおり、ベストプラクティスを使用してそれについて説明したいと思います。Flask CRUDビューに関するベストプラクティス

私はFlask Viewを設計するとき、現在、すべての機能をこのように1つのビューに入れています。あなたは(関係、selectfield選択肢生成、マルチテナントのコントロールなど)考慮し、すべてのDB機能を取るときに、このビューはかなり大きくなる可能性が想像できるように

@userBlueprint.route('/<string:lang>/user', methods=['GET']) 
@userBlueprint.route('/<string:lang>/user/<string:function>', methods=['GET', 'POST']) 
@userBlueprint.route('/<string:lang>/user/<string:function>/<int:id>', methods=['GET', 'POST']) 
def userView(lang=None, id=None, function=None): 
    if function == None: 
     pass 
    elif function == 'delete': 
     pass   
    else: 
     if function == 'update': 
      pass 
     elif function == 'new': 
      pass 

この同じタスクを実行する別の方法は、このように5つのビューを作成することです。

@userBlueprint.route('/<string:lang>/user', methods=['GET']) 
def getUsers(lang=None): 
    pass 

@userBlueprint.route('/<string:lang>/user', methods=['POST']) 
def newUsers(lang=None): 
    pass 

@userBlueprint.route('/<string:lang>/user/<int:id>', methods=['GET']) 
def getUser(lang=None, id=None): 
    pass 

@userBlueprint.route('/<string:lang>/user/<int:id>', methods=['POST']) 
def deleteUser(lang=None, id=None): 
    pass 

@userBlueprint.route('/<string:lang>/user/<int:id>', methods=['POST']) 
def modifyUser(lang=None, id=None): 
    pass 

もちろん、ここでの欠点は、繰り返しコードをたくさん入れなければならないことです。

いずれの方法も「ベストプラクティス」と考えられていますか?そうでない場合は、3番目のオプションはありますか?

答えて

1

内蔵の機器にはフラスコmethod viewsであるため、彼らはあなたが別の関数内で異なるオブジェクトアクションの実装を支援するために特別に設計されています

class UserAPI(MethodView): 

    def get(self, user_id): 
     if user_id is None: 
      # return a list of users 
      pass 
     else: 
      # expose a single user 
      pass 

    def post(self): 
     # create a new user 
     pass 

    def delete(self, user_id): 
     # delete a single user 
     pass 

    def put(self, user_id): 
     # update a single user 
     pass 

user_view = UserAPI.as_view('user_api') 
app.add_url_rule('<string:lang>/user/', defaults={'user_id': None}, view_func=user_view, methods=['GET']) 
app.add_url_rule('<string:lang>/user/', view_func=user_view, methods=['POST']) 
app.add_url_rule('<string:lang>/user/<int:user_id>', view_func=user_view, methods=['GET', 'PUT', 'DELETE']) 

別のテーブルにはいくつかのビューを実装することは非常に簡単になります。 BaseAPIメソッドのビューとサブクラスを作成します。オブジェクトの取得/更新/削除は、異なるテーブルでも同様です。

flask-adminパッケージのCRUDの実装を見ることもできます。オブジェクトの表示リスト

  • <string:tablename>/new/(GET、POST) - -
  • <string:tablename>/edit/が(GETオブジェクトを/オブジェクトを作成作成するためのフォームを表示、POST

    • <string:tablename>/(GET):そのルートは、このようにグループ化されています) - オブジェクト/オブジェクトを編集更新するためのフォームを表示
    • <string:tablename>/delete/(POST) - オブジェクトを削除する
  • 関連する問題