【问题标题】:upload file to django server using curl使用 curl 将文件上传到 django 服务器
【发布时间】:2013-11-19 19:59:31
【问题描述】:

在 Django python 服务器上,我自定义了一个用户可以上传文件的 URL。现在,问题是当我点击浏览器时我能够成功上传文件,但是当我使用 curl 尝试同样的事情时,我无法这样做。

views.py

import json

from django.http import HttpResponse
from django.template import Context, RequestContext
from django.shortcuts import render_to_response, get_object_or_404

# -*- coding: utf-8 -*-
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse

from sdm.models import Document
from sdm.forms import DocumentForm

def lists(request):
   # Handle file upload
   if request.method == 'POST':
     form = DocumentForm(request.POST, request.FILES)
     if form.is_valid():
        newdoc = Document(docfile = request.FILES['docfile'])
        newdoc.save()

        # Redirect to the document list after POST
        return HttpResponseRedirect(reverse('sdm:lists'))

else:
    form = DocumentForm() # A empty, unbound form

# Load documents for the list page
documents = Document.objects.all()

# Render list page with the documents and the form
return render_to_response(
    'sdm/lists.html',
    {'documents': documents, 'form': form},
    context_instance=RequestContext(request)
)

....... ........... ........... ........

lists.html

 <!DOCTYPE html>
 <html>
 <head>
    <meta charset="utf-8">
    <title>Minimal Django File Upload Example</title>   
 </head>
 <body>
 <!-- List of uploaded documents -->
 {% if documents %}
    <ul>
    {% for document in documents %}
        <li><a href="{{document.docfile.url }}">{{ document.docfile.name }}</a></li>
    {% endfor %}
    </ul>
 {% else %}
    <p>No documents.</p>
 {% endif %}

    <!-- Upload form. Note enctype attribute! -->
    <form action="{% url sdm:lists %}" method="post" enctype="multipart/form-data">
        {% csrf_token %}
        <p>{{form.non_field_errors }}</p>
        <p>{{form.docfile.label_tag }} {{form.docfile.help_text }}</p>
        <p>
            {{ form.docfile.errors }}
            {{ form.docfile }}
        </p>
        <p><input type="submit" name="press" value="Upload" /></p>
    </form>
 </body>
</html> 

在浏览器上

在终端上,我试过了

 $ curl --request PUT --upload-file filename http://wings.spectrumserver/sdm/lists

 $ curl --form upload-file=filename  --form press=Upload 

 http:// wings. spectrumserver/sdm/lists

$ curl --upload-file filename http://wings.spectrumserver/sdm/lists
$ curl --upload-file filename press=upload http://wings.spectrumserver/sdm/lists

$ curl -H 'Expect:' -F data=@filename -F submit=Upload wings.spectrumserver/sdm/lists

// In all cases, No error but no file upload

我尝试了一些其他变体,但似乎没有任何效果。还有一些我尝试过的其他命令给出了“NO csrf token error”。我还尝试从 html filesetting.py 中删除 csrf token 条目,但没有任何效果。

我对 curl 和 python 都是新手。主要目的是使用一些python脚本上传文件。我想如果我可以通过 curl 上传,那么可以使用 curl 库在 python 脚本中复制相同的内容,所以如果这不起作用,那么任何人都可以建议一些 python 代码将文件上传到该服务器。

编辑:

$ curl -i -F name=press -F f13 wings.spectrumserver/sdm/lists
Warning: Illegally formatted input field!
curl: option -F: is badly used here
curl: try 'curl --help' or 'curl --manual' for more information

Edit2- Header Response(f13 是未包含的新文件)

$ curl -i http://wings.spectrumserver/sdm/lists

HTTP/1.1 200 正常
日期:格林威治标准时间 2013 年 11 月 7 日星期四 23:19:18 服务器:Apache/2.2.22 (Ubuntu)
变化:接受编码 内容长度:1263 内容类型:文本/html;字符集=utf-8

最小的 Django 文件上传示例

    <ul>

        <li><a href="/media/documents/2013/10/28/templates.zip">documents/2013/10
    /28/templates.zip</a></li>

        <li><a href="/media/documents/2013/11/07/list">documents/2013/11/07/list</a>
    </li>

        <li><a href="/media/documents/2013/11/07/f1">documents/2013/11/07/f1</a></li>

        <li><a href="/media/documents/2013/11/07/f12">documents/2013/11/07/f12</a></li>

        <li><a href="/media/documents/2013/11/07/hello.html">documents/2013/11
        /07/hello.html</a></li>

    </ul>


    <!-- Upload form. Note enctype attribute! -->
    <form action="/sdm/lists" method="post" enctype="multipart/form-data">

   <!--            
   -->        <p></p>
        <p><label for="id_docfile">Select a file</label> max. 42 megabytes</p>
        <p>

            <input type="file" name="docfile" id="id_docfile" />
        </p>
        <p><input type="submit" name="press" value="Upload" /></p>
    </form>
  </body>
</html> 

【问题讨论】:

标签: python django file-upload curl pycurl


【解决方案1】:

试试这样的:

curl -i --form docfile=@localfilename http://wings.spectrumserver/sdm/lists

如果不起作用,请发布您的标题响应。 -i 告诉 curl 打印标题响应。

【讨论】:

  • 试试这个curl -i --form docfile=@localfilename http://wings.spectrumserver/sdm/lists
  • 你能帮我用一个 python 脚本也用于相同的 .. pycurl 和下面建议的方法似乎行不通。可能是我在做一些破旧的事情,但如果你能想出一个很有帮助的 sn-p 的话
  • 我不太明白你能创建一个新问题吗?因为它们是不同的问题。无论如何考虑接受答案,以防它帮助你。
  • stackoverflow.com/questions/19853503/… 请看这里。这真的会有很大帮助。谢谢
【解决方案2】:

我认为是缺少 CSRF 令牌。

{% csrf_token %}

查看 django 文档Cross Site Request Forgery protection。 它是一个生成的令牌,以确保表单是从同一个域提交的。 您可以通过从模板中删除标签来禁用 CSRF 保护。 或尝试here 了解如何使用 curl 传递它。

顺便说一句,如果您只想使用 python 脚本上传,我建议您使用requests

url = 'http://wings.spectrumserver/sdm/lists'
files = {'file': open('file.ext', 'rb')}
r = requests.post(url, files=files)

【讨论】:

  • Now, problem is that I am successfully able to upload files when I hit the browser
  • 我什至不知道那到底是什么??你能告诉我该怎么做吗?
  • @yossi;但是,如果他处于调试模式并尝试通过 POST 提交文件,他将收到 CSRF 丢失的错误。这可能是原因,但我不确定。
  • &lt;form action="{% url sdm:lists %}" method="post" enctype="multipart/form-data"&gt; {% csrf_token %}他已经收录了。
【解决方案3】:

我无法用 curl 解决这个问题。

但是如果你会编程python3:

Django 具有跨站点引用伪造 (CSRF) 保护

您需要使用 CSRF cookie 和 FORM 中隐藏的 CSRF。

因此,您需要首先获取下载页面(如浏览器),提取 CSRF 并制作包含此数据的 POST。

并且 POST 必须是 multipart/form-data 格式。

在 Linux 机器中查看这种格式的一种方法:

1 - 创建一个 Django 上传页面,其中表单 ACTION 指向(比如)http://127.0.0.1:2222/

2 - 打开终端并执行: 数控-l 127.0.0.1 2222 &1 |少

3 - 在上传页面打开浏览器,在表单中填写一些要上传的小文本,然后按上传按钮。浏览器会报错,没问题...

4 - 在终端中,您将看到浏览器如何使用 POST 和 multipart/data-form 上传文件

实施解决方案:

5 - 检查链接 http://blog.spotflux.com/uploading-files-python-3,它使用 python3 以多部分/表单数据格式进行 POST。

6 - 您需要在此示例中进行一些更改以在帖子中包含 cookie。

使用 html.parser.HTMLParser 解析 HTML 页面。

它工作正常,但我无法发布代码。

我没有尝试使用 requests.get() 和 requests.post()。

【讨论】:

    猜你喜欢
    • 2013-06-24
    • 2013-12-14
    • 2015-12-15
    • 1970-01-01
    • 2020-05-18
    • 1970-01-01
    • 2018-03-14
    • 2017-12-27
    • 2012-07-20
    相关资源
    最近更新 更多