【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をインストーラーで入れたんだった。。。