mod_rewrite + django causing incorrect redirect URLs post login - django

I have a Django project with an app named "Surveys" - it is desired that URLs such as http://example.com/Surveys/ViewInspection/1 are accessible via http://example.com/Inspections/ViewInspection/1.
Using Apache 2.4 and mod_rewrite, I have the following set of rules in place to allow this:
RewriteEngine On
RewriteRule ^/Inspections(.+)$ /Surveys$1 [PT]
and all appears to work fine, except where a non-authenticated user attempts to access the above URL (the view for which has the #login_required decorator.
At this point, the user is bounced to the login screen with parameters:
/Auth/Login?next=/Ins/Surveys/ViewInspection/1
After a bit of digging, "/Ins/Surveys/ViewInspection/1" is the value for request.path, whereas request.path_info is correctly set as /Surveys/ViewInspection/1 - the Auth code is taking .path and getting it wrong. If I use a shorter string than "Inspections" the Ins part decreases until disappearing, when it all works fine.
mod_rewrite logs look correct in this instance:
[Tue Feb 23 23:52:49.617840 2021] [rewrite:trace2] [pid 2760:tid 140156097316608] mod_rewrite.c(483): [client 213.18.147.204:4054] 213.18.147.204 - - [hostname/sid#7f78a4651338][rid#7f78a53910a0/initial] init rewrite engine with requested uri /Inspections/ViewInspection/2
[Tue Feb 23 23:52:49.617906 2021] [rewrite:trace3] [pid 2760:tid 140156097316608] mod_rewrite.c(483): [client 213.18.147.204:4054] 213.18.147.204 - - [hostname/sid#7f78a4651338][rid#7f78a53910a0/initial] applying pattern '^/Inspections(.+)$' to uri '/Inspections/ViewInspection/2'
[Tue Feb 23 23:52:49.617940 2021] [rewrite:trace2] [pid 2760:tid 140156097316608] mod_rewrite.c(483): [client 213.18.147.204:4054] 213.18.147.204 - - [hostname/sid#7f78a4651338][rid#7f78a53910a0/initial] rewrite '/Inspections/ViewInspection/2' -> '/Surveys/ViewInspection/2'
[Tue Feb 23 23:52:49.617956 2021] [rewrite:trace2] [pid 2760:tid 140156097316608] mod_rewrite.c(483): [client 213.18.147.204:4054] 213.18.147.204 - - [hostname/sid#7f78a4651338][rid#7f78a53910a0/initial] forcing '/Surveys/ViewInspection/2' to get passed through to next API URI-to-filename handler
[Tue Feb 23 23:52:49.618103 2021] [rewrite:trace2] [pid 2760:tid 140156097316608] mod_rewrite.c(483): [client 213.18.147.204:4054] 213.18.147.204 - - [hostname/sid#7f78a4651338][rid#7f78a54060a0/subreq] init rewrite engine with requested uri /Surveys/ViewInspection/2
[Tue Feb 23 23:52:49.618119 2021] [rewrite:trace3] [pid 2760:tid 140156097316608] mod_rewrite.c(483): [client 213.18.147.204:4054] 213.18.147.204 - - [hostname/sid#7f78a4651338][rid#7f78a54060a0/subreq] applying pattern '^/Inspections(.+)$' to uri '/Surveys/ViewInspection/2'
[Tue Feb 23 23:52:49.618131 2021] [rewrite:trace1] [pid 2760:tid 140156097316608] mod_rewrite.c(483): [client 213.18.147.204:4054] 213.18.147.204 - - [hostname/sid#7f78a4651338][rid#7f78a54060a0/subreq] pass through /Surveys/ViewInspection/2
Any idea what I'm doing wrong here to cause request.path to be wrong and foul up the redirects after login?
If I shorten the "Inspections" part in the re-write rule, it correspondingly shortens the "Ins" part of the incorrect request.path - so a short (<8 character) string in place causes everything to work perfectly. I just can't see where this is taking place.

After adding WSGI middleware to drop out the WSGI info to the Apache error log, I've tracked down the culprit to line 177 in django.core.handlers.wsgi.py
if script_url:
if b'//' in script_url:
# mod_wsgi squashes multiple successive slashes in PATH_INFO,
# do the same with script_url before manipulating paths (#17133).
script_url = _slashes_re.sub(b'/', script_url)
path_info = get_bytes_from_wsgi(environ, 'PATH_INFO', '')
script_name = script_url[:-len(path_info)] if path_info else script_url
else:
script_name = get_bytes_from_wsgi(environ, 'SCRIPT_NAME', '')
Here, we land up in this little block of code because script_name is a zero string from mod_wsgi (I'm not in a sub directory). path_info is being set by Apache to /Surveys/ViewInspection/1 (correct, from mod_rewrite); script_url is /Inspections/ViewInspection/1 (again correct - the pre- mod_rewrite URL).
The code script_url[:-len(path_info)] blindly strips away the length on path_info as the script name, and gets it wrong.
The workround here is to add:
FORCE_SCRIPT_NAME = ""
to the Django settings.py file.

Related

500 Internal Server error from mod_wsgi and django rest

I have looked at every similar question about this and still can't figure out what's wrong. I'm try to set up a python REST service on my VPS alongside my wordpress site. I can get a "Hello world" wsgi file to run no problem, but when I point to my django rest wsgi file, I get a 500 server error.
My wordpress site is in /var/www/html/mysite/public_html, and the rest service is in /var/www/html/mysite/myrest. www-data has ownership of everything in the mysite folder. I've installed all dependencies, and started the project with python manage.py runserver just to make sure it's not missing anything.
This is my wsgi file.
import os
import sys
import site
site.addsitedir('/var/www/html/mysite/myrest/lib/python2.7/site-packages')
sys.path.append('/var/www/html/mysite/myrest')
os.environ['PYTHON_EGG_CACHE'] = '/var/www/html/mysite/.python-egg'
os.environ['DJANGO_SETTINGS_MODULE'] = 'myproject.settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
Before it didn't have the site.addsitedir stuff, that got added as I tried different solutions.
There's some weird stuff going on in the apache logs, but I couldn't make sense of it.
[Sun Feb 19 20:39:33.697146 2017] [core:notice] [pid 26048] AH00094: Command line: '/usr/sbin/apache2'
[Sun Feb 19 20:41:30.804083 2017] [mpm_prefork:notice] [pid 26048] AH00169: caught SIGTERM, shutting down
[Sun Feb 19 20:41:31.707014 2017] [wsgi:warn] [pid 26721] mod_wsgi: Compiled for Python/2.7.11.
[Sun Feb 19 20:41:31.707037 2017] [wsgi:warn] [pid 26721] mod_wsgi: Runtime using Python/2.7.12.
[Sun Feb 19 20:41:31.709784 2017] [mpm_prefork:notice] [pid 26721] AH00163: Apache/2.4.18 (Ubuntu) mod_wsgi/4.3.0 Python/2.7.12 configured -- resuming normal operations
[Sun Feb 19 20:41:31.709801 2017] [core:notice] [pid 26721] AH00094: Command line: '/usr/sbin/apache2'
I'm pulling my hair out. Your help is greatly appreciated.
The problem was in my settings.py file. I managed to debug it by putting
import django
django.setup()
in various places throughout settings.py.

Why does page hang/timeout with apache2, mod_wsgi, django, in virtual environment and under non-privileged user

When I go to 52.1.65.249, the page hangs or times out. I have a django project located under a non-root user at /home/usrbkto/bkto/projbkto.
I have the same problem on two servers running ubuntu 14.04 and python 2.7.8 and ubuntu 15.04 and python 2.7.9. I believe the mod_wsgi on PyPi was compiled using python 2.7.8, so for the server running python 2.7.9 I downloaded from Github and compiled using the version of python on my server. Everything was working fine until I updated my packages all at once, so I'm not sure which package update broke things. I suspect that it has to do with the fact that I'm not using the new version of mod_wsgi correctly, but I'm not sure and I want to keep my Django project under a non-root user without access to Apache files.
My custom conf file at /etc/apache2/sites-available/bkto.conf is:
WSGIScriptAlias / /home/usrbkto/bkto/projbkto/projbkto/wsgi.py
WSGIPythonHome /home/usrbkto/vent
WSGIPythonPath /home/usrbkto/bkto/projbkto
LogLevel info
<Directory /home/usrbkto/bkto/projbkto/projbkto>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
Alias /media/ /home/usrbkto/bkto/projbkto/media/
Alias /static/ /home/usrbkto/bkto/projbkto/static/
<Directory /home/usrbkto/bkto/projbkto/static>
Require all granted
</Directory>
<Directory /home/usrbkto/bkto/projbkto/media>
Require all granted
</Directory>
The apache error.log is:
[Mon Jun 01 05:14:41.082545 2015] [mpm_event:notice] [pid 32630:tid 140666831587200] AH00489: Apache/2.4.10 (Ubuntu) mod_wsgi/4.4.12 Python/2.7.9 configured -- resuming normal operations
[Mon Jun 01 05:14:41.082692 2015] [mpm_event:info] [pid 32630:tid 140666831587200] AH00490: Server built: Mar 9 2015 11:53:48
[Mon Jun 01 05:14:41.082713 2015] [core:notice] [pid 32630:tid 140666831587200] AH00094: Command line: '/usr/sbin/apache2'
[Mon Jun 01 05:14:41.083297 2015] [wsgi:info] [pid 32634:tid 140666831587200] mod_wsgi (pid=32634): Python home /home/usrbkto/venv.
[Mon Jun 01 05:14:41.083401 2015] [wsgi:info] [pid 32634:tid 140666831587200] mod_wsgi (pid=32634): Initializing Python.
[Mon Jun 01 05:14:41.089325 2015] [wsgi:info] [pid 32632:tid 140666831587200] mod_wsgi (pid=32632): Python home /home/usrbkto/venv.
[Mon Jun 01 05:14:41.089442 2015] [wsgi:info] [pid 32632:tid 140666831587200] mod_wsgi (pid=32632): Initializing Python.
[Mon Jun 01 05:14:41.181394 2015] [wsgi:info] [pid 32634:tid 140666831587200] mod_wsgi (pid=32634): Attach interpreter ''.
[Mon Jun 01 05:14:41.181479 2015] [wsgi:info] [pid 32634:tid 140666831587200] mod_wsgi (pid=32634): Adding '/home/usrbkto/bkto/projbkto' to path.
[Mon Jun 01 05:14:41.182781 2015] [wsgi:info] [pid 32634:tid 140666831587200] mod_wsgi (pid=32634): Imported 'mod_wsgi'.
[Mon Jun 01 05:14:41.186652 2015] [wsgi:info] [pid 32632:tid 140666831587200] mod_wsgi (pid=32632): Attach interpreter ''.
[Mon Jun 01 05:14:41.186718 2015] [wsgi:info] [pid 32632:tid 140666831587200] mod_wsgi (pid=32632): Adding '/home/usrbkto/bkto/projbkto' to path.
[Mon Jun 01 05:14:41.212429 2015] [wsgi:info] [pid 32632:tid 140666831587200] mod_wsgi (pid=32632): Imported 'mod_wsgi'.
[Mon Jun 01 05:14:47.101220 2015] [wsgi:info] [pid 32634:tid 140666698360576] mod_wsgi (pid=32634): Create interpreter 'ip-172-31-4-180.ec2.internal|'.
[Mon Jun 01 05:14:47.102574 2015] [wsgi:info] [pid 32634:tid 140666698360576] mod_wsgi (pid=32634): Adding '/home/usrbkto/bkto/projbkto' to path.
[Mon Jun 01 05:14:47.104087 2015] [wsgi:info] [pid 32634:tid 140666698360576] [client 64.94.31.206:47918] mod_wsgi (pid=32634, process='', application='ip-172-31-4-180.ec2.internal|'): Loading WSGI script '/home/usrbkto/bkto/projbkto/projbkto/wsgi.py'.
[Mon Jun 01 05:16:46.847615 2015] [wsgi:info] [pid 32632:tid 140666612999936] mod_wsgi (pid=32632): Create interpreter 'ip-172-31-4-180.ec2.internal|'.
[Mon Jun 01 05:16:46.848995 2015] [wsgi:info] [pid 32632:tid 140666612999936] mod_wsgi (pid=32632): Adding '/home/usrbkto/bkto/projbkto' to path.
[Mon Jun 01 05:16:46.850506 2015] [wsgi:info] [pid 32632:tid 140666612999936] [client 166.137.244.128:61084] mod_wsgi (pid=32632, process='', application='ip-172-31-4-180.ec2.internal|'): Loading WSGI script '/home/usrbkto/bkto/projbkto/projbkto/wsgi.py'.
The wsgi.py file at /home/usrbkto/bkto/projbkto/projbkto/wsgi.py is:
"""
WSGI config for projbkto project.
It exposes the WSGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/1.7/howto/deployment/wsgi/
"""
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "projbkto.settings")
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
The mod_wsgi versions of PyPi are source code and not binaries. To say the mod_wsgi on PyPi is compiled with a certain Python version doesn't make any sense as they are compiled on your own system using whatever Python version you have.
Anyway, read this and try the remedy given:
http://code.google.com/p/modwsgi/wiki/ApplicationIssues#Python_Simplified_GIL_State_API
This is the usual fix for lock ups caused by Python C extensions which aren't coded properly to work in sub interpreters.
Also stop using embedded mode and use daemon mode instead:
http://blog.dscpl.com.au/2012/10/why-are-you-using-embedded-mode-of.html
If these don't help, indicate whether it is easily reproducible or random.

Apache2 can not load wsgi.py

I am using an Ubuntu 14.10 X86_64 system with softwares in below:
python 3.4
apache2
libapache2-mod-wsgi-py3
django1.8
I created a project by django1.8 at this path:
/var/www/html/koorimeo
I've noticed that django-admin startproject will generate a wsgi.py file by default and I haven't change its content.
I configured apache2 under the official document(How to use Django with Apache and mod_wsgi) details:
I modified 000-default.conf for I don't want to setup another Virtual Host. and This is What I added:
#000-default.conf
<VirtualHost *:80>
...
<Directory /var/www/html/koorimeo/koorimeo>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
...
</VirtualHost>
After that I declare WSGIAlias and WSGIPythonPath in apache2.conf:
#apache2.conf
#I want to leave "/" for other use...
WSGIScriptAlias /koorimeo /var/www/html/koorimeo/koorimeo/wsgi.py
WSGIPythonPath /var/www/html/koorimeo/koorimeo
After finished setting files I restarted apache2 service and login into 127.0.0.1/koorimeo, it returned a 500 error message...
I looked up the error log file and get these error message:
bing#k-lab:/var/log/apache2$ tail error.log
[Sat Apr 25 14:35:31.214661 2015] [:notice] [pid 16997:tid 140004070725504] mod_python: Creating 8 session mutexes based on 6 max processes and 25 max threads.
[Sat Apr 25 14:35:31.214705 2015] [:notice] [pid 16997:tid 140004070725504] mod_python: using mutex_directory /tmp
[Sat Apr 25 14:35:31.232634 2015] [:warn] [pid 16997:tid 140004070725504] mod_wsgi: Compiled for Python/3.4.0.
[Sat Apr 25 14:35:31.232682 2015] [:warn] [pid 16997:tid 140004070725504] mod_wsgi: Runtime using Python/2.7.6.
[Sat Apr 25 14:35:31.232766 2015] [mpm_event:notice] [pid 16997:tid 140004070725504] AH00489: Apache/2.4.7 (Ubuntu) mod_python/3.3.1 Python/2.7.6 mod_wsgi/3.4 configured -- resuming normal operations
[Sat Apr 25 14:35:31.232786 2015] [core:notice] [pid 16997:tid 140004070725504] AH00094: Command line: '/usr/sbin/apache2'
[Sat Apr 25 14:35:32.234958 2015] [core:notice] [pid 16997:tid 140004070725504] AH00051: child pid 18325 exit signal Aborted (6), possible coredump in /etc/apache2
[Sat Apr 25 14:35:32.235070 2015] [core:notice] [pid 16997:tid 140004070725504] AH00051: child pid 18326 exit signal Aborted (6), possible coredump in /etc/apache2
[Sat Apr 25 14:35:34.041184 2015] [:error] [pid 18599:tid 140003960342272] [client 127.0.0.1:51134] mod_wsgi (pid=18599): Target WSGI script '/var/www/html/koorimeo/koorimeo/wsgi.py' cannot be loaded as Python module., referer: http://localhost/
[Sat Apr 25 14:35:34.041279 2015] [:error] [pid 18599:tid 140003960342272] [client 127.0.0.1:51134] mod_wsgi (pid=18599): Exception occurred processing WSGI script '/var/www/html/koorimeo/koorimeo/wsgi.py'., referer: http://localhost/
According these message I found that apache2 can not find this module:
/var/www/html/koorimeo/wsgi.py
So I copy this path and try to get me clear wheather this file do exist:
bing#k-lab:/var/log/apache2$ ls /var/www/html/koorimeo/koorimeo/wsgi.py -l
and the system returned this message which told me that the file is truly exists...
-rw-rw-r-- 1 bing bing 389 4月 25 14:21 /var/www/html/koorimeo/koorimeo/wsgi.py
And I also make sure that I've installed libapache2-mod-wsgi-py3, I did find wsgi.so in proper location.
I've found wsgi.load in modes-enable and pointed the wsgi.so in right place:
LoadModule wsgi_module /usr/lib/apache2/modules/mod_wsgi.so
So... I am confused...
Please tell me why can't apache2 find this wsgi.py file?
Remove mod_python from Apache if you are not using it.
Your mod_wsgi module was compiled for Python 3.4.0, but mod_python was compiled for 2.7.6. Because mod_python is using a different version it is overriding what Python version is used and this will stop mod_wsgi from working.
Read the many sections in the documentation starting at:
http://code.google.com/p/modwsgi/wiki/InstallationIssues#Using_ModPython_and_ModWsgi

Django stops working with RuntimeError: populate() isn't reentrant

I've been developing a Django web application deployed on an Apache server with WSGI, and everything has been going smoothly. Today, I made some minor changes to my app's admin.py in an attempt to customize the build-in Django Admin interface, and initially made a syntax error (an unclosed parenthesis). This meant that when I touched wsgi.py and loaded the code (I have WSGI running in daemon mode on my virtual host), my website was replaced with an Internal Server Error because WSGI stopped when it hit the syntax error.
So I fixed the syntax error, checked that I didn't have any more with manage.py check, and touched wsgi.py to redeploy. But my website still displays an Internal Server Error! Checking the Apache logs, this is what I see:
[Sun Nov 23 13:52:46 2014] [info] mod_wsgi (pid=19093): Create interpreter 'quotes.cs.cornell.edu|'.
[Sun Nov 23 13:52:46 2014] [info] mod_wsgi (pid=19093): Adding '/extra/www/html/quotes/quotes_django' to path.
[Sun Nov 23 13:52:46 2014] [info] mod_wsgi (pid=19093): Adding '/opt/rh/python27/root/usr/lib64/python2.7/site-
packages/' to path.
[Sun Nov 23 13:52:46 2014] [info] [client 128.84.33.19] mod_wsgi (pid=19093, process='quotes.cs.cornell.edu',
application='quotes.cs.cornell.edu|'): Loading WSGI script '/extra/www/html/quotes/quotes_django/quotes_django/
wsgi.py'.
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19] mod_wsgi (pid=19093): Target WSGI script '/extra/www/html/
quotes/quotes_django/quotes_django/wsgi.py' cannot be loaded as Python module.
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19] mod_wsgi (pid=19093): Exception occurred processing WSGI
script '/extra/www/html/quotes/quotes_django/quotes_django/wsgi.py'.
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19] Traceback (most recent call last):
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19] File "/extra/www/html/quotes/quotes_django/
quotes_django/wsgi.py", line 14, in <module>
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19] application = get_wsgi_application()
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19] File "/opt/rh/python27/root/usr/lib64/python2.7/site-
packages/django/core/wsgi.py", line 14, in get_wsgi_application
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19] django.setup()
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19] File "/opt/rh/python27/root/usr/lib64/python2.7/site-
packages/django/__init__.py", line 21, in setup
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19] apps.populate(settings.INSTALLED_APPS)
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19] File "/opt/rh/python27/root/usr/lib64/python2.7/site-
packages/django/apps/registry.py", line 115, in populate
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19] app_config.ready()
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19] File "/opt/rh/python27/root/usr/lib64/python2.7/site-
packages/django/contrib/admin/apps.py", line 22, in ready
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19] self.module.autodiscover()
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19] File "/opt/rh/python27/root/usr/lib64/python2.7/site-
packages/django/contrib/admin/__init__.py", line 23, in autodiscover
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19] autodiscover_modules('admin', register_to=site)
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19] File "/opt/rh/python27/root/usr/lib64/python2.7/site-
packages/django/utils/module_loading.py", line 74, in autodiscover_modules
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19] import_module('%s.%s' % (app_config.name,
module_to_search))
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19] File "/usr/lib64/python2.7/importlib/__init__.py", line
37, in import_module
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19] __import__(name)
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19] File "/extra/www/html/quotes/quotes_django/quotespage/
admin.py", line 25
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19] approve_quotes.short_description = "Approve selected
quotes"
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19] ^
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19] SyntaxError: invalid syntax
[Sun Nov 23 13:53:36 2014] [info] [client 128.84.33.19] mod_wsgi (pid=19093, process='quotes.cs.cornell.edu',
application='quotes.cs.cornell.edu|'): Loading WSGI script '/extra/www/html/quotes/quotes_django/quotes_django/
wsgi.py'.
[Sun Nov 23 13:53:36 2014] [error] [client 128.84.33.19] mod_wsgi (pid=19093): Target WSGI script '/extra/www/html/
quotes/quotes_django/quotes_django/wsgi.py' cannot be loaded as Python module.
[Sun Nov 23 13:53:36 2014] [error] [client 128.84.33.19] mod_wsgi (pid=19093): Exception occurred processing WSGI
script '/extra/www/html/quotes/quotes_django/quotes_django/wsgi.py'.
[Sun Nov 23 13:53:36 2014] [error] [client 128.84.33.19] Traceback (most recent call last):
[Sun Nov 23 13:53:36 2014] [error] [client 128.84.33.19] File "/extra/www/html/quotes/quotes_django/
quotes_django/wsgi.py", line 14, in <module>
[Sun Nov 23 13:53:36 2014] [error] [client 128.84.33.19] application = get_wsgi_application()
[Sun Nov 23 13:53:36 2014] [error] [client 128.84.33.19] File "/opt/rh/python27/root/usr/lib64/python2.7/site-
packages/django/core/wsgi.py", line 14, in get_wsgi_application
[Sun Nov 23 13:53:36 2014] [error] [client 128.84.33.19] django.setup()
[Sun Nov 23 13:53:36 2014] [error] [client 128.84.33.19] File "/opt/rh/python27/root/usr/lib64/python2.7/site-
packages/django/__init__.py", line 21, in setup
[Sun Nov 23 13:53:36 2014] [error] [client 128.84.33.19] apps.populate(settings.INSTALLED_APPS)
[Sun Nov 23 13:53:36 2014] [error] [client 128.84.33.19] File "/opt/rh/python27/root/usr/lib64/python2.7/site-
packages/django/apps/registry.py", line 78, in populate
[Sun Nov 23 13:53:36 2014] [error] [client 128.84.33.19] raise RuntimeError("populate() isn't reentrant")
[Sun Nov 23 13:53:36 2014] [error] [client 128.84.33.19] RuntimeError: populate() isn't reentrant
The first series of errors shows WSGI failing due to the syntax error in my admin.py. However, the second series of errors seems to show an error internal to Django:
RuntimeError: populate() isn't reentrant
thrown from the populate method of registry.py.
Googling this error message returns surprisingly little information, none of it from Django documentation. Apparently, it can sometimes happen if you name an app twice in your settings.py, but I'm not doing that. More importantly, I haven't changed settings.py since the point where the website was working fine -- the only thing I changed was admin.py.
I tried reverting all the changes I made, so all my Python code is back in the state it was when the website was working -- and I still get the populate() isn't reentrant error when I try to make WSGI reload the code!
I've also tried commenting-out different apps in the INSTALLED_APPS section of settings.py, and even with only 'django.contrib.staticfiles' enabled the error still happens. Weirdly, I still get the error even if I comment out all the apps -- Django throws the error even when it isn't loading any apps!
Does anyone know what's going on here? Or any better way for me to debug this error, since the traceback in the Apache log is pretty unhelpful?
Notes: I'm using Django 1.7, Apache 2.2, and Python 2.7.
This is caused by a bug in your Django settings somewhere. Unfortunately, Django's hiding the bug behind this generic and un-useful error message.
To reveal the true problem, open django/apps/registry.py and around line 80, replace:
raise RuntimeError("populate() isn't reentrant")
with:
self.app_configs = {}
This will allow Django to continue loading, and reveal the actual error.
I've encountered this error for several different causes. Once was because I had a bad import in one of my app's admin.py.
Update from the Future
Since this question has continued to receive attention years after I originally asked it, I thought I should update my answer to better help future readers solve their problems.
It turns out there are (at least) two different reasons you could be getting the "populate() isn't reentrant" error, and thus two different approaches to solving the problem:
There is an error in your Python code or your Django settings that makes your app fail to initialize correctly. As #Cerin's answer points out, Django hides the real problem behind the unhelpful "populate isn't reentrant" message. To fix this and reveal the actual error, follow #Cerin's advice and edit django/apps/registry.py to make Django stop throwing the RuntimeError.
There was at one point an error in your Python code, but you have fixed it, and Django still keeps failing with this message because WSGI won't reload your fixed code. This is a WSGI problem, not a Django problem. One way to fix it is to temporarily edit wsgi.py so that its application function kills the WSGI process (forcing it to restart), as I described in my original answer; another is to set the startup-timeout option of mod_wsgi so that WSGI will restart itself, as #Graham Dumpleton described in the comments. Restarting the entire Apache server also fixes this problem, because it will incidentally restart WSGI, although that's a bit heavy-handed and not always possible if you're not an admin on the webserver.
Original answer below:
My server's administrator restarted Apache, and that magically fixed this problem. The exact same Python files loaded without causing populate() isn't reentrant. I even tried loading another file with a syntax error, then fixing it, and the server was able to load the new file and run correctly with no problems.
I still don't know what was going wrong, but I'm marking this as answered since the problem is gone. (Well, I'll mark it as answered as soon as StackOverflow allows me to accept my own answer.)
Update: After continuing to get this error when I accidentally upload Python with syntax errors, I figured out a workaround that's easier than restarting Apache. When WSGI starts throwing the populate() isn't reentrant error, I replace my Django project's wsgi.py with this simple function:
def application(environ, start_response):
if environ['mod_wsgi.process_group'] != '':
import signal
os.kill(os.getpid(), signal.SIGINT)
return ["killed"]
Then I reload my website, and the WSGI daemon process restarts (which I can tell by looking at the Apache log, even though the website still displays the same 500 error).
If I then change wsgi.py back to normal and reload again, WSGI successfully picks up my code without throwing populate() isn't reentrant (assuming I have no syntax errors this time). So the entirety of Apache doesn't need to restart, just the WSGI process, and I can do that without root privileges.
I know this is an old answer but I will contribute with my solution:
As a way to diagnose the source of the problem run manage.py checkand see if you find anything there
In my case an outdated requirement was the issue and django was failing to import a submodule
Make sure that your requirements are up to date
It's not a response but a reflexion.
When you upgrade to django 1.7 and you have a 500 error and reload your page, Apache says "populate() isn't reentrant".
I think it's when you load your page, Apache load all the modules you need for your app and when the error is handle it doesn't unload module. So, when you reload your page, apache load again theses modules but it's already loaded. So, apache says "populate() isn't reentrant".
I've two actions to correct this : Restart apache, or correct the error that handle the first 5OO error.
Try restarting apache with:
sudo service httpd restart
I hope it will help you.
If you're getting this error when using Google App Engine check your logs for other errors which might be causing this. I was getting:
ImproperlyConfigured: Error loading either pysqlite2 or sqlite3 modules (tried in that order): No module named _sqlite3
You can't use SQLite with Google App Engine so commenting out the DATABASES section of settings.py stopped that error and the RuntimeError("populate() isn't reentrant") error as well.
You may be able to fix it without restarting Apache by touching a file (other than wsgi.py) that is early on in the loading process. For example, your settings file:
$ touch settings.py
I haven't properly solved this either, but more info in my question here: Code change monitoring malfunctioning with Django 1.7 on mod-wsgi
Apache stores the wsgi file in its cache.
Disable Apache caching of python files
So first delete the wsgi file and restart your acpache and then add wsgi file again and restart the apache.
This error also generated if inconsistence use of space and tab in the code.
I just faced the same problem so I started looking around.
Now I've got it working, so I thought I should share it with you guys!
All I did was do chown user:group /to/path -R and chmod 770 /to/path -R all over again and it worked.
This looks like a nice collection of valid responses for the same Apache mod-wsgi error, each guy posting the one that works for him/her, so here is mine:
Do not forget to update your project requirements after deploying :)
I experienced this same problem, and the source of the error for me was just a syntax error in a file I was working with. After fixing the typo, the populate() is not reentrant error disappeared.
If you are running django from a wsgi script, you might be able to identify the typo by just running the wsgi script from the command line. For example:
cd /usr/local/www/wsgi-scripts/
python djangolauncher.wsgi
If you tested your syntax in your dev environment and everything is ok, then the problem is here
WSGIDaemonProcess celeryEnv python-path=/var/www/celeryEnv/lib/python3.6/site-packages user=apache group=apache python-home=/var/www/celeryEnv
apache only look at
python-path=/var/www/celeryEnv/lib/python3.6/site-packages
so any modules in lib64 will not be recognized in apache
I found a workaround by coping all modules in /var/www/celeryEnv/lib64
to /var/www/celeryEnv/lib
now apache will work here's the line from my own servers
WSGIDaemonProcess domain.com python-path=/home/user/app/env/lib/python3.6/site-packages:/home/user/app
Note: there's beneficial information already here, but I put this answer because My servers are mostly Centos-7 which are working as it should with my answer !!
Setup: Ubuntu 14.04, Django 1.10, Python 3.5 (in virtualenv).
I tried many of these solutions without luck, but then I noticed that the Apache error log contains two different errors in my case. One that happens when someone tries to visit a page, another that happens at start up. I missed the startup one because I usually tried to refresh the page a couple of times and thus only saw the on visit error repeated a few times.
I then searched for solutions to the startup error instead and the solution to this question worked for me. Briefly, it involves updating the mod_wsgi package in a roundabout way.
I had been receiving warnings for months about the mismatch in mod_wsgi versions, but suddenly it resulted in Apache error 500's. Doesn't make any sense to me.
My guess is that this RuntimeError: populate() isn't reentrant error is usually a sign that one should look for a startup error, which indicates the real problem.
on visit
[Sat Oct 15 03:38:08.900966 2016] [:error] [pid 28272] [remote 95.166.81.114:39651] mod_wsgi (pid=28272): Target WSGI script '/django/GP/GP/wsgi.py' cannot be loaded as Python module.
[Sat Oct 15 03:38:08.901409 2016] [:error] [pid 28272] [remote 95.166.81.114:39651] mod_wsgi (pid=28272): Exception occurred processing WSGI script '/django/GP/GP/wsgi.py'.
[Sat Oct 15 03:38:08.901662 2016] [:error] [pid 28272] [remote 95.166.81.114:39651] Traceback (most recent call last):
[Sat Oct 15 03:38:08.902184 2016] [:error] [pid 28272] [remote 95.166.81.114:39651] File "/django/GP/GP/wsgi.py", line 16, in <module>
[Sat Oct 15 03:38:08.902217 2016] [:error] [pid 28272] [remote 95.166.81.114:39651] application = get_wsgi_application()
[Sat Oct 15 03:38:08.902501 2016] [:error] [pid 28272] [remote 95.166.81.114:39651] File "/django/env/lib/python3.5/site-packages/django/core/wsgi.py", line 13, in get_wsgi_application
[Sat Oct 15 03:38:08.902529 2016] [:error] [pid 28272] [remote 95.166.81.114:39651] django.setup(set_prefix=False)
[Sat Oct 15 03:38:08.902726 2016] [:error] [pid 28272] [remote 95.166.81.114:39651] File "/django/env/lib/python3.5/site-packages/django/__init__.py", line 27, in setup
[Sat Oct 15 03:38:08.902755 2016] [:error] [pid 28272] [remote 95.166.81.114:39651] apps.populate(settings.INSTALLED_APPS)
[Sat Oct 15 03:38:08.902924 2016] [:error] [pid 28272] [remote 95.166.81.114:39651] File "/django/env/lib/python3.5/site-packages/django/apps/registry.py", line 78, in populate
[Sat Oct 15 03:38:08.902953 2016] [:error] [pid 28272] [remote 95.166.81.114:39651] raise RuntimeError("populate() isn't reentrant")
[Sat Oct 15 03:38:08.903111 2016] [:error] [pid 28272] [remote 95.166.81.114:39651] RuntimeError: populate() isn't reentrant
start up
[Sat Oct 15 03:38:08.900966 2016] [:error] [pid 28272] [remote 95.166.81.114:39651] mod_wsgi (pid=28272): Target WSGI script '/django/GP/GP/wsgi.py' cannot be loaded as Python module.
[Sat Oct 15 03:38:08.901409 2016] [:error] [pid 28272] [remote 95.166.81.114:39651] mod_wsgi (pid=28272): Exception occurred processing WSGI script '/django/GP/GP/wsgi.py'.
[Sat Oct 15 03:38:08.901662 2016] [:error] [pid 28272] [remote 95.166.81.114:39651] Traceback (most recent call last):
[Sat Oct 15 03:38:08.902184 2016] [:error] [pid 28272] [remote 95.166.81.114:39651] File "/django/GP/GP/wsgi.py", line 16, in <module>
[Sat Oct 15 03:38:08.902217 2016] [:error] [pid 28272] [remote 95.166.81.114:39651] application = get_wsgi_application()
[Sat Oct 15 03:38:08.902501 2016] [:error] [pid 28272] [remote 95.166.81.114:39651] File "/django/env/lib/python3.5/site-packages/django/core/wsgi.py", line 13, in get_wsgi_application
[Sat Oct 15 03:38:08.902529 2016] [:error] [pid 28272] [remote 95.166.81.114:39651] django.setup(set_prefix=False)
[Sat Oct 15 03:38:08.902726 2016] [:error] [pid 28272] [remote 95.166.81.114:39651] File "/django/env/lib/python3.5/site-packages/django/__init__.py", line 27, in setup
[Sat Oct 15 03:38:08.902755 2016] [:error] [pid 28272] [remote 95.166.81.114:39651] apps.populate(settings.INSTALLED_APPS)
[Sat Oct 15 03:38:08.902924 2016] [:error] [pid 28272] [remote 95.166.81.114:39651] File "/django/env/lib/python3.5/site-packages/django/apps/registry.py", line 78, in populate
[Sat Oct 15 03:38:08.902953 2016] [:error] [pid 28272] [remote 95.166.81.114:39651] raise RuntimeError("populate() isn't reentrant")
[Sat Oct 15 03:38:08.903111 2016] [:error] [pid 28272] [remote 95.166.81.114:39651] RuntimeError: populate() isn't reentrant
[Sat Oct 15 03:38:43.291502 2016] [:error] [pid 28272] Exception ignored in: <module 'threading' from '/usr/lib/python3.4/threading.py'>
[Sat Oct 15 03:38:43.291579 2016] [:error] [pid 28272] Traceback (most recent call last):
[Sat Oct 15 03:38:43.291604 2016] [:error] [pid 28272] File "/usr/lib/python3.4/threading.py", line 1288, in _shutdown
[Sat Oct 15 03:38:43.292356 2016] [:error] [pid 28272] assert tlock is not None
[Sat Oct 15 03:38:43.292377 2016] [:error] [pid 28272] AssertionError:
[Fri Oct 14 23:38:43.412942 2016] [:error] [pid 28299] Exception ignored in: <module 'threading' from '/usr/lib/python3.4/threading.py'>
[Fri Oct 14 23:38:43.413044 2016] [:error] [pid 28299] Traceback (most recent call last):
[Fri Oct 14 23:38:43.413076 2016] [:error] [pid 28299] File "/usr/lib/python3.4/threading.py", line 1288, in _shutdown
[Fri Oct 14 23:38:43.425037 2016] [:error] [pid 28275] Exception ignored in: <module 'threading' from '/usr/lib/python3.4/threading.py'>
[Fri Oct 14 23:38:43.425125 2016] [:error] [pid 28275] Traceback (most recent call last):
[Fri Oct 14 23:38:43.425157 2016] [:error] [pid 28275] File "/usr/lib/python3.4/threading.py", line 1288, in _shutdown
[Fri Oct 14 23:38:43.427625 2016] [:error] [pid 28274] Exception ignored in: <module 'threading' from '/usr/lib/python3.4/threading.py'>
[Fri Oct 14 23:38:43.427694 2016] [:error] [pid 28274] Traceback (most recent call last):
[Fri Oct 14 23:38:43.427722 2016] [:error] [pid 28274] File "/usr/lib/python3.4/threading.py", line 1288, in _shutdown
[Fri Oct 14 23:38:43.432020 2016] [:error] [pid 28273] Exception ignored in: <module 'threading' from '/usr/lib/python3.4/threading.py'>
[Fri Oct 14 23:38:43.432078 2016] [:error] [pid 28273] Traceback (most recent call last):
[Fri Oct 14 23:38:43.432105 2016] [:error] [pid 28273] File "/usr/lib/python3.4/threading.py", line 1288, in _shutdown
[Fri Oct 14 23:38:43.438577 2016] [:error] [pid 28299] assert tlock is not None
[Fri Oct 14 23:38:43.438654 2016] [:error] [pid 28299] AssertionError:
[Fri Oct 14 23:38:43.442174 2016] [:error] [pid 28274] assert tlock is not None
[Fri Oct 14 23:38:43.442226 2016] [:error] [pid 28274] AssertionError:
[Fri Oct 14 23:38:43.447227 2016] [:error] [pid 28276] Exception ignored in: <module 'threading' from '/usr/lib/python3.4/threading.py'>
[Fri Oct 14 23:38:43.447294 2016] [:error] [pid 28276] Traceback (most recent call last):
[Fri Oct 14 23:38:43.447326 2016] [:error] [pid 28276] File "/usr/lib/python3.4/threading.py", line 1288, in _shutdown
[Fri Oct 14 23:38:43.448813 2016] [:error] [pid 28277] Exception ignored in: <module 'threading' from '/usr/lib/python3.4/threading.py'>
[Fri Oct 14 23:38:43.448876 2016] [:error] [pid 28277] Traceback (most recent call last):
[Fri Oct 14 23:38:43.448903 2016] [:error] [pid 28277] File "/usr/lib/python3.4/threading.py", line 1288, in _shutdown
[Fri Oct 14 23:38:43.450188 2016] [:error] [pid 28273] assert tlock is not None
[Fri Oct 14 23:38:43.450231 2016] [:error] [pid 28273] AssertionError:
[Fri Oct 14 23:38:43.456680 2016] [:error] [pid 28275] assert tlock is not None
[Fri Oct 14 23:38:43.456737 2016] [:error] [pid 28275] AssertionError:
[Fri Oct 14 23:38:43.461761 2016] [:error] [pid 28277] assert tlock is not None
[Fri Oct 14 23:38:43.461826 2016] [:error] [pid 28277] AssertionError:
[Fri Oct 14 23:38:43.466165 2016] [:error] [pid 28276] assert tlock is not None
[Fri Oct 14 23:38:43.466219 2016] [:error] [pid 28276] AssertionError:
[Fri Oct 14 23:38:43.658971 2016] [mpm_prefork:notice] [pid 28268] AH00169: caught SIGTERM, shutting down
[Sat Oct 15 03:38:43.691909 2016] [:error] [pid 28272] Exception ignored in: <module 'threading' from '/usr/lib/python3.4/threading.py'>
[Sat Oct 15 03:38:43.691968 2016] [:error] [pid 28272] Traceback (most recent call last):
[Sat Oct 15 03:38:43.691996 2016] [:error] [pid 28272] File "/usr/lib/python3.4/threading.py", line 1288, in _shutdown
[Sat Oct 15 03:38:43.693126 2016] [:error] [pid 28272] assert tlock is not None
[Sat Oct 15 03:38:43.693159 2016] [:error] [pid 28272] AssertionError:
[Fri Oct 14 23:38:44.490316 2016] [:warn] [pid 28349] mod_wsgi: Compiled for Python/3.4.0.
[Fri Oct 14 23:38:44.490407 2016] [:warn] [pid 28349] mod_wsgi: Runtime using Python/3.4.3.
[Fri Oct 14 23:38:44.505672 2016] [mpm_prefork:notice] [pid 28349] AH00163: Apache/2.4.7 (Ubuntu) PHP/5.5.9-1ubuntu4.19 mod_wsgi/3.4 Python/3.4.3 configured -- resuming normal operations
[Fri Oct 14 23:38:44.505764 2016] [core:notice] [pid 28349] AH00094: Command line: '/usr/sbin/apache2'
I know it has been a while since this question was asked, but I just ran into this issue due to a problem I haven't seen discussed here. I was getting the RuntimeError: populate() isn't reentrant error due to SELinux on CentOS 7. I had Django served out of a home directory, and I simply had to enable the SELinux boolean that allowed reading home directories, as the populate() error was due to a permissions issue. The solution for me was setsebool -P httpd_read_user_content 1. I hope this helps someone having this issue.
In my case the error occured because a required pip-package was missing.
So I did a pip install -r requirements.txt, restarted apache and things worked again.
In my case, I had a circular import, which cause an error that break the populate method.
The multitude of answers makes it clear; this is a generic error that can have multiple root causes, typically related to loading Apache/WSGI.
All of these answers on this page should function as a kind of checklist, and in that vein I want to add the root cause of my instance of this error: failure to add an 'import os' to your settings.py file.
Specifically, we had a developer on our team who intended to remove an unneeded package, and instead removed 'import os' from the top of the production settings.py file. After an apache restart, our application wouldn't restart and we received the dreaded 'RuntimeError: populate() isn't reentrant' error.
A quick 'python manage.py check' did not reveal the issue, but a 'python settings.py' did; the os package was not loaded.
If you have this error, focus your search on checking your settings.py file(s) and also your WSGI file.
RuntimeError: populate() isn't reentrant
Can be anything, that is why there are so many different answers for this question.
The trick is to look at the error message just before the RuntimeError. In your case there seems to be a syntax error in the file /extra/www/htmlquotes/quotes_django/quotespage/admin.py on line 15, see:
Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19] File "/extra/www/htmlquotes/quotes_django/quotespage/admin.py", line 25
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19] pprove_quotes.short_description = "Approve selected quotes"
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19] ^
[Sun Nov 23 13:52:46 2014] [error] [client 128.84.33.19] SyntaxError: invalid syntax
I had a recursive django.setup(), eg I tried to write a django.setup() inside a an app/models.py, in the stack trace django tried to point this out near:
... "site-packages/django/apps/config.py", line 211, in import_models
self.models_module = import_module(models_module_name)
...
... ./myproject/myapp/models.py ...
so yeah, be sure not to try to setup django while django is being setup...
Note on AWS Elastic Beanstalk: The default settings.py that is written by Django-admin includes a reference to a local sqlite database as the data source. This will likely work on your local OS, but not on AWS EB, and will give the populate() isn't reentrant runtime error. To test for this, simply comment out the DATABASES={<...>} statement in settings.py, deploy, and re-open the application.
For me the error was a missing mysqlclient package in the requirements.txt file.
First I installed the mysqlclient package with:
pip install mysqlclient
then I updated the requirements.txt file with:
pip freeze > requirements.txt
and this solved my problem.
I had this problem and couldn't find any answer why until I backtracked my commits. Apparently I had added an accidental import, because of auto-completion, that screwed up the setup.
# found in models.py
from msilib.schema import SelfReg
In apache error log:
RuntimeError("populate() isn't reentrant")
It worked fine in my windows dev environment but failed on the ubuntu/apache server.
I was going into this same error after having change the order of this setting :
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',
)
putting it back on the order here before and restarting apache fixed the issue.
In my case, I had a custom renderer class for Django Rest Framework, for some purpose I had to override the renderer class's method "get_context" (full disclosure : to make django toolbar give correct SQL query count)
I removed that class and redeployed. It Worked.
Removing the virtualenv directory, recreating the virtualenv, then reinstalling all the requirements fixed it for me.
I hesitate to add this as an answer since it's really just a description of a related case. However, it didn't seem legible as a comment.
I ran into this error when creating a function that could access the Django database without the server running. Mostly, this was being used for inserting test data entries.
My project had the following in its project/apps/app_one/functions.py file:
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "Project.settings")
import django
django.setup()
This allows access to the Django database through Python scripts without a server running. See here for more info on this approach: https://stackoverflow.com/a/26875729/4573162
I was also keeping basic app functions in this file that didn't require database access and were to be used while a server was running. For example, in my app_one.models.py I might have the following usage of a functions.arg_format function, imported from the app_name/functions.py file:
def save(self, *args, **kwargs):
self.some_arg = functions.arg_format(self.some_arg)
super().save(*args, **kwargs)
What this amounts to is that my application, while running, was trying to again run the Django setup().
I dont' know how related this is but it threw the same RuntimeError: populate() isn't reentrant error until I created a separate file for all the database-accessing functions. After the additional setup() import was sidestepped, migrations were able to be completed as expected.
Adding my reason to the list.
For me it was because I had a django service named with the same directory as a process directory. Renaming the process/dir fixed the issue.
Restarting the Apache server for me solved the problem. You can do that by using the command
$ sudo service apache2 restart
I had this same issue, what worked for me was commenting out the default database settings in / settings.py . I also read that later versions of django are not compatible with ebs
In apps.py, i have set different name from my app name.

Apache-Django WSGI exception: ValueError: zero length field name in format

I'm setting up a django server (1.4, python 2.7) with apache2 + mod_wsgi on a Debian system. From the django side, everything works perfect, if I run manage.py runserver, the development server displays the site correctly, however, when I try to set up my apache server to run WSGI, it fails displaying a ValueError.
This is mysite.wsgi
ALLDIRS = ['/usr/local/lib/python2.7/site-packages']
# the above directory depends on the location of your python installation.
# if using virtualenv, it will need to match your projects locale.
import os
import sys
import site
os.environ['DJANGO_SETTINGS_MODULE'] = 'ggDatabase.settings'
prev_sys_path = list(sys.path)
sys.path.append("/usr/local/lib/python2.7")
path = "/home/acad/statsdb/src"
if path not in sys.path:
sys.path.append(path)
sys.path.append("/home/acad/statsdb/src/ggDatabase")
for directory in ALLDIRS:
site.addsitedir(directory)
new_sys_path = []
for item in list(sys.path):
if item not in prev_sys_path:
new_sys_path.append(item)
sys.path.remove(item)
sys.path[:0] = new_sys_path
# change this depending on your project.
site.addsitedir("/home/acad/statsdb/src/ggDatabase/")
os.environ['PYTHON_EGG_CACHE'] = '/home/acad/.python-eggs'
os.environ['SETTINGS_MODULE'] = 'settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
This is the apache VirtualHost config:
<VirtualHost 127.0.0.1:8000>
ServerName mysite.com
ServerAlias www.mysite.com
<Directory /home/acad/statsdb/src/ggDatabase>
Order deny,allow
Allow from all
</Directory>
LogLevel warn
CustomLog /var/log/apache2/mysite.com.access.log combined
ErrorLog /var/log/apache2/mysite.com.error.log
WSGIDaemonProcess mysite.com user=acad group=acad threads=25 python-path=/usr/local/lib/python2.7
WSGIProcessGroup mysite.com
WSGIScriptAlias / /home/acad/statsdb/src/ggDatabase/apache/mysite.wsgi
</VirtualHost>
This is the exact configuration I have on my test server and it works there, but the new server runs into a problem when trying to run the wsgi script:
[Fri Jun 29 09:38:14 2012] [error] [client 127.0.0.1] mod_wsgi (pid=26233): Target WSGI script '/home/acad/statsdb/src/ggDatabase/apache/mysite.wsgi' cannot be loaded as Python module.
[Fri Jun 29 09:38:14 2012] [error] [client 127.0.0.1] mod_wsgi (pid=26233): Exception occurred processing WSGI script '/home/acad/statsdb/src/ggDatabase/apache/mysite.wsgi'.
[Fri Jun 29 09:38:14 2012] [error] [client 127.0.0.1] Traceback (most recent call last):
[Fri Jun 29 09:38:14 2012] [error] [client 127.0.0.1] File "/home/acad/statsdb/src/ggDatabase/apache/mysite.wsgi", line 31, in <module>
[Fri Jun 29 09:38:14 2012] [error] [client 127.0.0.1] import django.core.handlers.wsgi
[Fri Jun 29 09:38:14 2012] [error] [client 127.0.0.1] File "/usr/local/lib/python2.7/site-packages/django/core/handlers/wsgi.py", line 8, in <module>
[Fri Jun 29 09:38:14 2012] [error] [client 127.0.0.1] from django import http
[Fri Jun 29 09:38:14 2012] [error] [client 127.0.0.1] File "/usr/local/lib/python2.7/site-packages/django/http/__init__.py", line 11, in <module>
[Fri Jun 29 09:38:14 2012] [error] [client 127.0.0.1] from urllib import urlencode, quote
[Fri Jun 29 09:38:14 2012] [error] [client 127.0.0.1] File "/usr/local/lib/python2.7/urllib.py", line 1228, in <module>
[Fri Jun 29 09:38:14 2012] [error] [client 127.0.0.1] _safe_map[c] = c if (i < 128 and c in always_safe) else '%{:02X}'.format(i)
[Fri Jun 29 09:38:14 2012] [error] [client 127.0.0.1] ValueError: zero length field name in format
The error is so generic that I really don't know what could be going wrong. Any ideas?
Thanks in advance!
Bruno
Solved it. If someone has similar errors, make sure to print sys.version, you may find out (as I did) that wsgi was configured under another installed python version.
If that's the case, reinstall mod_wsgi with the --with-python option.