Reputation: 94
I'm getting an error while making a request to Django devserver (it is running in virtual environment dj_venv):
[19/Jul/2016 11:32:40] "GET / HTTP/1.1" 500 59
Traceback (most recent call last):
File "/usr/lib/python2.7/wsgiref/handlers.py", line 85, in run
self.result = application(self.environ, self.start_response)
File "/home/daria/venvs/dj_venv/local/lib/python2.7/site-packages/django/contrib/staticfiles/handlers.py", line 67, in __call__
return self.application(environ, start_response)
File "/home/daria/venvs/dj_venv/local/lib/python2.7/site-packages/django/core/handlers/wsgi.py", line 241, in __call__
response = self.get_response(request)
File "/home/daria/venvs/dj_venv/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 82, in get_response
urlconf = settings.ROOT_URLCONF
File "/home/daria/venvs/dj_venv/local/lib/python2.7/site-packages/django/utils/functional.py", line 185, in inner
return func(self._wrapped, *args)
AttributeError: 'Settings' object has no attribute 'ROOT_URLCONF'
The weird thing is that when I start server and don't make any request, I don't get any errors:
daria@daria:~/cms.media$ . ../venvs/dj_venv/bin/activate
(dj_venv) daria@daria:~/cms.media$ python manage.py runserver Validating models...
0 errors found Django version 1.4.11, using settings 'apps.settings' Development server is running at http://127.0.0.1:8000/ Quit the server with CONTROL-C.
But after the first request I get an AttributeError as presented above.
I understand that this error is thrown because my settings object has no attribute 'ROOT_URLCONF', but I have defined it in settings.py and in global_settings.py of my virtual environment. I also looked at these articles:
Official docs (ROOT_URLCONF option and how Django processes a request)
Related topics:
And I checked these points:
DJANGO_SETTING_MODULE is defined in manage.py (points to apps.settings)
ROOT_URLCONF is defined in settings.py (points to outer urls.py in apps folder)
DJANGO_SETTING_MODULE and ROOT_URLCONF added to PyCharm's Run > Edit Configuration > Environment variables
There is Environment variables:
DEFAULT_INDEX_TABLESPACE=1
DJANGO_SETTINGS_MODULE=apps.settings
PYTHONUNBUFFERED=1
ROOT_URLCONF=urls
There is my project structure:
.
├── apps
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ ├── wsgi.py
│ └── webapp
│ ├── context_processors.py
│ ├── defaults.py
│ ├── __init__.py
│ ├── models.py
│ ├── templates
│ │ └── ...
│ ├── urls.py
│ └── views.py
├── manage.py
└── ...
Also setting.py which defines ROOT_URLCONF:
import os
import sys
from django.utils.translation import ugettext_noop as _
from django import template
DEBUG = True
# turn off for the perfomance in the production server
TEMPLATE_DEBUG = DEBUG
#USE_TZ = False
#TIME_ZONE = 'Europe/Moscow'
LANGUAGE_CODE = 'ru'
USE_I18N = True
USE_L10N = True
############
# SPICY App
APP_VERSION = '2.0'
AJAX_API_VERSION = '1.0'
# deprecated
MESSAGES = {'success': _('Changes were successfully saved.'),
'error': _('Please, correct the errors below.')}
APP_SOURCE_PATH = 'apps/'
PROJECT_ROOT = os.path.abspath('.')
ADDITIONAL_PYTHON_PATH = [
os.path.join(PROJECT_ROOT, APP_SOURCE_PATH),
]
############
# SITESKIN & STATIC
SITE_ID = 1
USE_CUSTOM_ADMIN = True
# deprecated
SITESKIN = ''
AJAX_ACCESS_CONTROL_ALLOW_ORIGIN = '*.localhost'
CACHE_PREFIX = '%s-' % SITESKIN
CACHE_BACKEND = 'locmem://'
###################
# PROFILE
LOGIN_REDIRECT_URL = '/'
LOGIN_URL = '/signin/'
REGISTRATION_OPEN = True
SECRET_KEY = 'lalala'
LOGIN_URL = '/signin/'
LOGIN_REDIRECT_URL = '/'
AUTHENTICATION_BACKENDS = (
'spicy.core.profile.auth_backends.CustomUserModelBackend',
)
USE_CAPTCHA = False
USE_FEEDBACK_CAPTCHA = False
CAPTCHA_CHALLENGE_FUNCT = 'captcha.helpers.math_challenge'
CAPTCHA_NOISE_FUNCTIONS = ()
#('captcha.helpers.noise_arcs','captcha.helpers.noise_dots',)
...
###############
## DJANGO
ADMINS = (
# ('Your Name', '[email protected]'),
)
MANAGERS = ADMINS
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
}
}
#CACHE_BACKEND = 'memcached://127.0.0.1:11311/'#'locmem:///'
CACHE_TIMEOUT = 1*60 # seconds
SESSION_EXPIRE_AT_BROWSER_CLOSE = True
SESSION_ENGINE = "django.contrib.sessions.backends.cached_db"
SESSION_SAVE_EVERY_REQUEST = True
#SESSION_COOKIE_DOMAIN = ''
STATIC_URL = '/static/'
THEMES_PATH = os.path.abspath('..')
try:
from config import *
except ImportError, msg:
raise ImportError, 'Using default config settings, check "config" directory.\n'
for _path in ADDITIONAL_PYTHON_PATH:
sys.path.insert(0, os.path.abspath(_path))
## deprecated
# while SITESKIN exists
STATIC_ROOT = os.path.abspath('../static/')
## deprecated
SERVICES = (
'spicy.core.profile.services.ProfileService',
'spicy.core.trash.services.TrashService',
'spicy.mediacenter.services.MediaService',
'spicy.mediacenter.services.LibraryService',
'spicy.history.services.HistoryService',
'spicy.xtag.services.TagService',
'spicy.ratings.services.RatingService',
)
LOCALE_PATHS = (os.path.join(PROJECT_ROOT, 'locale'), )
#TEST_RUNNER = 'django_nose.runner.NoseTestSuiteRunner'
#NOSE_ARGS = ['-v', '--with-color']
ROOT_URLCONF = 'apps.urls'
STATICFILES_FINDERS = (
'spicy.core.siteskin.loaders.ThemeStaticFinder',
'spicy.core.siteskin.loaders.AppDirectoriesFinder',
# 'django.contrib.staticfiles.finders.DefaultStorageFinder',
)
TEMPLATE_LOADERS = (
'spicy.core.siteskin.loaders.ThemeTemplateLoader',
'django.template.loaders.app_directories.Loader',
'spicy.core.siteskin.loaders.BackendTemplateLoader',
)
template.add_to_builtins('django.templatetags.i18n')
TEMPLATE_CONTEXT_PROCESSORS = (
'django.contrib.auth.context_processors.auth',
'spicy.core.profile.context_processors.auth',
'spicy.core.siteskin.context_processors.base',
'spicy.core.admin.context_processors.base',
'django.core.context_processors.debug',
'django.core.context_processors.i18n',
'django.core.context_processors.media',
'django.core.context_processors.request',
'apps.webapp.context_processors.site_content',
)
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
#'django.middleware.locale.LocaleMiddleware', - don't use it =)
'django.middleware.common.CommonMiddleware',
'spicy.core.profile.middleware.AuthMiddleware',
'django.middleware.doc.XViewMiddleware',
# XXX is it required ??
'spicy.core.siteskin.middleware.AjaxMiddleware',
'spicy.core.siteskin.threadlocals.ThreadLocals',
)
if DEBUG:
MIDDLEWARE_CLASSES += (
# for developers
'spicy.core.rmanager.middleware.ProfileMiddleware',
)
INSTALLED_APPS = [
# Django admin
'django.contrib.admin',
# Django native apps
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.humanize',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.staticfiles',
# Application
'apps.webapp',
# Spicy core components
'spicy.core.admin',
'spicy.core.service',
'spicy.core.siteskin',
'spicy.core.simplepages',
# Spicy apps
'spicy.presscenter',
'spicy.categories',
'spicy.mediacenter',
'spicy.core.profile',
'spicy.feedback',
# 'spicy.labels',
'spicy.seo',
'spicy.xtag',
# 'django_nose',
# 'captcha',
'sorl.thumbnail',
'pytils',
'raven.contrib.django.raven_compat',
]
# A sample logging configuration. The only tangible logging
# performed by this configuration is to send an email to
# the site admins on every HTTP 500 error when DEBUG=False.
# See http://docs.djangoproject.com/en/dev/topics/logging for
# more details on how to customize your logging configuration.
LOGGING = {
'version': 1,
'disable_existing_loggers': True,
'formatters': {
'common': {
'format': '[%(asctime)s][%(levelname)-9s] %(name)s %(filename)s:%(funcName)s:%(lineno)d | %(message)s',
'datefmt': '%H:%M:%S',
},
},
'handlers': {
'null': {
'level': 'DEBUG',
'class': 'django.utils.log.NullHandler',
},
'console':{
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'common'
},
# 'sentry': {
# 'level': 'INFO',
# 'class': 'raven.handlers.logging.SentryHandler',
# 'dsn': '{{ spicy.config.sentry }}',
# }
},
'loggers': {
'': {
'handlers': ['console'],
'propagate': True,
'level': 'INFO',
},
'django': {
'handlers': ['console'],
'propagate': True,
'level': 'INFO',
},
'django.request': {
'handlers': ['console'],
'level': 'ERROR',
'propagate': False,
},
}
}
# App custom models
#CUSTOM_USER_MODEL = ''
CUSTOM_DOCUMENT_MODEL = 'webapp.Document'
#LABELS_CONSUMER = CUSTOM_DOCUMENT_MODEL
#CUSTOM_MEDIA_MODEL = 'blog.BlogMedia'
#CUSTOM_MEDIA_PROVIDER_MODEL = 'blog.BlogMediaProvider'
And manage.py:
#!/usr/bin/env python
import os, sys
from importlib import import_module
os.environ.setdefault("DJANGO_SETTINGS_MODULE", 'apps.settings')
from django.conf import settings
from django.core.management import execute_from_command_line
execute_from_command_line(sys.argv)
Outer urls.py (./apps/urls.py):
from django.conf.urls.defaults import include, patterns, url
from django.conf import settings
from spicy import utils
from django.contrib import admin
admin.autodiscover()
handler404 = 'spicy.core.siteskin.views.page_not_found'
handler500 = 'spicy.core.siteskin.views.server_error'
handler403 = 'spicy.core.siteskin.views.forbidden'
urlpatterns = patterns(
'',
url(r'^django/', include(admin.site.urls)),
url(r'^', include('spicy.core.admin.urls', namespace='spicyadmin')),
url(r'^captcha/', include('captcha.urls')),
)
Inner urls.py (./apps/webapp/urls.py):
from django.conf.urls.defaults import *
public_urls = patterns(
'',
)
public_urls += patterns(
url(r'^create/$', 'create_article', name='create'),
url(r'^a(?P<doc_id>\d+)/$', 'document', name='doc'),
url(r'^a(?P<doc_id>\d+)/edit/$', 'edit_article', name='edit'),
)
urlpatterns = patterns(
'',
url(r'^', include(public_urls, namespace='public'))
)
What may be the reason of that exception? I have tried all that I found in stackoverflow. I guess the reason may be in wrong references to settings.py or ROOT_URLCONF, I have tried various choices but I am still getting the Attribute error.
And also I guess that the reason could be in middleware which may redefine ROOT_URLCONF while the server is performing a request (because it is ok before I wouldn't make any request to server), but I don't know where I can fix it.
Am I right in my guesses? And if yes, how can I solve my problem? Hope for any help!
Upvotes: 3
Views: 7351
Reputation: 783
It seems you have to register your app (Apparently called "apps") to your INSTALLED_APPS
.
Also, you are setting apps.urls
in your ROOT_URLCONF
, but setting just urls
(without the apps.
part) on your environmental values
Upvotes: 1