DreamerDreamのブログ

夢想家の夢です。〜揚げたてのモヤっとしたものをラフレシアと共に〜

Djangoの使い方⑭同じ画像アドレスでサーバー側から画像データを選んでレスポンスとして返す方法

僕は今までDjangoでWebアプリを作っていて画像ファイルはDjangoを介さずにサーバーソフトのApacheに設定したディレクトリにアクセスするようにしていました。

 

<Apacheのimgs/ディレクトリ設定>

f:id:DreamerDream:20190912092212p:plain

 

しかし例えば、ロボットの制御等でカメラを使う場合、Apacheで画像ファイルを指定する方法だとログインしていない部外者でも画像ファイルへのアクセス先を知っていたら見られちゃうんですよね。

 

ということで、今回の課題は

同じ画像アドレスへのアクセスで、サーバー側から任意のデータを渡す

です。

これが出来れば、例えば「ログインしていない人へは画像データを渡さない」等の制御が可能になりますね。

 

先にうまくいったviews.pyのコードを書いておきます。

※urls.pyまで書くと面倒なので割愛しますが、ホームディレクトリにアクセスしてきたらindexへ、imgにアクセスしてきたらimgへ通すよう設定しておきます。

<views.py>

from django.http.response import HttpResponse

file_img = '(イメージファイルの場所)'


def index(request):
  return HttpResponse('<h1>TOP</h1><img src="/img">')

 

def img(request):
  with open(file_img, 'rb') as f:
    binary = f.read()
  response = HttpResponse( binary , content_type = 'image/jpeg')
  #response['Content-Disposition'] = 'attachment; filename=hoge_img.jpg'
  return response

以上。プログラムはこれだけ。

 

実はDjangoに標準のHttpResponseで任意のデータを渡せるそうです。(今までHTMLの直書きファイルを返すためにあるものだと思ってました。)

 

画像ファイルを渡すポイントは「content_type」を指定しているところです。(Django v1.7以前はmine_typeとして指定していたそうで、古い情報だとmime-typeと書かれていました。現在mine_type指定は廃止されているそうです)

 

<参考>いろいろなcontent-type

Content-Typeの一覧 - Qiita

 

HttpResponseを使っていろんなデータが任意で返せるんですね。これは便利ー!

f:id:DreamerDream:20190912093317p:plain

 

このプログラムで/imgへ接続すると画像表示されます。

ちなみに、コメントアウトしている

['Content-Disposition'] = 'attachment; filename=hoge_img.jpg'

このattachmentを設定することで、直接/imgへアクセスするとブラウザで画像を開かず、任意のファイル名で画像をダウンロード出来るようにもなります。

 

indexへアクセスすると、HTMLの<img>タグを使って/imgを読み出しています。

 

このように意外と簡単に出来ちゃうことだったのですが、いろいろ調べるのに結構手間取ったので備忘録として残しておきます。

 

 前回記事

dreamerdream.hateblo.jp

 

次の記事

dreamerdream.hateblo.jp

 

kampa.me