金字塔装饰者链接

在我的金字塔应用程序中,我试图通过装饰视图函数来实现授权。
当我使用config.scan()函数时,没有任何视图被添加,但是如果我使用config.add_view()明确地添加它们,那么一切正常。

我有两个文件定义了所有的视图函数(views.py)

from pyramid.view import view_config
from pyramid.response import Response

from functools import wraps

def authorized(func):    #decorator difnition
    @wraps(func)
    def new_func(request):
        if(request.cookies.get('user')):   # authorization
            return func(request)
        else:
            return Response('not authirised')
    return new_func



@view_config(route_name='hello')           # view function being decorated
@authorized
def privileged_action(request):
    return Response('Hello %(name)s!' % request.matchdict)

另一个文件用于创建导入views.py的服务器(serve.py)

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

from views import privileged_action

if __name__ == '__main__':
    config = Configurator()
    config.add_route('hello', '/hello/{name}')
    # config.add_view(privileged_action, route_name='hello')   # This works
    config.scan()                                              # This doesn't work
    app = config.make_wsgi_app()
    server = make_server('0.0.0.0', 8080, app)
    server.serve_forever()

如果我使用'http:// localhost:8080 / hello / a'访问,这会导致404未找到错误
为什么这不起作用?
有什么办法可以做到这一点?


你的装饰器代码看起来很好。

Configurator.scan()的文档声明了它的第一个参数:

包参数应该是一个Python包或模块对象(或引用这种包或模块的虚线Python名称)。 如果包为无,则使用调用者的包。

所以确保你在做config.scan(views) ,让你的web应用程序动态地添加你的视图。

链接地址: http://www.djcxy.com/p/69095.html

上一篇: Pyramid decorator chaining

下一篇: Separate permissions per methods