僕は今までDjangoでWebアプリを作っていて画像ファイルはDjangoを介さずにサーバーソフトのApacheに設定したディレクトリにアクセスするようにしていました。
<Apacheのimgs/ディレクトリ設定>
しかし例えば、ロボットの制御等でカメラを使う場合、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
HttpResponseを使っていろんなデータが任意で返せるんですね。これは便利ー!
このプログラムで/imgへ接続すると画像表示されます。
ちなみに、コメントアウトしている
['Content-Disposition'] = 'attachment; filename=hoge_img.jpg'
このattachmentを設定することで、直接/imgへアクセスするとブラウザで画像を開かず、任意のファイル名で画像をダウンロード出来るようにもなります。
indexへアクセスすると、HTMLの<img>タグを使って/imgを読み出しています。
このように意外と簡単に出来ちゃうことだったのですが、いろいろ調べるのに結構手間取ったので備忘録として残しておきます。
前回記事
次の記事