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