webapp2是否提供从HTML表单调用DELETE和PUT操作的机制?

2 投票
2 回答
724 浏览
提问于 2025-04-17 19:11

给定以下的路由:

Route(r'/app/product/<id:\d+>', handler='app.handlers.ProductHandler:show', 
methods=['GET'], name='show-product'), 
Route(r'/app/product/<id:\d+>', 
handler='app.handlers.ProductHandler:delete', methods=['DELETE'], 
name='delete-product'), 

还有以下的表单:

<form action="{{ uri_for('delete-product', id=product.key.id()) }}" 
method="DELETE"> 

提交这个表单会被 show-product 路由处理。

大多数浏览器不支持 DELETE 和 PUT 操作,但很多网络框架有一些特别的方式来支持这些操作。例如,可以提供一个隐藏的 _method 参数。

webapp2 是否自带支持 DELETE 和 PUT 操作的功能呢?

2 个回答

1

在WebApp2中添加这个功能其实挺简单的。

这个装饰器会检查http_verb这个参数里有没有值,如果找到了,就会调用相应的请求处理方法。

def spoof_rest(func):
    """ Decorator to handle spoofing RESTful verbs """
    def inner(handler):
        params = handler.request.params
        if 'http_verb' in params:
            if params['http_verb'] == 'PUT':
                handler.put()
            elif params['http_verb'] == 'DELETE':
                handler.delete()
    return inner


class MyRoute(RequestHandler):

    @spoof_rest
    def get(self):
        self.response.write("GET request")

    @spoof_rest
    def post(self):
        self.response.write("POST request")

    def put(self):
        self.response.write("PUT request")

    def delete(self):
        self.response.write("DELETE request")
2

webapp2可以接收这些方法,但在浏览器中并没有什么特别的支持来处理这些参数。

撰写回答