LoginSignup
1
1

More than 3 years have passed since last update.

Djangoで画像をURL化するなんちゃってAPIを作ってみた

Last updated at Posted at 2020-04-06

今回は、画像ファイルを載せてPOSTリク送れば、https化されたURLを生成してくれるよってやつ作ってみました。
まだまだ試行錯誤中ですが、完成したものがこちらです(PC用サイトになります):basketball_player_tone3:
なんちゃってAPI
ちなみに、使い方やコードサンプルも乗っています:v:

やりたいこと

DjangoでファイルをPOSTで受け取りたい。
受け取ったファイルに対してのURLを発行したい。

意外と簡単だったので、ローカルで実装して紹介したいと思います。

プロジェクトの作成

bash
$ django-admin startproject app

これで、フレームが完成します。次にPOSTリクエストを受け取って処理するアプリの雛形を作成します。postという名前でいきましょう。

bash
$ cd app
$ django-admin startapp post

POSTリクエストで画像を受け取る

#post/views.py
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で宣言してあげなければなりません。

#app/settings.pyに追記
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

これで/media以下にファイルが保存されていきます。

ルーティングの設定

最後にurls.pyでルーティングを決めていきます。

#app/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とか無駄なものは省きます。画像をディレクトリから取り出してみるには、最後の二行がとっても重要になります:relaxed:

#post/urls.py
from django.urls import path, include
from . import views

app_name = "post"

urlpatterns = [
    path('', views.get_img, name = "img_get"),
]

先ほど書いたViewにつなげてあげます。これで完成:wine_glass:
 

テストしてみた

test.py
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の該当箇所も変えてください。
成功すると、

bash
{'url': 'http://127.0.0.1:8000/media/sample.jpeg'}

こんな感じのレスポンスが。アクセスしてみよう!
スクリーンショット 2020-04-06 22.24.48.png

うまくいきました。なんちゃってAPIの完成です:bicyclist:

最後に

実際、Djangoで画像ファイルとかを保存して使いたいって時があると思うので参考にしていただけると幸いです。ありがとうございました:joy:

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1