2013-03-24 4 views
1

У меня есть ряд объектов, User, Role, Post, Category и, возможно, больше, и имеют ряд взглядов администратора, которые в основном только отображать и обрабатывать формы, связанные с этими объектами. Мой текущий код выглядит так:Оптимизировать и уменьшить избыточность в термосе маршрутизация

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_object, list_object & c также определены. Мой вопрос: как я могу уменьшить избыточность здесь? @login_required и @roles_required предоставляются flask-security. Как я могу оптимизировать этот код?

ответ

1

Если у вас есть подобные установки, вы можете посмотреть Flask-Restless Extension. Если это не совсем отелей вы можете использовать Flask в pluggable (class-based) views:

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 

Кроме того, вы можете avoid writing stupid classes и просто использовать функцию:

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