django でSSLを扱いたい

とあるきっかけで知り合いのネットショップ構築を手伝うことになった。ただし、専業じゃなくて実店舗のおまけみたいで、あまりお金をかけるつもりはないみたい。じゃあ django で作ろうと短絡的に考えたんだけども、ネットショップについて全然知らない。とりあえず思いつく機能としては、これくらいかなあ。

  1. 商品が一覧できる。
  2. 商品をカートに入れておくことができる。
  3. 商品を購入できる。

1個目は問題ない。2個目もセッションを使えばいけるだろう。問題は3つ目。django はSSLを扱えるのか?そもそもSSLをよく知らないので、そこから調べる必要があるかな。



まずは django + SSL で検索してみた。

ミドルウェアを使う方法だと、POSTができない?
Google グループを見ると、特になにもしなくてもいいみたいなことが書いてある。



それならということで試してみた。SSLの環境がないので、CORESERVERの共有SSLというやつを使う。

https://ss1.coressl.jp/www.example.com/ みたいに、自分のドメインをくっつけてやれば使えるらしい。たとえば https://ss1.coressl.jp/djangoauthapi.reguzy.jp/ とか。



たしかにブラウザ上はSSLになっているが、静的ファイルが見つからない。
https://ss1.coressl.jp/site_media/img/django.gif とかを探してるようだ。
https://ss1.coressl.jp/djangoauthapi.reguzy.jp/site_media/img/django.gif なら見つかる。



じゃあSSLかどうかビューとかで見分けて、絶対パスで記述してやればいいか、と考えたんだけどもうまくいかない。ミドルウェアとかを参考にSSLかどうか判断できそうなコードを書いたけどだめだった。共有SSLだからだめなのかなあ?あとで調べよう。

from django.http import HttpResponse, get_host
from django.shortcuts import render_to_response

def test(request):
    if 'HTTP_X_FORWARDED_SSL' in request.META:
        ssl = request.META['HTTP_X_FORWARDED_SSL']
    else:
        ssl = 'not_exists_ssl'
    host = get_host(request)
    secure = request.is_secure()
    import os
    https = os.environ.get('HTTPS','not_exists_https')
           
    return render_to_response('index.html', {
        'ssl' : ssl,
        'host':host,
        'secure':secure,
        'https':https
    })
----
output
ssl = 'not_exists_ssl'
host = djangoauthapi.reguzy.jp
secure = False
https = not_exists_https