Django Загрузка файлов из формы получает CSRF Forbidden на производстве
У меня есть простая Django FileForm для загрузки нескольких файлов (в основном txts с координатами полигонов). Я не хочу сохранять загруженные файлы где-либо, а только обрабатывать их на лету (память?) и возвращать карту с полигонами и новый мой файл (который преобразует и экспортирует все txts в файл формата .dxf (совместимый с CAD)).
Я сделал всю логику и моя программа, кажется, работает нормально на разработке, но на производстве (Heroku) когда я нажимаю кнопку submit на моей форме, я продолжаю получать сообщение CSRF Forbidden 403. Я очень расстроен. Я использовал декораторы csfr (csrf_exempt, requires_csrf_token, ensure_csrf_cookie) в моих представлениях, но ни один из них не работает. Я включил enctype="multipart/form-data"> и {% csrf_token %} в шаблоне формы.
В чем проблема? Мне трудно тестировать и пробовать, потому что на этапе разработки все в порядке, и мне приходится каждый раз разворачивать систему, только чтобы посмотреть, работает ли другой подход.
Это потому, что я не сохраняю файлы на модели и на диске (какова логика здесь?), или потому, что я что-то упускаю в части CSRF в моих настройках?
settings.py (при развертывании)
forms.py
class UploadFileForm(forms.Form):
files = forms.FileField(widget=forms.ClearableFileInput(attrs={'multiple': True}))
html
<div class="row justify-content-center align-items-center text-center" style="padding-top: 30px; width: 500px; margin: auto;">
<fieldset name="Multiple Files Upload">
<form method="post" action="/draw-polygons/" enctype="multipart/form-data">{% csrf_token %}
<dl><input class="form-control" type="file" id="formFileMultiple" name="files" required multiple></dl>
<button type="submit" class="btn btn-outline-dark" style="margin-top: 10px;">Φόρτωση</button>
</form>
</fieldset>
</div>
view.py
def upload_multiple_files(request):
if request.method == 'POST':
form = UploadFileForm(request.POST, request.FILES)
files_list = request.FILES.getlist('files')
if form.is_valid():
for f in files_list:
try:
'''my code here'''
except:
'''my code here'''
'''my code here'''
return render(request, "multiple/success.html", context)
else:
form = UploadFileForm()
return render(request, 'multiple/multiple.html', {'title': 'myKAEK.gr | Draw Polygons', 'form': form})
def txt_dxf(request):
topos = cache.get('topos')
doc = ezdxf.new("R2000")
msp = doc.modelspace()
doc.layers.add('POLYS_FROM_TXTS')
for i in topos:
msp.add_lwpolyline(i, dxfattribs={"layer": "POLYS_FROM_TXTS"})
out = io.BytesIO()
doc.write(out, fmt='bin')
out.seek(0)
return FileResponse(out, as_attachment=True, filename='polygons_from_txt.dxf')
urlpatterns = [
path('draw-polygons/', views.upload_multiple_files, name='upload_multiple_files'),
path('draw-polygons/export_dxf/', views.txt_dxf, name='txt_dxf'),
]
Попробуйте сделать это с помощью Django Forms, это избавит вас от написания лишнего кода и будет обрабатывать такие крайние случаи.
https://docs.djangoproject.com/en/4.1/topics/http/file-uploads/#uploading-multiple-files