如何将参数传递给falcon.before钩子?

时间:2014-11-19 22:10:22

标签: python falconframework

我需要根据一些rols授权用户,所以我需要:

class Things:
    @falcon.before(myfunc, 'can_delete_tag')
    @on_get(req, resp):
        ...

但似乎不可能......有什么想法吗?

2 个答案:

答案 0 :(得分:1)

除非我们修补猎鹰的功能,否则使用内部猎鹰钩是不可能的。因为在猎鹰do not accept中挂钩任何参数都是如此。但是标准的装饰者可以做到这一点:

def Authorize(action):
    def request_checked(func):
        def _f(self, req, resp, *args, **kw):
            u = getUserInfoFromSession(req)
            if isAuthorizedTo(u.get('id'), action):
                return func(self, req, resp, *args, **kw)
            else:
                raise falcon.HTTPUnauthorized('Not Authorized', 'Permission Denied')
        return _f
    return request_checked

现在我们可以使用它了:

class Things:
    @Authorize('can_delete_tag')
    @on_get(req, resp):
        ...

答案 1 :(得分:1)

猎鹰1.3似乎有同样的限制!这是一个解决方案

import falcon


class HasPermission(object):
    def __init__(self, role_name):
        self.role_name = role_name

    def validate_has_role(self, req, resp, resource, params):
        raise falcon.HTTPBadRequest('Bad request')

并使用它.....

class Things:
    @Authorize('can_delete_tag')
@on_get(req, resp):
    ...

write_access = HasPermission("WRITE").validate_has_role
read_access = HasPermission("READ").validate_has_role