I have a django (1.6.x) project that runs fine with the dev server, but is failing under Apache2 (2.2.22.1) and mod_wsgi (3.3-4) on Ubuntu 12.04.3 with the error
ImproperlyConfigured: The included urlconf erp.urls doesn't have any patterns in it
I don't understand why it would work with the dev server but not Apache2/mod_wsgi and I'm finding it difficult to track down where the error is coming from.
There are a number of other SO questions similar, but the only place I use reverse (one problem previously found) is in get_absolute_url in my models - this should be fine?
The project is set up a la Two Scoops style, in particular the layout is:
<repository_root>/<django_project_root>/<configuration_root>/
which translates to:
erp_root/erp/erp/
and the settings are
erp_root/erp/erp/settings/*py
(including the __init__.py
)
erp/urls.py;
from django.conf import settings from django.conf.urls import patterns, include, url from django.contrib import admin admin.autodiscover() urlpatterns = patterns('', url(r'^$', 'django.contrib.auth.views.login', {'template_name': 'login.html'}), url(r'^admin/', include(admin.site.urls)), url(r'^login/$', 'django.contrib.auth.views.login', {'template_name': 'login.html'}, name='login'), url(r'^logout/$', 'django.contrib.auth.views.logout_then_login', {}, name='logout'), url(r'^search/', include('haystack.urls')), url(r'^inventory/', include('inventory.urls')), ) if settings.DEBUG: import debug_toolbar urlpatterns += patterns('', url(r'^__debug__/', include(debug_toolbar.urls)), )
and inventory/urls.py:
from django.conf.urls import url, patterns from .forms import CarrierWizardForm1, CarrierWizardForm2, MovementWizardForm1,MovementWizardForm2 from . import views carrier_wizard_forms = [CarrierWizardForm1, CarrierWizardForm2] movement_wizard_forms = [MovementWizardForm1, MovementWizardForm2] urlpatterns = patterns('', url(r'^$', views.PartNumberListView.as_view(), name='inventory_list_index'), url(r'^parttype/$', views.part_type_list, name='index'), url(r'^parttype/(?P<parttype>\d{2})/$', views.part_type_view, name='part_type_view'), url(r'^partnumber/$', views.PartNumberListView.as_view(), name='partnumber_list'), url(r'^partnumber/add/$', views.PartNumberCreateView.as_view(), name='partnumber_add'), url(r'^partnumber/(?P<slug>[-\w]+)/$', views.PartNumberView.as_view(), name='partnumber_view'), url(r'^partnumber/(?P<slug>[-\w]+)/update/$', views.PartNumberUpdateView.as_view(), name='partnumber_update'), url(r'^partnumber/(?P<slug>[-\w]+)/delete/$', views.PartNumberDeleteView.as_view(), name='partnumber_delete'), .... )
and erp/settings/dev.py:
# Django settings for erp project. # settings.py from unipath import Path PROJECT_DIR = Path(__file__).ancestor(3) MEDIA_ROOT = PROJECT_DIR.child("media") STATIC_ROOT = PROJECT_DIR.child("static") STATICFILES_DIRS = ( PROJECT_DIR.child("assets"), ) TEMPLATE_DIRS = ( PROJECT_DIR.child("templates"), ) DEBUG = True TEMPLATE_DEBUG = DEBUG TIME_ZONE = 'Australia/Melbourne' LANGUAGE_CODE = 'en-au' SITE_ID = 1 USE_TZ = True DATE_FORMAT = 'd/m/y' SHORT_DATE_FORMAT = 'd/m/y' # URL that handles the media served from MEDIA_ROOT. Make sure to use a # trailing slash. # Examples: "http://example.com/media/", "http://media.example.com/" MEDIA_URL = '' # Absolute path to the directory static files should be collected to. # Don't put anything in this directory yourself; store your static files # in apps' "static/" subdirectories and in STATICFILES_DIRS. # Example: "/var/www/example.com/static/" STATIC_ROOT = '' # URL prefix for static files. # Example: "http://example.com/static/", "http://static.example.com/" STATIC_URL = '/static/' STATICFILES_FINDERS = ( 'django.contrib.staticfiles.finders.FileSystemFinder', 'django.contrib.staticfiles.finders.AppDirectoriesFinder', ) # List of callables that know how to import templates from various sources. TEMPLATE_LOADERS = ( 'django.template.loaders.filesystem.Loader', 'django.template.loaders.app_directories.Loader', ) MIDDLEWARE_CLASSES = ( 'debug_toolbar.middleware.DebugToolbarMiddleware', 'django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'stronghold.middleware.LoginRequiredMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ) ROOT_URLCONF = 'erp.urls' # Python dotted path to the WSGI application used by Django's runserver. WSGI_APPLICATION = 'erp.wsgi.application' INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.messages', 'django.contrib.staticfiles', 'django.contrib.admin', 'django.contrib.formtools', 'django.contrib.humanize', 'inventory', 'django_extensions', 'extra_views', 'debug_toolbar', 'django_tables2', 'stronghold', 'bootstrap3', 'haystack', ) LOGIN_URL = '/login' LOGOUT_URL = '/logout' # For Stronghold STRONGHOLD_PUBLIC_NAMED_URLS = ( 'login', 'logout', ) # This is required by the debug toolbar middleware INTERNAL_IPS = ('192.168.0.16','0.0.0.0','127.0.0.1','::1', '192.168.0.115') # This is reqquired by django_tables2 TEMPLATE_CONTEXT_PROCESSORS = ("django.contrib.auth.context_processors.auth", "django.core.context_processors.debug", "django.core.context_processors.i18n", "django.core.context_processors.media", "django.core.context_processors.static", "django.core.context_processors.tz", "django.contrib.messages.context_processors.messages", "django.core.context_processors.request" ) } LOGIN_REDIRECT_URL = '/inventory/' DEBUG_TOOLBAR_PANELS = [ 'debug_toolbar.panels.versions.VersionsPanel', 'debug_toolbar.panels.timer.TimerPanel', 'debug_toolbar.panels.settings.SettingsPanel', 'debug_toolbar.panels.headers.HeadersPanel', 'debug_toolbar.panels.request.RequestPanel', 'debug_toolbar.panels.sql.SQLPanel', 'debug_toolbar.panels.staticfiles.StaticFilesPanel', 'debug_toolbar.panels.templates.TemplatesPanel', 'debug_toolbar.panels.cache.CachePanel', 'debug_toolbar.panels.signals.SignalsPanel', 'debug_toolbar.panels.logging.LoggingPanel', ] def show_toolbar(request): return True # Always show toolbar, for example purposes only. DEBUG_TOOLBAR_CONFIG = { 'INTERCEPT_REDIRECTS': False, 'INSERT_BEFORE': '</body>', 'ENABLE_STACKTRACES': True, } # This is required for Haystack - the search engine HAYSTACK_CONNECTIONS = { 'default': { 'ENGINE': 'haystack.backends.solr_backend.SolrEngine', 'URL': 'http://127.0.0.1:8085/solr/erp', }, }
My wsgi is the standard with minor settings mod:
import os os.environ.setdefault("DJANGO_SETTINGS_MODULE", "erp.settings.settings") from django.core.wsgi import get_wsgi_application application = get_wsgi_application()
My apache2/sites-avail/erp.conf is:
<VirtualHost *:80> ServerName deverp ServerAdmin administrator DocumentRoot /path/www/dev/erp/erp/ ErrorLog /var/log/apache2/dev/error.log CustomLog /var/log/apache2/dev/access.log combined WSGIDaemonProcess deverp python-path=/path/www/dev/erp/erp:/path/.virtualenvs/erp-dev/lib/python2.7/site-packages WSGIProcessGroup deverp WSGIScriptAlias / /path/www/dev/erp/erp/erp/wsgi.py <Directory /path/www/dev/erp/erp/erp> <Files wsgi.py> Order deny,allow Allow from all </Files> </Directory> </VirtualHost>
So, I actually ran into a similar problem. Coincidentally after you posted in the issues for django-stronghold. The issue is in fact due to a missing setting in django-debug-toolbar.
The setting you are missing is:
DEBUG_TOOLBAR_PATCH_SETTINGS = False
It will work with runserver, but if you try to run it with honcho, or gunicorn, or anything else that uses the WSGI interface it blows up.
Hope this helps!
EDIT: as mentioned below by @japhyr, its useful to check out the explicit setup instructions: http://django-debug-toolbar.readthedocs.org/en/1.0/installation.html#explicit-setup
I used reverse instead of reverse_lazy to define the url parameter of a RedirectView.
class YourRedirectView(RedirectView): url = reverse('reversed_url')
Since the urls.py has not been initialized yet the error is coming up. Just use:
class YourRedirectView(RedirectView): url = reverse_lazy('reversed_url')
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With