Django: MultiValueDictKeyError, когда я пытаюсь получить доступ к загруженному файлу - PullRequest
0 голосов
/ 11 июля 2020

Я пытаюсь создать простое Django веб-приложение, которое при отправке двух изображений создает еще один файл изображения, в котором оба изображения располагаются одно рядом с другим (сценарий join_pics ()) ниже.

Для простоты я просто хочу получить загруженный файл, запустить сценарий и вернуть файл пользователю в качестве загрузки. Нет сохранения файлов на SQL или на сервер. Я знаю, что мне нужно проверить формат и размер файла, и т. Д. c. Все это решается с помощью JS и отказоустойчивого сценария Python (который будет реализован).

Проблема в том, что я не могу получить доступ к загруженным файлам. Я пробовал несколько методов, просматривал различные руководства и другие сообщения здесь, в StackOverflow и других сайтах, и т. Д. c.

Вот мой код:

# forms.py

class ThingyForm(forms.Form):
    file1 = forms.CharField(label="file1", widget=forms.FileInput(), required=False)
    file2 = forms.CharField(label="file2", widget=forms.FileInput(), required=False)
    pwd1 = forms.CharField(label='Pwd1', max_length=32, widget=forms.PasswordInput(), required=False)
    pwd2 = forms.CharField(label='Pwd2', max_length=32, widget=forms.PasswordInput(), required=False)
# views.py:

def thingy(request):
    form = ThingyForm(request.POST or None, request.FILES or None)

    if str(request.method) == 'POST':
        if form.is_valid():
            print('Form Validated.') # Just to know that 
            pwd1 = form.cleaned_data['pwd1'] #a password in case the user wants to zip the file with a password
            pwd2 = form.cleaned_data['pwd2'] #the password is repeated in order to prevent typos
            if pwd1 == pwd2:
                file1 = form.cleaned_data['file1']
                file2 = form.cleaned_data['file2']
                if (str(file1) != '') and (str(file2) != ''):
                    messages.success(request, 'Procedure successful.')
                    c_file1 = request.FILES['file1'].read()
                    c_file2 = request.FILES['file2'].read()
                    join_pics(c_file1, c_file2, pwd1)


                else:
                    messages.error(request, 'You must provide two files.')
            else:
                messages.error(request, 'The passwords do not match. Please reenter them.')
        else:
            print('Errors ' + str(form.errors))
            messages.error(request, 'No bueno.')
    context = {
        'form': form
    }
    return render(request, 'thingy.html', context)

# urls.py:

from django.urls import path

from .views import index, thingy

urlpatterns = [
    path('', index, name='index'),
    path('thingy/', thingy, name='thingy'),
]

<!-- thingy.html: -->

{% load bootstrap4 %}
<!DOCTYPE html>
<html lang="en">
<head>
    {% bootstrap_css %}
    <meta charset="UTF-8">
    <title>Thingy</title>
</head>
<body>
    <div class="container">
        <h1>He need some milk!</h1>
        {% bootstrap_messages %}

        <form action="{% url 'thingy' %}" method="post" class="form" autocomplete="off" enctype="multipart/form-data">
            {% csrf_token %}
            {% bootstrap_form form %}
            {% buttons %}
                <button type="submit" class="btn btn-primary">MakeItSo</button>
            {% endbuttons %}
        </form>

    </div>

{% bootstrap_javascript jquery='full' %}
</body>
</html>

Когда я отправляю форму, я получаю следующую ошибку:

MultiValueDictKeyError at /thingy/

'message'

Request Method:     POST
Request URL:    http://localhost:8000/thingy/
Django Version:     3.0.8
Exception Type:     MultiValueDictKeyError
Exception Value:    

'message'

(...)
During handling of the above exception ('message'), another exception occurred: 

\views.py in thingy

                        c_file1 = request.FILES['file1'].read()

     

Итак, насколько я понимаю, request.FILES не возвращает правильные данные. Однако я не знаю, что делать, чтобы использовать недавно загруженные файлы. Я новичок в Django и считаю, что опубликовал все, что нужно, чтобы помочь найти ошибку, но я был бы рад опубликовать больше кода, если это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...