appengineアプリからdotcloudでホストされている外部(django)APIにマルチパートPOSTリクエストを送信しようとしています。リクエストにはテキストとファイル(pdf)が含まれており、次のコードを使用して送信されます
from google.appengine.api import urlfetch
from poster.encode import multipart_encode
from libs.poster.streaminghttp import register_openers
register_openers()
file_data = self.request.POST['file_to_upload']
the_file = file_data
send_url = "http://127.0.0.1:8000/"
values = {
'user_id' : '12341234',
'the_file' : the_file
}
data, headers = multipart_encode(values)
headers['User-Agent'] = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
data = str().join(data)
result = urlfetch.fetch(url=send_url, payload=data, method=urlfetch.POST, headers=headers)
logging.info(result.content)
このメソッドを実行すると、Appengineは次の警告を表示します(問題に関連しているかどうかはわかりません)
Stripped prohibited headers from URLFetch request: ['Content-Length']
そして、Djangoは次のエラーを送信します
<class 'django.utils.datastructures.MultiValueDictKeyError'>"Key 'the_file' not found in <MultiValueDict: {}>"
djangoコードは非常にシンプルで、postmanchrome拡張機能を使用してファイルを送信すると機能します。
@csrf_exempt
def index(request):
try:
user_id = request.POST["user_id"]
the_file = request.FILES["the_file"]
return HttpResponse("OK")
except:
return HttpResponse(sys.exc_info())
追加した場合
print request.POST.keys()
ファイルがファイルとして送信されていないことを示すuser_idとthe_fileを含む辞書を取得します。私がファイルに対して同じことをした場合、すなわち
print request.FILES.keys()
空のリスト[]を取得します。
編集1:
誰かの提案を実装するように質問を変更しました1が、それでも失敗します。グレンが送信したリンクで推奨されているヘッダーの追加も含めましたが、喜びはありませんでした。
編集2:
また、のバリエーションとしてthe_fileを送信してみました
the_file = file_data.file
the_file = file_data.file.read()
しかし、同じエラーが発生します。
編集3:
djangoアプリを次のように編集してみました
the_file = request.POST["the_file"]
ただし、ファイルをローカルに保存しようとすると
path = default_storage.save(file_location, ContentFile(the_file.read()))
それは失敗します
<type 'exceptions.AttributeError'>'unicode' object has no attribute 'read'<traceback object at 0x101f10098>
同様に、(appengineアプリでアクセスできるように)the_file.fileにアクセスしようとすると、
<type 'exceptions.AttributeError'>'unicode' object has no attribute 'file'<traceback object at 0x101f06d40>