Сообщения 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")

После тестирования службы обмена сообщениями я обнаружил несколько вещей, которые, по моему мнению, не должны были произойти:

  1. messages.debug не сохраняется, я не могу его сохранить. (info/success/error ведет себя нормально).
  2. сообщения больше не сохраняются в хранилище пользовательской сессии после вызова кода requests.get(), хотя переданный объект запроса не изменяется (возвращается то же значение, что было передано через функцию).

Есть ли что-то, что я делаю неправильно? Есть ли решения? Заранее спасибо.

Вернуться на верх