从Python客户端上传文件到Django服务器

1 投票
4 回答
2006 浏览
提问于 2025-04-17 20:44

我正在尝试从一个Python客户端上传一些文件到一个Django网页应用。

我可以通过使用表单来完成这个操作,但我不知道如何通过一个独立的Python应用来实现。你能给我一些建议吗?

我在Django模型中这样定义文件:

class Media(models.Model):
    post = models.ForeignKey(Post)
    name = models.CharField(max_length=50, blank=False,null=False)
    mediafile = models.FileField(upload_to=media_file_name, blank=False,null=False)

谢谢。

4 个回答

-1
file = request.FILES['file']

load_file = FileSystemStorage()

filename = load_file.save(file.name, file)  // saving in local directory and getting filename

data = {'name': name, 'address': address, 'age':age }

fr_data = None
with open(filepath ,'rb') as fr:
    fr_data += fr.read()

url = 'http://127.0.0.1:8000/api/'

response = requests.post(url=url, data=data, files= {
                          'filefiledname': fr_data
                          }
                         )

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

1

使用requests库:

with open('file') as f:
    requests.post('http://some.url/upload', data=f)
2

你想要做的是向Django应用发送一个POST请求,并在请求中附带一个文件。

你可以使用Python的标准库中的httplib模块,或者使用第三方的requests模块。最后一个链接展示了如何发送一个多部分编码的文件,这可能正是你需要的。

希望这对你有帮助!

0

现在这个程序正在运行,使用的是Python的requests模块。

我会把代码放出来,供有兴趣的人参考...

Django服务器...

urls.py文件

...
url(r'^list/$', 'dataports.views.list', name='list'),
...

views.py文件

@csrf_exempt
def list(request):
    # Handle file upload
    if request.method == 'POST':
        print "upload file----------------------------------------------"
        form = DocumentForm(request.POST, request.FILES)
        if form.is_valid():
            print "otra vez.. es valido"
            print request.FILES

            newdoc = Jobpart(
                                partfile = request.FILES['docfile']
            )
            newdoc.save()

            # Redirect to the document list after POST
            return HttpResponseRedirect(reverse('dataports.views.list'))
    else:
        #print "nooooupload file----------------------------------------------"
        form = DocumentForm() # A empty, unbound form


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

list.html文件

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Minimal Django File Upload Example</title>   
    </head>

    <body>
        <!-- Upload form. Note enctype attribute! -->
        <form action="{% url "list" %}" method="post" enctype="multipart/form-data">
            <p>
                {{ form.docfile }}
            </p>
            <p><input type="submit" value="Upload" /></p>
        </form>

    </body>

</html> 

现在来看客户端的部分。

client.py文件

import requests
url = "http://localhost:8000/list/"
response = requests.post(url,files={'docfile': open('test.txt','rb')})

现在你可以添加一些安全措施和其他功能了……不过其实这是一个非常简单的例子。

谢谢大家!!!!

撰写回答