Приложение Django продолжает падать после исключения, пока не будет перезапущено - PullRequest
0 голосов
/ 24 сентября 2019

Я использую Django + uWSGI + nginx для обслуживания приложения.Все запросы от внешнего интерфейса являются почтовыми запросами.

Поведение :В приведенном ниже фрагменте кода функция convert_data подключается к базе данных и преобразует запрос в соотв.

class ConvertDataView(View):
    def post(self, *args, **kwargs):
        request = json.loads(args[0].body.decode())
        resp = api_utils.convert_data(request)
        if resp:
            return JsonResponse(resp, safe=False)
        return JsonResponse({}, status=404)

Когда входные данные содержат недопустимые символы, такие какas \, ', "etc, convert_data вызывает исключение. Это варьируется от базы данных к базе данных, но это форма" Запрос недействителен. ".

Проблема :Все последующие запросы к этому ядру / потоку продолжают отказывать, даже если ввод правильный и НЕ содержит недопустимых символов.Такое поведение приводит к тому, что приложение работает нестабильно и передает информацию, когда запрос переходит к другому ядру / потоку, но завершается ошибкой, когда дело доходит до этого «поврежденного ядра / потока».

Эта ошибка будет повторяться до перезапуска сервера uwsgi.После перезапуска сервера uwsgi приложение снова работает нормально.

Вещи, которые, кажется, работают :Если я выполню обработку исключений в ConvertDataView , эта проблема, похоже, останется.Однако, кажется, что если я выполняю обработку исключений в convert_data и всегда отправляю верный ответ, а не вызывает ошибку, эта ошибка не возникает.

Вещи, которые я пробовал :

  • Сначала я думал, что ошибка может быть из-за сбоя teradata.Однако я подключил convert_data к другим базам данных и все еще происходит.
  • Тогда я подумал, что, возможно, python повторно использует тот же драйвер базы данных.Но, глядя на место в памяти объекта драйвера, можно увидеть другое место в памяти.Это означает, что создается новый объект базы данных, что является ожидаемым поведением.
  • Я попытался заменить uwsgi на сервер разработки django.Но, похоже, что в этом случае ответ всегда будет поврежден, пока сервер не будет перезапущен.

Я не знаю, произойдет ли это поведение при ошибках, не связанных с базой данных, таких как KeyError, IndexError и т. Д..

Я боюсь публиковать больше исходного кода, так как он проприетарный, но отвечу на любые вопросы, насколько мне известно.

...