今回は、画像ファイルを載せてPOSTリク送れば、https化されたURLを生成してくれるよってやつ作ってみました。
まだまだ試行錯誤中ですが、完成したものがこちらです(PC用サイトになります)
→なんちゃってAPI
ちなみに、使い方やコードサンプルも乗っています
#やりたいこと
DjangoでファイルをPOSTで受け取りたい。
受け取ったファイルに対してのURLを発行したい。
意外と簡単だったので、ローカルで実装して紹介したいと思います。
#プロジェクトの作成
$ django-admin startproject app
これで、フレームが完成します。次にPOSTリクエストを受け取って処理するアプリの雛形を作成します。postという名前でいきましょう。
$ cd app
$ django-admin startapp post
#POSTリクエストで画像を受け取る
from django.shortcuts import render
import json
from django.http.response import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from django.http import HttpResponse
from django.core.files.storage import default_storage
# Create your views here.
@csrf_exempt
def get_img(request):
if request.method == "POST":
# ← 受け取ったPOST画像データを保存
res, file_name = save(request.FILES["image_file"])
res = request.build_absolute_uri(res) #絶対pathに基づくURLの作成
else: # ← methodが'POST'ではない = 最初のページ表示時の処理
return HttpResponse("this is post page!")
ret = {"url": res}
# JSONに変換して戻す
return JsonResponse(ret)
def save(data):
file_name = default_storage.save(data.name, data)
return default_storage.url(file_name), data.name
#受け取ったファイルをストレージに保存
ストレージってどこぞやって思ったかもしれません。settings.pyで宣言してあげなければなりません。
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
これで/media以下にファイルが保存されていきます。
#ルーティングの設定
最後にurls.pyでルーティングを決めていきます。
from django.urls import path, include
from django.contrib import admin
from . import settings
from django.contrib.staticfiles.urls import static
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns = [
path('post/', include('post.urls',namespace='post')),
]
urlpatterns += staticfiles_urlpatterns()
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
#/media以下のファイルをhttp経由で表示するために追加
今回adminとか無駄なものは省きます。画像をディレクトリから取り出してみるには、最後の二行がとっても重要になります
from django.urls import path, include
from . import views
app_name = "post"
urlpatterns = [
path('', views.get_img, name = "img_get"),
]
先ほど書いたViewにつなげてあげます。これで完成
#テストしてみた
import requests
import json
#POSTするURL設定
post_url = "http://127.0.0.1:8000/post/"
#POSTするファイルの読込
files = { "image_file": open('./sample.jpeg', 'rb') }
#POST送信
response = requests.post(
post_url,
files = files,)
print(json.loads(response.text))
こんな感じでPOSTできます。image_fileの名前は変更するときは、views.pyの該当箇所も変えてください。
成功すると、
{'url': 'http://127.0.0.1:8000/media/sample.jpeg'}
うまくいきました。なんちゃってAPIの完成です
#最後に
実際、Djangoで画像ファイルとかを保存して使いたいって時があると思うので参考にしていただけると幸いです。ありがとうございました