CherryPy:如何在请求到达应用程序方法之前处理它?

时间:2013-11-12 03:06:03

标签: python httprequest cherrypy

我希望能够在方法本身之前捕获CherryPy应用程序的方法的参数。但我不确定是否有办法在CherryPy或标准python中执行此操作。看起来应该是这样的:

HTTP请求 - >解析参数的解析器 - >将请求传递给方法

的CherryPy

我的目标是捕获输入和输出到服务器而不会干扰方法本身的代码。

另外,如何将请求重定向到CherryPy服务器到其他CherryPy服务器?

2 个答案:

答案 0 :(得分:3)

以下是我检查服务器生成的有效csrf令牌的post方法的方法。

def check_token(self=None):
    # whenever a user posts a form we verify that the csrf token is valid.
    if cherrypy.request.method == 'POST':
        token = cherrypy.session.get('_csrf_token')
        if token is None or cherrypy.request.params.get('csrf_token') == None or token != cherrypy.request.params['csrf_token']:
            raise cherrypy.HTTPError(403)

cherrypy.tools.Functions = cherrypy.Tool('before_handler', check_token)

希望这有帮助!

答案 1 :(得分:1)

处理HTTP请求的标准Python方式是WSGI。 WSGI允许堆叠称为WSGI中间件的处理组件。这是您可以在请求到达框架内部之前修改请求的地方。 CherryPy与WSGI兼容,因此中间件可以与它一起使用。

但是,CherryPy不仅仅是一个框架,它还是一个Web服务器。如果您将其用作服务器,则很可能是cherrypy.quickstart()电话。要添加中间件,需要更多编码来构建生成WSGI应用程序的站点“树”并将应用程序连接到CherryPyWSGIServer类。 This article似乎很好地解释了它。但是,我通常建议使用uWSGI来运行Python WSGI应用程序而不是CherryPy的内置服务器。它具有大量功能并克服了GIL问题。

此外,您可以使用页面处理程序/工具在实际处理之前处理请求。请参阅docs