【问题标题】:django.utils.datastructures.MultiValueDictKeyError: 'myfile'django.utils.datastructures.MultiValueDictKeyError: 'myfile'
【发布时间】:2019-03-21 08:32:19
【问题描述】:

在handlig POST 请求期间,我收到标题中的错误。将request.FILES['myfile'] 更改为request.FILES.get('myfile') 没有帮助。我不知道为什么会这样。 我尝试过更改表单属性,但这也无济于事。

编辑:它必须在 java 脚本中,因为注释掉它会使 request.FILES['myfile'] 行通过。

我的看法:

def generate_random_user(request):
    if (request.method == 'POST'):
        text_info = request.POST.get('text_input')
        myfile = request.FILES['myfile']


        fs = FileSystemStorage()
        filename = fs.save(myfile.name, myfile)
        local_file_path = os.path.join(settings.MEDIA_ROOT, filename)

        album = Album(local_file_path, text_info)
        task = album.slice.delay(album)
        songs_titles = album.songs_titles

        #converted_files_urls = [fs.url(path) for path in songs_paths]
        return HttpResponse(json.dumps({'task_id': task.id}), content_type='application/json')

    return render(request, 'index.html')

索引html:

<html>
<head>
    <title>Celery Demo</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
</head>

<body style="text-align: center;">
<h1>Generate Random Users</h1>
<progress id="progress-bar" value="0" max="100" style="display:none; margin-bottom: 1em;"></progress>
<form method="post" enctype="multipart/form-data">
    {% csrf_token %}
    <input type="file" name="myfile">
    <br><textarea name="text_input" cols="40" rows="15" ></textarea>
    <br><button id="submit_btn" type="submit" align="center" >Upload and slice.</button>
</form>


<script type="text/javascript">
    var frm = $('form');
    var button = $('#submit_btn');
    var pgrbar = $('#progress-bar');
    button.click(function () {
        $.ajax({
            type: frm.attr('method'),
            url: frm.attr('action'),
            data: frm.serialize(),
            success: function (data) {
                if (data.task_id != null) {
                    get_task_info(data.task_id);
                }
            },
            error: function (data) {
                console.log("Something went wrong!");
            }
        });
        return false;
    });

    function get_task_info(task_id) {
        $.ajax({
            type: 'get',
            url: '/get-task-info/',
            data: {'task_id': task_id},
            success: function (data) {
                frm.html('');
                if (data.state == 'PENDING') {
                    frm.html('Please wait...');
                }
                else if (data.state == 'PROGRESS' || data.state == 'SUCCESS') {
                    pgrbar.css('display', 'inline');
                    pgrbar.val(data.result.percent);
                    frm.html('User created ' + data.result.current + ' out of ' + data.result.total);
                }
                if (data.state != 'SUCCESS') {
                    setTimeout(function () {
                        get_task_info(task_id)
                    }, 1000);
                }
            },
            error: function (data) {
                frm.html("Something went wrong!");
            }
        });
    }
</script>

</body>
</html>

完全错误:

[17/Oct/2018 09:44:12] "GET /generate-user/ HTTP/1.1" 200 3024
Internal Server Error: /generate-user/
Traceback (most recent call last):
  File "C:\Users\TommyYa\AppData\Local\Programs\Python\Python36\lib\site-packages\django\utils\datastructures.py", line 77, in __getitem__
    list_ = super().__getitem__(key)
KeyError: 'myfile'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\TommyYa\AppData\Local\Programs\Python\Python36\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "C:\Users\TommyYa\AppData\Local\Programs\Python\Python36\lib\site-packages\django\core\handlers\base.py", line 126, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Users\TommyYa\AppData\Local\Programs\Python\Python36\lib\site-packages\django\core\handlers\base.py", line 124, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "D:\Programowanie\PYTHON\Django\DivideAudio\audio_app\views.py", line 15, in generate_random_user
    myfile = request.FILES['myfile']
  File "C:\Users\TommyYa\AppData\Local\Programs\Python\Python36\lib\site-packages\django\utils\datastructures.py", line 79, in __getitem__
    raise MultiValueDictKeyError(key)
django.utils.datastructures.MultiValueDictKeyError: 'myfile'
[17/Oct/2018 09:44:26] "POST /generate-user/ HTTP/1.1" 500 16547

网址格式:

urlpatterns = [
    path('admin/', admin.site.urls),
    path('generate-user/', views.generate_random_user),
    path('get-task-info/', views.get_task_info),
]

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

【问题讨论】:

    标签: django forms file-upload


    【解决方案1】:

    首先,看看 javascript 发送了什么值:试试:

    <script type="text/javascript">
        var frm = $('form');
        var button = $('#submit_btn');
        var pgrbar = $('#progress-bar');
        button.click(function () {
            $.ajax({
                type: frm.attr('method'),
                url: frm.attr('action'),
                data: frm.serialize(),
           **alert(data) // see the data pass or console.log(data)**
                success: function (data) {
                    if (data.task_id != null) {
                        get_task_info(data.task_id);
                    }
                },
                error: function (data) {
                    console.log("Something went wrong!");
                }
            });
            return false;
        });
    

    检查输出数据是否正确。

    【讨论】:

    • 数据是一个带有文本字段的对象:内部服务器错误;状态码:500
    • 错误是什么?查看 apache 日志并获取导致此问题的主要错误。
    • 这个对象的错误就像标题中一样:django.utils.datastructures.MultiValueDictKeyError: 'myfile'
    • 发布你的完整错误日志,问题似乎不是来自上面的代码。忘记javascript。
    • 请把你的表单操作 url 和 urls.py
    【解决方案2】:

    因为我没有正确声明 post 元素而遇到这个问题

    【讨论】:

    • 这并不能真正回答问题。如果您有其他问题,可以点击 提问。要在此问题有新答案时收到通知,您可以follow this question。一旦你有足够的reputation,你也可以add a bounty 引起更多的关注。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 2011-02-04
    • 2012-07-15
    • 2014-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多