naritoブログ

このブログはDjangoとBootstrap4で作成されました
ソースコード

Python、requestsを使ったアップロード

プログラミング関連 Requests Python 約575日前
2016年3月21日15:39
requestsを使ったアップロードの例です


このように、非常に簡単に行えます
import requests

url = "http://test.com/api/image/"
files = {'upload_file': open("test.png", "rb")}
res = requests.post(url, files=files)



例えば、これをDjangoで受け取りたい場合は以下のようになります
非常にシンプルな例です
from django.http import HttpResponse
from django.views.decorators.http import require_POST
from django.views.decorators.csrf import csrf_exempt
from .models import Photo


@require_POST
@csrf_exempt
def receive_image(request):
    upload_file = request.FILES["upload_file"]
    photo = Photo(title="タイトル", image=upload_file)
    photo.save()
    download_url = "http://test.com/media/" + photo.image.name
    return HttpResponse(download_url, content_type="text/plain")



このデコレータをつけると、CSRF 対策のチェックが無効化されます
具体的には、{% csrf_token %}がなくても動くようになります
外部に公開したい場合やajax等で、やむを得ず使用することがあります
@csrf_exempt


今回はタイトルと画像の2つだけを持つ、Photoモデルを使用しました
upload_file = request.FILES["upload_file"]
image_data = Photo(title="タイトル", image=upload_file)
image_data.save()


ダウンロード用のURLを作成し、それをHttpResponseで返しています。単純にtext/plainです
requestsだと、response.textで画像URLがわかるようになります
download_url = "http://test.com/media/" + photo.image.name
return HttpResponse(download_url, content_type="text/plain")


url部分は、いくつか作成方法があります。
from urllib import parse
...
...
parse_url = parse.urlparse(request.build_absolute_uri())
parse_url = parse_url._replace(path=photo.image.url)
url = parse.urlunparse(parse_url)
return HttpResponse(url, content_type="text/plain")



from django.contrib.sites.shortcuts import get_current_site
...
...
current_site = get_current_site(request)
domain = current_site.domain
download_url = '{0}://{1}{2}'.format(
    'https' if request.is_secure() else 'http',
    domain,
    photo.image.url,
)


参考
http://docs.python-requests.org/en/master/user/quickstart/