1

我目前正在尝试将文件发布到用 django 编写的服务端点。

我可以找到一堆这样的例子(从这里发挥):

def upload_file(request):
    if request.method == 'POST':
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            handle_uploaded_file(request.FILES['file'])
            return HttpResponseRedirect('/success/url/')
     ........

但是我如何使用测试客户端urllib发出请求,当它不是来自 HTML 表单时,它可以将文件传递给服务器? 我目前正在尝试将文件内容urlencode为json字符串,然后将其传递;但事实证明这很麻烦。

除了下面的答案

  1. 不要忘记让您的服务 csrf 豁免
  2. 不要设置内容类型或将其显式设置为多部分。
  3. 有关如何在您的视图中处理传入文件的信息,请参阅此内容。
4

1 回答 1

1

正如 Goin 所说,使用Requests,您可以这样做:

>>> r = requests.post('https://api.github.com/user', auth=('user', 'pass'))
>>> r.status_code
200
>>> r.headers['content-type']
'application/json; charset=utf8'
>>> r.encoding
'utf-8'
>>> r.text
u'{"type":"User"...'
>>> r.json
{u'private_gists': 419, u'total_private_repos': 77, ...}

urllib2将是:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import urllib2

gh_url = 'https://api.github.com'

req = urllib2.Request(gh_url)

password_manager = urllib2.HTTPPasswordMgrWithDefaultRealm()
password_manager.add_password(None, gh_url, 'user', 'pass')

auth_manager = urllib2.HTTPBasicAuthHandler(password_manager)
opener = urllib2.build_opener(auth_manager)

urllib2.install_opener(opener)

handler = urllib2.urlopen(req)

print handler.getcode()
print handler.headers.getheader('content-type')

来源:github

在请求中发布多部分编码的文件很容易。来自官方文档:

>>> url = '/your/recieving/end'
>>> files = {'report.xls': open('report.xls', 'rb')}

>>> r = requests.post(url, files=files)
>>> r.text # response json
于 2012-07-25T21:59:30.717 回答