【问题标题】:how do I catch urllib.error.HTTPError: HTTP Error 403: Forbidden?如何捕获 urllib.error.HTTPError: HTTP Error 403: Forbidden?
【发布时间】:2019-05-22 13:40:26
【问题描述】:

我正在编写一个 Flask 应用程序,我在其中调用了一个可能返回 403 的方法。我认为以下代码可以适当地处理该错误:

try:
    connection = myLib.Login(username, password)
except urllib.error.HTTPError as err:
    abort(err.code)

但这似乎不起作用。如果 myLib.Login 返回 403,我会得到以下信息:

[2019-05-22 15:22:15,798] ERROR in app: Exception on /api/users [POST]
Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 2292, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1815, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1718, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/local/lib/python3.7/site-packages/flask/_compat.py", line 35, in reraise
    raise value
  File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1813, in full_dispatch_request
    rv = self.dispatch_request()
  File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1799, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "./app/routes.py", line 16, in authenticate
    connection = myLib.Login(username, password)

  File "/usr/local/lib/python3.7/site-packages/mylib.py", line 90, in __open
    resp = opener.open(req)
  File "/usr/local/lib/python3.7/urllib/request.py", line 531, in open
    response = meth(req, response)
  File "/usr/local/lib/python3.7/urllib/request.py", line 641, in http_response
    'http', request, response, code, msg, hdrs)
  File "/usr/local/lib/python3.7/urllib/request.py", line 569, in error
    return self._call_chain(*args)
  File "/usr/local/lib/python3.7/urllib/request.py", line 503, in _call_chain
    result = func(*args)
  File "/usr/local/lib/python3.7/urllib/request.py", line 649, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 403: Forbidden

如何捕获此错误并返回 403?

在常规 Python 脚本中,异常触发很好,所以我怀疑这可能与 flask 和/或 uwsgi 有关。

【问题讨论】:

标签: python flask uwsgi


【解决方案1】:

这很可能是一个问题

connection = myLib.Login(username, password)

是异步的。 myLib.Login 可能会产生一个子线程。由于他们有自己的上下文,父母无法捕捉到孩子提出的异常。 更多信息请参考Catch a thread's exception in the caller thread in Python

编辑:

如果你想等待(“阻塞”)直到连接建立后再决定是继续还是中止,你可以使用queues来建立线程间的通信:

import queue
notifierQueue = queue.Queue()
connection = myLib.Login(username, password, notifierQueue)

response = notifierQueue.get(block=True)
if response [some condition]: 
    abort(err.code)
else:
    do whatever

Queue.get() 将阻塞设置为 true(默认)将等待队列中的项目可用。处理 HTTPError 需要在 Login 部分然后 put() 中进行。您还可以为 get() 设置超时参数,如果在时间结束后队列中没有元素,则会引发异常。

【讨论】:

  • 我认为这不是问题,但我会检查一下。考虑到如果连接成功,flask 函数返回 200 OK,如果发生 403 错误,则返回 500,我假设它不是完全异步的。
  • 会不会和uwsgi和/或flask有关?如果我编写一个简单的 python 脚本,异常触发就好了
【解决方案2】:

异常按预期工作。我的 devops 链是问题所在。

【讨论】:

    猜你喜欢
    • 2021-04-02
    • 1970-01-01
    • 2021-01-24
    • 2021-08-01
    • 1970-01-01
    • 2020-09-28
    • 1970-01-01
    • 1970-01-01
    • 2022-12-04
    相关资源
    最近更新 更多