Возврат рендеринга в представление из другой функции в 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 и он помог мне решить мою проблему хаха