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()
в начале ваших методов.