Webapp2: инициализировать объект ответа значениями

Есть ли способ инициализировать response объект с определенными значениями, так что другие методы, которые используют response объект не должен повторно объявлять эти значения?

Например, это то, что я сейчас должен сделать:

class TodoHandler(webapp2.RequestHandler):
    """Handle all the actions of the API"""

    def options(self):
        """Need to re-declare common headers in each method"""
        self.response.headers['Content-Type'] = 'text/plain'
        self.response.headers['Access-Control-Allow-Origin'] = '*'
        self.response.headers['Access-Control-Allow-Headers'] = 'Origin, X-Requested-With, Content-Type, Accept'
        self.response.headers['Access-Control-Allow-Methods'] = 'OPTIONS'


    def post(self):
        """Need to re-declare common headers in each method"""
        self.response.headers['Content-Type'] = 'text/plain'
        self.response.headers['Access-Control-Allow-Origin'] = '*'
        self.response.headers['Access-Control-Allow-Headers'] = 'Origin, X-Requested-With, Content-Type, Accept'
        self.response.headers['Access-Control-Allow-Methods'] = 'POST'

        new_title = json.loads(self.request.body).get('title')
        self.response.write('Successfully added new todo')

Вот что я хотел бы создать:

class TodoHandler(webapp2.RequestHandler):
    """Handle all the actions of the API"""

    def initialize():
        # Set response headers to handle CORS
        self.response.headers['Content-Type'] = 'text/plain'
        self.response.headers['Access-Control-Allow-Origin'] = '*'
        self.response.headers['Access-Control-Allow-Headers'] = 'Origin, X-Requested-With, Content-Type, Accept'

    def options(self):
        """Response already initialized, so I only have to declare what I need for this method"""

        self.response.headers['Access-Control-Allow-Methods'] = 'OPTIONS'


    def post(self):
        """Response already initialized, so I only have to declare what I need for this method"""

        self.response.headers['Access-Control-Allow-Methods'] = 'POST'

        new_title = json.loads(self.request.body).get('title')
        self.response.write('Successfully added new todo')

1 ответ

Обычно более чем один обработчик класса должен совместно использовать некоторые общие методы и значения ответов, и в этом случае вы реализуете свои собственные RequestHandler класс, который наследуется от webapp2.RequestHandler, Все ваши последующие обработчики маршрута / запроса будут наследоваться от вновь созданного RequestHandler:

class CustomApiRequestHandler(webapp2.RequestHandler):
    def render_api_json(self, obj):
        self.response.content_type = 'application/json'
        self.response.headers.add_header("Access-Control-Allow-Origin", "*")
        self.response.headers['Access-Control-Allow-Headers'] = 'Origin, X-Requested-With, Content-Type, Accept'
        self.response.write(json.encode((self.to_json(obj))))


class TodoHandler(CustomApiRequestHandler):
    def options(self):
        """Response already initialized, so I only have to declare what I need for this method"""
        self.response.headers['Access-Control-Allow-Methods'] = 'OPTIONS'
        return self.render_api_json(...)

    def post(self):
        """Response already initialized, so I only have to declare what I need for this method"""
        self.response.headers['Access-Control-Allow-Methods'] = 'POST'
        return self.render_api_json(...)

Обратите внимание, что если все или много options/post Методы требуют общих заголовков / задач / и т.д., вы также можете реализовать их в своем собственном RequestHandler а потом позвони super() в начале ваших методов.

Другие вопросы по тегам