【Django1.7.3】 ImportError: No module named security
対象バージョン:Django1.7.3
環境:Mac OS X 10.9.5
python manage.py runserver 127.0.0.1:8000 してブラウザで確認したら、
A server error occurred. Please contact the administrator.
というエラーメッセージが表示された。
DEBUGのログを見ると、
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/wsgiref/handlers.py", line 85, in run
self.result = application(self.environ, self.start_response)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/contrib/staticfiles/handlers.py", line 64, in __call__
return self.application(environ, start_response)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/handlers/wsgi.py", line 168, in __call__
self.load_middleware()
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/handlers/base.py", line 44, in load_middleware
mw_class = import_string(middleware_path)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/utils/module_loading.py", line 26, in import_string
module = import_module(module_path)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/importlib/__init__.py", line 37, in import_module
__import__(name)
ImportError: No module named security
load_middleware して、import_moduleして、そして
named security というモジュールが無いぞコラって怒られたので原因を調べてみた。
まず、settings.pyで指定しているmiddlewareを確認してみる。
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.security.SecurityMiddleware',
)
一番下に、'django.middleware.security.SecurityMiddleware' と記述されていた。どうやらこれが無いと言われているようだ。
僕が使用しているDjangoのバージョンは1.7.3なので、1.7のDocumentを確認してみる。
Middleware | Django documentation | Django (1.7)
あれ、1.7ではstartprojectしたときにデフォルトで django.middleware.security.SecurityMiddleware が入っていないようだ...なんだこれは。
次にこいつが何なのかを調べてみたら、Django 1.8から新しく使えるようになったモジュールということが判明した。
Middleware | Django documentation | Django (1.8)
なんかセキュリティまわりで色々便利になってるっぽい。
ぬー、1.8使うか迷うなぁ。でも暫くは1.7を使用する機会の方が多いと思うし、このまま1.7で勉強するのだよ。
解決方法:
SecurityMiddleware をコメントアウト(あとで使えるかもしれないので消さないでおく)
#'django.middleware.security.SecurityMiddleware',
しかし、なんで1.7.3を使用しているのにSecurityMiddlewareが勝手に記述されていたんだろうか。
そういえば前に最新版(1.8)を入れて、あとから pip install django==1.7.3 で1.7.3を入れ直したんだけど、uninstall しないと django-admin.py とかその他もろもろがちゃんと1.7版にならないのかな。installの最中には1.8を消してます〜って表示がされてたんだけどな。
なんか気持ち悪いからこの件についても後で調べてみよう。
2015/05/03 追記
PATHを調べたらPython3とDjango1.8優先になっていた。これが原因だった。。そういえばPython3をインストーラーで入れたんだった。。。