繁体   English   中英

来自before_request的回应

[英]Response from before_request

在我的应用中,我试图检查用户是否被授权访问资源,例如,当用户请求url api / proxy时

我使用before_request调用检查功能

 @hook('before_request') 
 def check_permission():
     securityService = SecurityService(db=db)
     try:
         securityService.check_access_permission(request)
     except Exception as e:
        print("excepting")
        return json.dumps({'Error': str(e)})
        // stop execution here

访问检查的功能已经过测试,未授予访问权限时会引发异常。 即使在服务器日志中,我也可以看到“ exception”。 Return语句不会停止执行过程。

但是代码不会停止执行,而是继续执行proxy_get函数

@get('/api/proxy')
def proxy_get():
    response = proxyService.get()
    return json.dumps({"Response" : response})

有什么方法可以停止before_request函数中的请求处理,还是我只是搞砸了? 什么是正确的解决方案?

如何为该响应设置状态代码? 我试过了

response.status_code(401)

但是没有用。 我收到错误TypeError:“ int”对象不可调用

您可能应该为拒绝访问创建一个控制器,然后修改请求以重定向到该控制器。 因此,您的代码将如下所示:

@hook('before_request') 
def check_permission():
    securityService = SecurityService(db=db)
    try:
        securityService.check_access_permission(request)
    except Exception as e:
       request.environ['PATH_INFO'] = '/error_401'

@route('/error_401')
    response.body = json.dumps({'Error': str(e)}
    response.status = 401
    return response

我实际上从未使用过Bottle,所以这可能不是最好的方法,但是它可以与简单的测试代码一起使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM