Webapp2:用值初始化响应对象

0 投票
1 回答
785 浏览
提问于 2025-04-30 23:27

有没有办法在初始化 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(...)

需要注意的是,如果所有或许多 optionspost 方法都需要一些共同的头部信息、任务等,你也可以在自定义的 RequestHandler 中实现这些内容,然后在你的方法开始时调用 super()

撰写回答