如何在 webapp2.WSGIApplication 中嵌套 url 映射

How do you nest url mapping in webapp2.WSGIApplication

我正在编写一个 webapp2 应用程序,并试图弄清楚如何嵌套 url 映射。该应用程序被分成几个包,我希望每个包都能够指定它自己的 url 映射,类似于 Django 使用它的 include() 指令的方式。从 Django 文档复制这看起来像:

urlpatterns = [
    # ... snip ...
    url(r'^community/', include('django_website.aggregator.urls')),
    url(r'^contact/', include('django_website.contact.urls')),
    # ... snip ...
]

这是否需要在 app.yaml 中指定,或者有没有办法在 webapp2.WSGIApplication([])

中指定包含

您可以在 webapp2.WSGIApplication 中完成。看看 docs for PathPrefixRoute。 PathPrefixRoute 有两个参数:作为字符串的路径前缀和路由列表。根据您的问题,路径前缀字符串将为 'community/'contact/。对于路由列表,只需在要路由到的每个包中保存一个路由列表(不带路径前缀)。假设您有一个 package.contact 和一个 package.community。您可以为它们中的每一个添加一个 urls.py,如下所示:

import webapp2
from handlers import HandlerOne, HandlerTwo, etc.
ROUTE_LIST = [
    webapp2.Route('/path_one', HandlerOne, 'name-for-route-one'),
    webapp2.Route('/path_two', HandlerTwo, 'name-for-route-two'),
    ...
]

然后在你的 app.py 中,你可以这样做:

from package.contact import urls as contact_urls
from package.community import urls as community_urls
from webapp2_extras.routes import PathPrefixRoute

routes = [
    webapp2.Route('/', RegularHandler, 'route-name'),
    # ... other normal routes ...
    PathPrefixRoute('/contact', contact_urls.ROUTE_LIST),
    PathPrefixRoute('/community', community_urls.ROUTE_LIST),
    # ... other routes ...
]
app = WSGIApplication(routes)

# now the url '/contact/path-one' will route to package.contact.handlers.HandlerOne

您可以发挥更多创意,使其更美观或更像 Django,但您明白了。使用 PathPrefixRoute,您只需要一个包中的路由列表即可将它们插入您的应用程序路由。