как мне перехватить urllib.error.HTTPError: Ошибка HTTP 403: запрещено? - PullRequest
0 голосов
/ 22 мая 2019

Я пишу приложение 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 исключение срабатывает очень хорошо, поэтому я подозреваю,это может быть как-то связано с флягой и / или uwsgi.

Ответы [ 2 ]

0 голосов
/ 22 мая 2019

Исключение работало как задумано.Моя цепочка Devops как проблема.

0 голосов
/ 22 мая 2019

Скорее всего, это проблема

connection = myLib.Login(username, password)

будучи асинхронным. myLib.Login, вероятно, порождает дочернюю нить. Родители не могут поймать исключения, воспитанные в их детях, поскольку у них есть их собственный контекст. Обратитесь к Перехватите исключение потока в потоке вызывающего в Python для получения дополнительной информации.

Edit:

Если вы хотите подождать («заблокировать») до тех пор, пока соединение не будет установлено, а затем решить, продолжать или прервать соединение, вы можете использовать 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, а затем поставить (). Вы также можете установить параметр тайм-аута для get (), что приведет к возникновению исключения, если по истечении времени в очереди нет элемента.

...