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 个回答
0
通常情况下,多个类的处理器需要共享一些共同的方法和响应值。在这种情况下,你可以创建自己的 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()
。