werkzeug + django + gunicorn: 类型错误
我刚开始接触werkzeug,安装和设置完后,访问测试页面时出现了一个错误:“TypeError: init() 至少需要2个参数(只给了1个)”。Werkzeug提供了一个错误追踪信息(见下文)。我查看了这个信息和我的设置,但没有找到解决办法。
我安装了以下软件包:
django_extensions
werkzeug
并在我的Django设置文件中添加了以下内容:
########## WERKZEUG/DJANGO EXTENSIONS
INSTALLED_APPS += (
'django_extensions',
'werkzeug',
)
MIDDLEWARE_CLASSES += (
'werkzeug.debug.DebuggedApplication',
)
########## END WERKZEUG/DJANGO EXTENSIONS
还创建了一个dev_wsgi.py文件,我在gunicorn驱动脚本中调用它:
# basic wsgi.py
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my-site.settings.dev')
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
# Werkzeug-specific
import django.views.debug
def null_technical_500_response(request, exc_type, exc_value, tb):
raise exc_type, exc_value, tb
django.views.debug.technical_500_response = null_technical_500_response
# apply Werkzeug WSGI middleware
from werkzeug.debug import DebuggedApplication
application = DebuggedApplication(application, evalex=True)
但是现在当我查看测试网址时,出现了以下错误追踪信息:
File "/python2-venv/lib/python2.7/site-packages/django/core/handlers/wsgi.py", line 187, in __call__
self.load_middleware()
File "/python2-venv/lib/python2.7/site-packages/django/core/handlers/base.py", line 49, in load_middleware
mw_instance = mw_class()
TypeError: __init__() takes at least 2 arguments (1 given)
注释掉dev_wsgi.py中与Werkzeug相关的代码后,我的测试页面可以正常显示。我使用的是Werkzeug 0.9.4,django_extensions 1.3.3,django 1.6.4和Python 2.7.6。
1 个回答
1
werkzeug.debug.DebuggedApplication
是一个 WSGI 中间件,而不是 Django 的中间件。Django 的中间件在初始化时不需要任何参数,并且会被添加到 MIDDLEWARE_CLASSES
这个设置里。而 WSGI 中间件在初始化时至少需要一个参数,这个参数就是要被包装的 WSGI 应用程序。你现在试图把它当作两者来用,但解决方法很简单。只需要把 werkzeug.debug.DebuggedApplication
从 MIDDLEWARE_CLASSES
的设置中移除就可以了。