如何将其他参数传递给dispatch()?

时间:2017-07-07 13:30:13

标签: webapp2

我正在编写的API通过URL接受两个参数 - 例如/ api / targets / foo / bar

app = webapp2.WSGIApplication([
    ('/api/targets/(\w*?)/(\w*?)$', MainPage),
], debug=True)

这会触发GET处理程序:

def get(self, url_1, url_2):
    #do some stuff

这里很酷的是我可以在我的GET处理程序中引用url_1(foo)和url_2(bar),并为我们定义它们。

我有另一个页面接受GET和POST请求。在任何一种情况下,大约90%的情况都是相同的,所以我选择使用def dispatch()而不是使用两个单独的处理程序。

这里的问题是(即使我仍然在我的webapp2.WSGIApplication初始化中包含了正则表达式块),它们不再传递给请求处理程序,所以我必须像这样定义它们:

    url_1= self.request.url.split("/")[3]
    url_2= self.request.url.split("/")[4]

这让我觉得自己像个笨蛋。如果我告诉dispatch()期望这两个参数,他们永远不会到达 - 我需要做什么来模仿调度中的获取行为?

1 个答案:

答案 0 :(得分:1)

使用时间会更短:

arg_one = self.request.route_args[0]
arg_two = self.request.route_args[1]

查看Request对象的webapp2 docs,特别是Request部分底部的route_argsroute_kwargs

这是一个有趣的用例。如果我是你,我会将get()和post()分开。如果get()和post()共享代码,那么我会将该代码移动到可以从get()和post()调用的RequestHandler方法,或者将共享代码移动到另一个类(我发现很多)我的RequestHandlers只是在我的模型类上调用方法)。

如果你仍然想要一个方法来替换get()和post(),那么我建议你为Route设置handler_method而不是使用dispatch()(参见here in the docs)。我建议不要完全在dispatch()方法中处理这些请求,因为在某些时候,它应该调用“处理程序方法”,默认为GET / POST / etc。基于HTTP方法,但您可以设置自己的处理程序方法来处理GET和POST以及其他任何方法。

如果您设置handler_method,它将如下所示:

# note that handler_method is the method name as a string
app = webapp2.WSGIApplication([
    ('/api/targets/(\w*?)/(\w*?)$', MainPage, handler_method='handle_request'),
], debug=True)

在你的经纪人中:

class MainPage(webapp2.RequestHandler):
    # note that your method signature MUST have args for the route args,
    # or else an exception will occur
    def handle_request(self, arg_one, arg_two):
        # your code here
        if self.request.method == 'GET':
            # do GET stuff
        elif self.request.method == 'POST':
            # do POST stuff

这很好,因为它使dispatch()保持不变。我喜欢将dispatch()视为在调用get()/ post()/您指定的任何处理程序方法之前/之后进行的前处理和后处理。