【发布时间】:2017-03-09 18:00:32
【问题描述】:
我有一个 Python 3.5/Django 1.10 应用程序,由 Apache/mod_wsgi 通过 SSL 提供服务。它连接到Postgres 9.5.2 数据库(使用psycopg2==2.6.2)并在AlwaysData 的服务器上运行
它大部分时间都可以正常工作,但有时会出现我不理解的错误。
(SSL error: called a function you should not call)
如果我把以下数据库设置:错误似乎每次都会发生
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'db',
'USER': 'user',
'PASSWORD': 'password',
'HOST': 'host',
'PORT': '',
'OPTIONS': {
'sslmode': 'require',
},
}
}
好像是在查询数据库时发生的。
# django/db/backends/utils.py line 64
return self.cursor.execute(sql, params)
当 Angular2 应用调用 REST api(使用 django-rest-framework 制作)时会出现问题。
我已激活以下设置:
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
SECURE_SSL_REDIRECT = True
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
为什么会这样?如何在我的 Django 项目中解决这个问题。
注意:This question 看起来很相似,但我不直接管理 OpenSSL 层,所以它不是很有帮助。
编辑:这是完整的回溯
File "proj/env/lib/python3.5/site-packages/django/core/handlers/exception.py" in inner
39. response = get_response(request)
File "proj/env/lib/python3.5/site-packages/django/core/handlers/base.py" in _legacy_get_response
249. response = self._get_response(request)
File "proj/env/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response
187. response = self.process_exception_by_middleware(e, request)
File "proj/env/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response
185. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "proj/env/lib/python3.5/site-packages/django/views/decorators/csrf.py" in wrapped_view
58. return view_func(*args, **kwargs)
File "proj/env/lib/python3.5/site-packages/django/views/generic/base.py" in view
68. return self.dispatch(request, *args, **kwargs)
File "proj/env/lib/python3.5/site-packages/rest_framework/views.py" in dispatch
474. response = self.handle_exception(exc)
File "proj/env/lib/python3.5/site-packages/rest_framework/views.py" in handle_exception
434. self.raise_uncaught_exception(exc)
File "proj/env/lib/python3.5/site-packages/rest_framework/views.py" in dispatch
471. response = handler(request, *args, **kwargs)
File "proj/apps/costs/apis.py" in get
296. data = self.get_spends_stats(cost_items, perimeter, start_date, end_date)
File "proj/apps/costs/apis.py" in get_spends_stats
306. for building in buildings:
File "proj/env/lib/python3.5/site-packages/django/db/models/query.py" in __iter__
256. self._fetch_all()
File "proj/env/lib/python3.5/site-packages/django/db/models/query.py" in _fetch_all
1087. self._result_cache = list(self.iterator())
File "proj/env/lib/python3.5/site-packages/django/db/models/query.py" in __iter__
54. results = compiler.execute_sql()
File "proj/env/lib/python3.5/site-packages/django/db/models/sql/compiler.py" in execute_sql
835. cursor.execute(sql, params)
File "proj/env/lib/python3.5/site-packages/django/db/backends/utils.py" in execute
64. return self.cursor.execute(sql, params)
File "proj/env/lib/python3.5/site-packages/django/db/utils.py" in __exit__
94. six.reraise(dj_exc_type, dj_exc_value, traceback)
File "proj/env/lib/python3.5/site-packages/django/utils/six.py" in reraise
685. raise value.with_traceback(tb)
File "proj/env/lib/python3.5/site-packages/django/db/backends/utils.py" in execute
64. return self.cursor.execute(sql, params)
Exception Type: OperationalError at /costs/api/benchmark/cost-center/3/38/2016-01/2017-12/
Exception Value: SSL error: called a function you should not call
【问题讨论】:
-
它可能会有所帮助:我正在为 Postgres 使用 psycopg2==2.6.2
-
您能在
utils.py:64之后发布堆栈跟踪吗?也许有些东西可能会暗示内层发生了什么...... -
我已经添加了 traceback 。不幸的是,它没有比
utils.py:64 -
'sslmode': 'require' 选项似乎每次都会导致错误。
标签: python django apache postgresql ssl