如何显示基于CherryPy请求的URL的任意页面?

2024-10-03 13:21:08 发布

您现在位置:Python中文网/ 问答频道 /正文

例如,如果用户要转到本地主机:8080/foobar228,我不需要通过定义函数在foobar228请求页面中硬编码。我只想有一个函数,它提供请求的URL(“foobar228”)和其他信息,比如GET和POST请求,并返回要服务的HTML。有办法吗?在


Tags: 函数用户信息url编码get定义html
2条回答

使用默认方法。这里有一个例子。在

import cherrypy


class Root:

    @cherrypy.expose
    def default(self, *url_parts, **params):
        req = cherrypy.request
        print(url_parts)
        body = [
            'Page served with method: %s' % req.method,
            'Query string from req: %s' % req.query_string,
            'Path info from req: %s' % req.path_info,
            'Params (query string + body for POST): %s' % params,
            'Body params (only for POST ): %s' % req.body.params
        ]
        if url_parts: # url_parts is path_info but divided by "/" as a tuple
            if url_parts[0] == 'foobar228':
                body.append( 'Special foobar page')
            else:
                body.append('Page for %s' % '/'.join(url_parts))
        else:
            body.append("No path, regular page")
        return '<br>\n'.join(body)

cherrypy.quickstart(Root())

url段成为位置参数,任何查询字符串(?foo=bar)都是该方法关键字参数的一部分,POST方法的主体参数也包含在关键字参数中(在本例中,在方法定义中的名称为params)。在

特殊的调度方法

调度是一种特殊的方法,您可以在任何一个控制器中声明,在CherryPy处理剩余的段之前对它们进行按摩。这为您提供了删除、添加或以其他方式处理任何段的能力,甚至可以完全更改其余部分。在

import cherrypy

class Band(object):
    def __init__(self):
        self.albums = Album()

    def _cp_dispatch(self, vpath):
        if len(vpath) == 1:
            cherrypy.request.params['name'] = vpath.pop()
            return self

        if len(vpath) == 3:
            cherrypy.request.params['artist'] = vpath.pop(0)  # /band name/
            vpath.pop(0) # /albums/
            cherrypy.request.params['title'] = vpath.pop(0) # /album title/
            return self.albums

        return vpath

    @cherrypy.expose
    def index(self, name):
        return 'About %s...' % name

class Album(object):
    @cherrypy.expose
    def index(self, artist, title):
        return 'About %s by %s...' % (title, artist)

if __name__ == '__main__':
    cherrypy.quickstart(Band())

注意控制器是如何定义cp_dispatch的,它只接受一个参数,将URL路径信息分解成多个片段。在

该方法可以检查和操作段列表,在任何位置删除或添加新段。然后将新的段列表发送给调度程序,调度程序将使用它来定位适当的资源。在

在上面的示例中,您应该能够转到以下URL:

http://localhost:8080/nirvana/

http://localhost:8080/nirvana/albums/nevermind/

/nirvana/段与乐队关联,/nevermind/段与专辑相关。在

为了实现这一点,我们的\u cp_dispatch方法的工作原理是,默认的分派器将url与页面处理程序签名及其在处理程序树中的位置相匹配。在

取自docs

相关问题 更多 >