1

、、、、および場合によってはそれ以上のオブジェクトがいくつかありUser、基本的にそれらのオブジェクトに関連付けられたフォームを表示および処理するだけの管理ビューがいくつかあります。私の現在のコードは次のようになります。RolePostCategory

admin = Blueprint('admin', __name__)

@login_required
@admin.route('/users')
def users():
  return list_object(User)

@roles_required('admin')
@admin.route('/users/new',  methods = ['GET', 'POST'])
def create_user():
    return create_object(User, UserForm)

@roles_required('admin')
@admin.route('/users/delete/<int:user_id>',  methods = ['GET', 'POST'])
def delete_user(user_id):
   return delete_object(User, user_id)

@roles_required('admin')
@admin.route('/users/<int:user_id>',  methods = ['GET', 'POST'])
def edit_user(user_id):
    return edit_object(User, user_id, UserForm)

@login_required
@admin.route('/categories')
def categories():
  return list_object(Category)

@roles_accepted('admin', 'editor')
@admin.route('/categories/new',  methods = ['GET', 'POST'])
def create_cat():
    return create_object(Category, CategoryForm)

@roles_accepted('admin', 'editor')
@admin.route('/categories/delete/<int:cat_id>',  methods = ['GET', 'POST'])
def delete_cat(cat_id):
   return delete_object(Category, cat_id)

@roles_accepted('admin', 'editor')
@admin.route('/categories/<int:cat_id>',  methods = ['GET', 'POST'])
def edit_cat(cat_id):
    return edit_object(Category, cat_id, CategoryForm)

等々。edit_objectlist_object&​​cも定義されています。私の質問は、ここで冗長性を減らすにはどうすればよいですか?@login_requiredおよび@roles_requiredによって提供されflask-securityます。このコードを最適化するにはどうすればよいですか?

4

1 に答える 1

1

これらの種類の同一のセットアップがある場合は、Flask-RestlessExtensionを調べることをお勧めします。それがあなたのニーズに完全に合わない場合は、Flaskのプラグ可能な(クラスベースの)ビューを使用できます:

from flask.views import View

LIST, NEW, EDIT, DELETE = "list", "new", "edit", "delete"
METHODS = (LIST, NEW, EDIT, DELETE)

class AbstractManager(View):
    DataClass = None
    Form = None

    methods = ["GET", "POST"]
    decorators = [login_required, create_roles_decorator_for("admin", "editor")]

    def dispatch_request(self, method=LIST, id=None):
        if not method in METHODS:
            abort(404)

        if method == LIST and id is not None:
            method = EDIT

        return getattr(self, method)(id)

    def list(self, id):
        if request.method != "GET":
            abort(405)
        return list_object(self.DataClass)

    def new(self, id):
        return create_object(self.DataClass, self.Form)

    def edit(self, id):
        return edit_object(self.DataClass, id, self.Form)

    def delete(self, id):
        return delete_object(self.DataClass, id)


class UserManager(AbstractManager):
    DataClass = User
    Form = UserForm


class CategoryManager(AbstractManager):
    DataClass = Category
    Form = CategoryForm

または、愚かなクラスを作成せずに、次の関数を使用することもできます。

def register_api_for(DataClass, ClassForm, name=None, app=None):
    name = name if name is not None else DataClass.__name__.rsplit(".", 1)[1]
    base_route = "/" + name

    @login_required
    @app.route(base_route, endpoint="list_" + name)
    def list():
        return list_object(DataClass)

    # remaining implementation left as an exercise for the reader
于 2013-03-24T02:47:01.943 に答える