Сообщения Django не сохраняются при вызове нового запроса внутри представления
Я пытаюсь сделать систему сообщений/логирования, в которой пользователь/фронтэнд может получить статус выполнения процесса, запущенного в потоке, который он инициировал (что он начал, на каком этапе находится процесс, успешно ли он завершился, или, если произошла ошибка, передать сообщение об ошибке). Уже существует механизм логирования, который сохраняет информацию в .log-файл, но поскольку я хочу, чтобы она отправлялась пользователю, который ее запросил, я использовал django.messages.
Я установил настройки django следующим образом:
INSTALLED_APPS = [
...
'django.contrib.messages',
...
]
MIDDLEWARE = [
...
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
...
]
TEMPLATES = [
{
...
'OPTIONS': {
'context_processors': [
...
'django.contrib.messages.context_processors.messages',
...
],
},
},
]
MESSAGE_STORAGE = 'django.contrib.messages.storage.session.SessionStorage'
и у меня такой вид:
from django.contrib import messages
from django.contrib.messages import get_messages
from django.shortcuts import render, redirect
from django.contrib.auth.models import User
from threading import Thread
from .logging_view_testing import try_catch
import logging
def index(request):
if(True):
thread = Thread(target=function_one, args=(request, ))
thread.start()
message_list = []
storage = get_messages(request)
for message in storage:
message_list.append(message)
storage.used = False
tag_filter = request.GET.get('tag', None)
if tag_filter:
message_list = [message for message in message_list if tag_filter in message.tags.split()]
context = {
'username' : username,
'messages': message_list,
}
return render(request, 'logging.html', context)
def function_one(request):
try:
try_catch(request)
raise Exception("error executing function")
except Exception as exc:
print("0")
messages.error(request, f"ERROR: {str(exc)}")
print(f"{str(exc)}")
logging.debug(exc)
который вызывает функцию из другого представления:
from django.contrib import messages
import logging
def try_catch(request):
try:
try:
message = "try_catch"
messages.info(request, f"INFO: {message}")
logging.debug(message)
// not working after this line of code
response = requests.get('https://', params={})
messages.info(request, "INFO: got response")
raise Exception("error executing function")
except Exception as exc:
messages.error(request, f"ERROR: {str(exc)}")
print(f"{str(exc)}")
logging.debug(exc)
raise Exception("error executing function")
except Exception as exc:
messages.error(request, f"ERROR: {str(exc)}")
print(f"{str(exc)}")
logging.debug(exc)
это html/шаблон:
<section> {% if messages %} <table class="messages">
<tbody> {% for message in messages %} <tr{% if message.tags %} class="{{ message.tags }}" {% endif %}>
<td>{{ message }}</td>
</tr> {% endfor %} </tbody>
</table> {% endif %}
</section>
Обратите внимание, что есть такой код:
// not working after this line of code
response = requests.get('https://', params={})
messages.info(request, "INFO: got response")
После тестирования службы обмена сообщениями я обнаружил несколько вещей, которые, по моему мнению, не должны были произойти:
- messages.debug не сохраняется, я не могу его сохранить. (info/success/error ведет себя нормально).
- сообщения больше не сохраняются в хранилище пользовательской сессии после вызова кода requests.get(), хотя переданный объект запроса не изменяется (возвращается то же значение, что было передано через функцию).
Есть ли что-то, что я делаю неправильно? Есть ли решения? Заранее спасибо.