Hi Graham,
Just an update as requested -- I modified my standard WSGI script
based on your recommendations (mostly, see below), which seems to have
solved the inter-project-entanglement issues nicely. Unsurprisingly,
the RAM usage is higher from the outset, but that is a small price to
pay for stability! Given the discussions on django-developers at the
moment, I thought this might be timely information for you.
Cheers,
Simon
PS. I hope to meet you at PyCon this weekend.
#---------------------------------------------------
import sys
sys.stdout = sys.stderr # avoid WSGI errors caused by writing to
stdout
sys.path = [
'<home>/webapps/django/%s' % PROJECT_NAME, # within project
'<home>/.pythonpath', # other packages
] + sys.path
settings = __import__(locals().get('SETTINGS_MODULE_NAME',
'settings'))
import version_loader
version_loader.load(settings.VERSIONS)
import django.core.management
django.core.management.setup_environ(settings)
utility = django.core.management.ManagementUtility()
command = utility.fetch_command('runserver')
command.validate()
import django.conf
import django.utils
django.utils.translation.activate(django.conf.settings.LANGUAGE_CODE)
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
#---------------------------------------------------
On May 18, 6:57 pm, Graham Dumpleton <[email protected]>
wrote:
> For starters read:
>
> http://blog.dscpl.com.au/2010/03/improved-wsgi-script-for-use-with.html
>
> The standard WSGI script contents as described by Django's own
> documentation, in my opinion has various problems with it. This is
> because it lazily loads things which can cause issues with
> multithreaded hosting. The solution is to force loading and especially
> the auto discover aspects of Django to happen up front in single
> blocking thread, ie., when WSGI script file is being first loaded.
> This was the potential to eliminate various issues.
>
> So, take your WSGI script customisations for paths etc and apply them
> to the WSGI script file contents described at the end of that blog
> post and see if it makes a difference.
>
> Please let us know if that solves your problems as still waiting to
> good confirmation that it does before I update documentation for
> Django on mod_wsgi touse such a recipe.
>
> Graham
>
> On 18 May 2010 17:22, SimonMeers<[email protected]> wrote:
>
>
>
> > This is almost definitely my own silly mistake somewhere, but it has
> > been driving me crazy for weeks now so thought I'd better check if
> > anyone else has come across it. Very intermittently (every couple of
> > days), I'll receive a Django error email containing something like
> > [1]. It is usually an ImportError, where <PROJECT_B>.wsgi has loaded
> > urls.py from <PROJECT_A> and tried to import an app from the other
> > project. Once or twice it has been an ImproperlyConfigured where
> > <PROJECT_B> has tried load middleware from <PROJECT_C>, etc. It occurs
> > with two particular projects most frequently, but they often swap, and
> > sometimes other projects get involved.
>
> > My httpd.conf can be found below [2]. I'm using mod_wsgi SVN. My
> > standard WSGI script is also provided [3].
>
> > Any ideas?
>
> > Thanks,
> > Simon
>
> > [1] Traceback (most recent call last):
>
> > File "<HOME>/lib/django_1.2/django/core/handlers/base.py", line 91,
> > in get_response
> > request.path_info)
>
> > File "<HOME>/lib/django_1.2/django/core/urlresolvers.py", line 214, in
> > resolve
> > for pattern in self.url_patterns:
>
> > File "<HOME>/lib/django_1.2/django/core/urlresolvers.py", line 243,
> > in _get_url_patterns
> > patterns = getattr(self.urlconf_module, "urlpatterns",
> > self.urlconf_module)
>
> > File "<HOME>/lib/django_1.2/django/core/urlresolvers.py", line 238,
> > in _get_urlconf_module
> > self._urlconf_module = import_module(self.urlconf_name)
>
> > File "<HOME>/lib/django_1.2/django/utils/importlib.py", line 35, in
> > import_module
> > __import__(name)
>
> > File "<HOME>/webapps/django/<PROJECT_A>/urls.py", line 5, in <module>
> > admin.autodiscover()
>
> > File "<HOME>/lib/django_1.2/django/contrib/admin/__init__.py", line
> > 20, in autodiscover
> > mod = import_module(app)
>
> > File "<HOME>/lib/django_1.2/django/utils/importlib.py", line 35, in
> > import_module
> > __import__(name)
>
> > ImportError: No module named <APP_FROM_PROJECT_A>
>
> > <WSGIRequest
> > GET:<QueryDict: {}>,
> > POST:<QueryDict: {}>,
> > COOKIES:{},
> > META:{'DOCUMENT_ROOT': '/etc/httpd/htdocs',
> > 'GATEWAY_INTERFACE': 'CGI/1.1',
> > 'HTTP_ACCEPT_ENCODING': 'identity',
> > 'HTTP_CONNECTION': 'Keep-Alive',
> > 'HTTP_HOST': '<PROJECT_B_DOMAIN>',
> > 'HTTP_USER_AGENT': 'Python-urllib/2.6',
> > 'HTTP_X_FORWARDED_FOR': '<CLIENT_IP>',
> > 'HTTP_X_FORWARDED_HOST': '<PROJECT_B_DOMAIN>',
> > 'HTTP_X_FORWARDED_SERVER': '<PROJECT_B_DOMAIN>',
> > 'PATH_INFO': u'/',
> > 'PATH_TRANSLATED': '<HOME>/webapps/django/<PROJECT_B>.wsgi/',
> > 'QUERY_STRING': '',
> > 'REMOTE_ADDR': '127.0.0.1',
> > 'REMOTE_PORT': '59766',
> > 'REQUEST_METHOD': 'GET',
> > 'REQUEST_URI': '/',
> > 'SCRIPT_FILENAME': '<HOME>/webapps/django/<PROJECT_B>.wsgi',
> > 'SCRIPT_NAME': u'',
> > 'SERVER_ADDR': '127.0.0.1',
> > 'SERVER_ADMIN': '<SERVER_ADMIN_EMAIL>',
> > 'SERVER_NAME': '<PROJECT_B_DOMAIN>',
> > 'SERVER_PORT': '80',
> > 'SERVER_PROTOCOL': 'HTTP/1.1',
> > 'SERVER_SIGNATURE': '',
> > 'SERVER_SOFTWARE': 'Apache',
> > 'mod_wsgi.application_group': '<PROJECT_B_DOMAIN>|',
> > 'mod_wsgi.callable_object': 'application',
> > 'mod_wsgi.handler_script': '',
> > 'mod_wsgi.input_chunked': '0',
> > 'mod_wsgi.listener_host': '',
> > 'mod_wsgi.listener_port': '<PORT_NUMBER>',
> > 'mod_wsgi.process_group': 'AEST',
> > 'mod_wsgi.request_handler': 'wsgi-script',
> > 'mod_wsgi.script_reloading': '1',
> > 'mod_wsgi.version': (4, 0),
> > 'wsgi.errors': <mod_wsgi.Log object at 0xa971cf0>,
> > 'wsgi.file_wrapper': <built-in method file_wrapper of
> > mod_wsgi.Adapter object at 0xa978458>,
> > 'wsgi.input': <mod_wsgi.Input object at 0xa971ed0>,
> > 'wsgi.multiprocess': False,
> > 'wsgi.multithread': True,
> > 'wsgi.run_once': False,
> > 'wsgi.url_scheme': 'http',
> > 'wsgi.version': (1, 1)}>
>
> > [2] httpd.conf:
> > ServerRoot "<HOME>/webapps/django/apache2"
>
> > LoadModule dir_module modules/mod_dir.so
> > LoadModule env_module modules/mod_env.so
> > LoadModule log_config_module modules/mod_log_config.so
> > LoadModule mime_module modules/mod_mime.so
> > LoadModule rewrite_module modules/mod_rewrite.so
> > LoadModule wsgi_module modules/mod_wsgi.so
> > LoadModule alias_module modules/mod_alias.so
> > LoadModule authz_host_module modules/mod_authz_host.so
> > LoadModule auth_digest_module modules/mod_auth_digest.so
> > LoadModule authz_user_module modules/mod_authz_user.so
> > LoadModule authn_file_module modules/mod_authn_file.so
> > LoadModule proxy_module modules/mod_proxy.so
>
> > KeepAlive Off
> > Listen <PORT_NUMBER>
>
> > ServerSignature Off
> > ServerTokens Prod
>
> > StartServers 1
> > MinSpareServers 1
> > MaxSpareServers 3
> > MaxClients 5
> > MaxRequestsPerChild 100
> > ServerLimit 4
> > HostnameLookups Off
>
> > NameVirtualHost 127.0.0.1:<PORT_NUMBER>
> > ServerAdmin <SERVER_ADMIN_EMAIL>
>
> > # Run in separate group to avoid timezone issues
> > #http://code.google.com/p/modwsgi/wiki/ApplicationIssues#Timezone_and_...
> > WSGIDaemonProcess UTC maximum-requests=100 inactivity-timeout=60
> > display-name=%{GROUP}
> > WSGIDaemonProcess AEST maximum-requests=100 inactivity-timeout=60
> > display-name=%{GROUP}
> > # (frequent restarts to keep memory down on shared hosting package)
>
> > WSGIRestrictEmbedded On
> > # (http://blog.dscpl.com.au/2009/11/save-on-memory-with-modwsgi-30.html)
>
> > <VirtualHost 127.0.0.1:<PORT_NUMBER>>
> > WSGIProcessGroup AEST
> > WSGIScriptAlias / <HOME>/webapps/django/<PROJECT_A>.wsgi
> > ServerName <PROJECT_A_DOMAIN>
> > </VirtualHost>
>
> > <VirtualHost 127.0.0.1:<PORT_NUMBER>>
> > WSGIProcessGroup AEST
> > WSGIScriptAlias / <HOME>/webapps/django/<PROJECT_B>.wsgi
> > ServerName <PROJECT_B_DOMAIN>
> > </VirtualHost>
>
> > # etc. Twenty or so more sites here...
>
> > [3] Standard WSGI script:
> > import os
> > import sys
>
> > # avoid WSGI errors with output to stdout
> > sys.stdout = sys.stderr
>
> > sys.path = [
> > '<HOME>/webapps/django', # for PROJECT_NAME
> > '<HOME>/.pythonpath', # other packages
> > '<HOME>/webapps/django/%s' % PROJECT_NAME, # within project
> > ] + sys.path
>
> > settings_module_path = '%s.%s' % (PROJECT_NAME, SETTINGS_MODULE_NAME)
>
> > os.environ['DJANGO_SETTINGS_MODULE'] = settings_module_path
>
> > from django.core.handlers.wsgi import WSGIHandler
> > application = WSGIHandler()
>
> > --
> > You received this message because you are subscribed to the Google Groups
> > "modwsgi" group.
> > To post to this group, send email to [email protected].
> > To unsubscribe from this group, send email to
> > [email protected].
> > For more options, visit this group
> > athttp://groups.google.com/group/modwsgi?hl=en.
>
> --
> You received this message because you are subscribed to the Google Groups
> "modwsgi" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to
> [email protected].
> For more options, visit this group
> athttp://groups.google.com/group/modwsgi?hl=en.
--
You received this message because you are subscribed to the Google Groups
"modwsgi" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/modwsgi?hl=en.