Возврат рендеринга в представление из другой функции в django

Я создаю простую веб-страницу. Мне нужно запросить ввод, определить его тип, выполнить некоторую обработку и вернуть несколько значений. У меня есть два представления, одно из которых имеет простую форму с запросом на ввод, а другое:

def processedframe(request):
    frame = request.POST['frame']
    try: 
        if frame.startswith('>RUS08'):        
            try:
                # Frame procesing(a lot)
                return render(request, 'frame.html', {'values': values)
            except:
                return HttpResponse("Processing error")
        else:
            return HttpResponse("Invalid frame")
    except:
        return HttpResponse("Invalid input")

Проблема в том, что у меня есть +30 типов кадров с разными вещами для обработки. Я хочу сделать одну внешнюю функцию в другой папке для каждого типа кадра, и вернуть рендер из функции.

Я уже пробовал сделать отдельную папку с функциями и импортировать ее в views.py. Это сработало нормально, потому что он смог войти в обработку кадра для функции, но когда я попытался вернуть рендер из функции, я получил ошибку, потому что views.py ничего не возвращал. Я также попытался выполнить рендеринг из views.py, но не смог получить доступ к значениям из функции.

Я также пробовал поместить код для обработки кадра внутри функции processedframe

try:
     # HERE
      return render(request, 'frame.html', {'values': values)

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

Кто-нибудь делал что-то подобное?

Похоже, что вы хотите сделать что-то вроде декоратора, поэтому:

def frame_processor(prefix, template_name='frame.html'):
    def decorator(func):
        def processedframe(request, *args, **kwargs):
            try:
                frame = request.POST['frame']
                assert frame.startswith(prefix)
                try:
                    return render(
                        request,
                        template_name,
                        {'values': func(request, frame, *args, **kwargs)},
                    )
                except:
                    return HttpResponse('Processing error', status_code=500)
            except (KeyError, AssertionError):
                return HttpResponse('Invalid frame', status_code=400)
            except:
                return HttpResponse('Invalid input', status_code=400)

        return processedframe

    return decorator

Затем вы можете украсить представление с помощью:

@frame_processor('>RUS08')
def my_view(request, frame):
    # determine value
    return value

Не то, что я хотел, но я спросил ChatGPT и он помог мне решить мою проблему хаха

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