【问题标题】:How to pass multiple arguments to handlers in Google App Engine python?如何将多个参数传递给 Google App Engine python 中的处理程序?
【发布时间】:2015-07-09 13:49:09
【问题描述】:

我正在尝试构建一个能够查看以前编辑的 wiki。每个 wiki 条目都有自己的相对 url 路径,并且修订号会在 url 后附加一个 '/rev='。

这是我的代码的一部分。

class WikiPage(MainHandler):
def get(self, url, num):
    num = int(num) if num else 0
    ...    # Display the wiki-entry with that revision number

PAGE = r'(/(?:[a-zA-Z0-9_-]+/?)*)'

app = webapp2.WSGIApplication([
    (r'/wiki' + PAGE + r'(?:/rev=(\d+))?', WikiPage),
    ...  # Other Handlers
], debug = True)

这可能不是最好的方法(例如,我可以使用查询来获取修订号,但我想知道如何以这种方式进行)

当我运行上面的代码时,我收到一个错误,表明 get 函数接受 3 个参数,但只提供了 2 个参数。url 参数正确传递,但修订号未传递。我也尝试将原始字符串中的组命名为 num 但它仍然无法正常工作。

对于如何将 2 个或更多参数传递给处理程序的任何帮助,我将不胜感激。

编辑:根据 Jamie Gómez 的回答,我尝试修改我的程序,但我仍然无法使其工作(我收到 404 错误)。我也尝试过使用未命名的参数,但无济于事。我没有正确实施吗?

class WikiPage(MainHandler):
    def get(self, **kw):
        url = kw.get('url')
        num = kw.get('num')
        num = int(num) if num else 0
        ...    # Display the wiki-entry with that revision number

PAGE = r'<url:/(?:[a-zA-Z0-9_-]+/?)*>'

app = webapp2.WSGIApplication([
    (r'/wiki' + PAGE + r'(?:/rev=<num:\d+>)?', WikiPage),
    ...  # Other Handlers
], debug = True)

【问题讨论】:

  • 尝试从def get(self, url, num):中删除self

标签: python regex google-app-engine webapp2


【解决方案1】:

格式看起来不对,请查看文档的这一部分:

The URL template

┌──────────────┬────────────────────────────────────┐
│ Format       │ Example                            │
├──────────────┼────────────────────────────────────┤
│ <name>       │ '/blog/<year>/<month>'             │
├──────────────┼────────────────────────────────────┤
│ <:regex>     │ '/blog/<:\d{4}>/<:\d{2}>'          │
├──────────────┼────────────────────────────────────┤
│ <name:regex> │ '/blog/<year:\d{4}>/<month:\d{2}>' │
└──────────────┴────────────────────────────────────┘ 

【讨论】:

  • 赞成链接,这对像我这样容易忘记的人有好处
  • 感谢您的链接。我尝试使用这些方法,但我无法让它们工作。请检查已编辑的问题。
【解决方案2】:

您可以使用 webapp2.Route()。这里有一个例子(我仍在努力完全理解它):https://github.com/svpino/blog-engine

【讨论】:

    【解决方案3】:

    为什么不将 rev 作为请求参数传递,例如

     /wiki?month=4&year=2015&rev=123
    

    通过这种方式,您可以通过这种方式在您的处理程序中获取它

     self.request.get('rev')
    

    【讨论】:

    • 正如我已经说过的那样在这种情况下有效,尽管我想知道一般如何将多个参数传递给处理程序
    猜你喜欢
    • 1970-01-01
    • 2011-12-22
    • 1970-01-01
    • 2015-02-24
    • 1970-01-01
    • 2015-05-19
    • 1970-01-01
    • 2017-08-26
    相关资源
    最近更新 更多