2017-02-22 8 views
1

В настоящее время я пишу приложение Flask, которое направляет конечные точки на множество «действий». Эти действия все реализовать родительскую функцию под названием «Run()»Флажок маршрутизации для просмотра функций через наследование

В коде:

import abc 

class Action(object): 
    __metaclass__ = abc.ABCMeta 

    @classmethod 
    def authenticated(self): 
     print("bypassing action authentication") 
     return True 

    @classmethod 
    def authorized(self): 
     print("bypassing action authorization") 
     return True 


    @classmethod 
    @abc.abstractmethod 
    def execute(self): 
     raise NotImplementedError("must override execute!") 

    @classmethod 
    def response(self, executeResult): 
     return executeResult 

    @classmethod 
    def run(self): 
     result = "" 

     if self.authenticated() & self.authorized(): 
      result = self.execute() 

     return self.response(result) 

Цель состоит в том, что все на самом деле используемых действия являются производными членами этого класса действий, которые обнаженный минимум реализации выполнения (), которая их отличает. К сожалению, когда я пытаюсь добавить маршруты для этих

app.add_url_rule('/endone/', methods=['GET'], view_func=CoreActions.ActionOne.run) 

app.add_url_rule('/endtwo/', methods=['GET'], view_func=CoreActions.ActionTwo.run) 

я получаю следующее сообщение об ошибке:

AssertionError: View function mapping is overwriting an existing endpoint function: run 

Кто-нибудь знает возможное решение этой проблемы? Благодаря!

ответ

0

Общий подход к генерации функций просмотра заключается в использовании Flask views. Подкласс ваш Action класс от flask.views.View, dispatch_request метод используется вместо run:

import abc 
from flask.views import View 

class Action(View): 
    __metaclass__ = abc.ABCMeta 

    def authenticated(self): 
     print("bypassing action authentication") 
     return True 

    def authorized(self): 
     print("bypassing action authorization") 
     return True 

    @abc.abstractmethod 
    def execute(self): 
     raise NotImplementedError("must override execute!") 

    def response(self, executeResult): 
     return executeResult 

    def dispatch_request(self): 
     result = "" 

     if self.authenticated() & self.authorized(): 
      result = self.execute() 

     return self.response(result) 

И вы можете добавить маршруты, используя View.as_view() метод, превращающие ваш класс для просмотра функции:

app.add_url_rule(
       '/endone/', 
       methods=['GET'], 
       view_func=CoreActions.ActionOne.as_view('endone') 
       ) 

 Смежные вопросы

  • Нет связанных вопросов^_^