所有地址都转到Python Pyramid中的单个页面(全部路径到单个视图)

时间:2015-09-03 16:32:13

标签: python pyramid

我正在尝试更改Pyramid hello world example,以便对Pyramid服务器的任何请求都提供相同的页面。即所有路线指向同一视图。这就是iv到目前为止所得到的:

from wsgiref.simple_server import make_server
from pyramid.config import Configurator
from pyramid.response import Response

def hello_world(request):
    return Response('Hello %(name)s!' % request.matchdict)

if __name__ == '__main__':
    config = Configurator()
    config.add_route('hello', '/*')
    config.add_view(hello_world, route_name='hello')
    app = config.make_wsgi_app()
    server = make_server('0.0.0.0', 8080, app)
    server.serve_forever()

所有iv完成都是改变线(来自hello world示例):

    config.add_route('hello', '/hello/{name}')

要:

    config.add_route('hello', '/*')

所以我希望这条路线成为'全能'。我尝试了各种变化,无法让它工作。有没有人有任何想法?

感谢addvance

2 个答案:

答案 0 :(得分:5)

catchall路由的语法(在Pyramid中称为“遍历子路径”)是*subpath而不是*。还有*traverse用于混合路由,它结合了路由调度和遍历。您可以在此处阅读:Using *subpath in a Route Pattern

在您的视图功能中,您将能够通过request.subpath访问子路径,这是由捕获路径捕获的路径段的元组。所以,你的应用程序看起来像这样:

from wsgiref.simple_server import make_server
from pyramid.config import Configurator
from pyramid.response import Response

def hello_world(request):
    if request.subpath:
        name = request.subpath[0]
    else:
        name = 'Incognito'
    return Response('Hello %s!' % name)

if __name__ == '__main__':
    with Configurator() as config:
        config.add_route('hello', '/*subpath')
        config.add_view(hello_world, route_name='hello')
        app = config.make_wsgi_app()
    server = make_server('0.0.0.0', 8081, app)
    server.serve_forever()

不要通过自定义404处理程序来实现,它有点像PHP:)

答案 1 :(得分:0)

您可以创建一个自定义错误处理程序(不记得我的头顶,但它在Pyramid文档中)并捕获HTTP 404错误,并从那里重定向/渲染您的catch-all路径。

我在考虑的链接:http://docs.pylonsproject.org/projects/pyramid//en/latest/narr/hooks.html

我做过这样的事情:

from pyramid.view import (
    view_config,
    forbidden_view_config,
    notfound_view_config
    )

from pyramid.httpexceptions import (
    HTTPFound,
    HTTPNotFound,
    HTTPForbidden,
    HTTPBadRequest,
    HTTPInternalServerError
    )

import transaction
import traceback
import logging

log = logging.getLogger(__name__)

#region Custom HTTP Errors and Exceptions
@view_config(context=HTTPNotFound, renderer='HTTPNotFound.mako')
def notfound(request):
    if not 'favicon' in str(request.url):
        log.error('404 not found: {0}'.format(str(request.url)))
        request.response.status_int = 404
    return {}

我认为你应该可以从那里重定向到一个视图。