首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >所有地址转到Python金字塔中的单个页面(捕获所有路径到单个视图)

所有地址转到Python金字塔中的单个页面(捕获所有路径到单个视图)
EN

Stack Overflow用户
提问于 2015-09-04 00:32:13
回答 2查看 797关注 0票数 5

我正在尝试修改Pyramid hello world example,以便任何对金字塔服务器的请求都服务于同一个页面。即所有路由指向相同的视图。这是到目前为止iv得到的结果:

代码语言:javascript
复制
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示例):

代码语言:javascript
复制
    config.add_route('hello', '/hello/{name}')

至:

代码语言:javascript
复制
    config.add_route('hello', '/*')

所以我希望这条路线是“包罗万象”的。Iv尝试了各种变体,但都不能正常工作。有谁有什么想法吗?

感谢你的帮助

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-04 04:38:09

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

在视图函数中,您将能够通过request.subpath访问子路径,这是由catchall路由捕获的路径段的元组。因此,您的应用程序将如下所示:

代码语言:javascript
复制
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的味道:)

票数 9
EN

Stack Overflow用户

发布于 2015-09-04 01:14:05

您可以创建一个自定义错误处理程序(我已经不记得了,但它就在金字塔文档中)并捕获HTTP404错误,然后从那里重定向/呈现您的通用路由。

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

我做过这样的事情:

代码语言:javascript
复制
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 {}

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32381041

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档