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/')
     ........

しかし、HTMLフォームから送信されていないときにサーバーにファイルを渡すことができるテストクライアントまたはurllibのいずれかを使用してリクエストを行うにはどうすればよいですか? 私は現在、ファイルの内容をjson文字列にurlencodeしてから、それを渡そうとしています。しかし、それは面倒であることが証明されています。

以下の回答に加えて

  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 に答える