2

Right, I am trying to setup a django dev site based on a current live site. I've setup the new virtualenv and installed all of the dependencies. I've also made a copy of the database and done a fresh DB dump. I'm now getting the error above and I have no idea why.

My django.wsgi file seems to be pointing at the virtalenv. Here is a little more info on the error.

Request Method:     GET
Request URL:    http://website.co.uk/
Django Version:     1.3
Exception Type:     AttributeError
Exception Value:    

'NoneType' object has no attribute 'endswith'

Exception Location:     /usr/lib/python2.6/posixpath.py in join, line 67
Python Executable:  /usr/bin/python
Python Version:     2.6.5
Python Path:    

['/var/www/website.co.uk/website/',
 '/var/www/website.co.uk/website/apps',
 '/var/www/website.co.uk/website/apps',
 '/var/www/website.co.uk',
 '/var/www/website.co.uk/lib/python2.6/site-packages/distribute-0.6.10-py2.6.egg',
 '/var/www/website.co.uk/lib/python2.6/site-packages/pip-1.4.1-py2.6.egg',
 '/usr/lib/python2.6',
 '/usr/lib/python2.6/plat-linux2',
 '/usr/lib/python2.6/lib-tk',
 '/usr/lib/python2.6/lib-old',
 '/usr/lib/python2.6/lib-dynload',
 '/usr/lib/python2.6/dist-packages',
 '/usr/lib/python2.6/dist-packages/PIL',
 '/usr/lib/pymodules/python2.6',
 '/usr/local/lib/python2.6/dist-packages',
 '/var/www/website.co.uk/lib/python2.6/site-packages',
 '/var/www/website.co.uk/lib/python2.6/site-packages/PIL']


 FULL TRACEBACK

Environment:


Request Method: GET
Request URL: http://website.co.uk/

Django Version: 1.3
Python Version: 2.6.5
Installed Applications:
['django.contrib.sites',
 'satchmo_store.shop',
 'django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.comments',
 'django.contrib.sessions',
 'django.contrib.sitemaps',
 'registration',
 'sorl.thumbnail',
 'keyedcache',
 'livesettings',
 'l10n',
 'tax',
 'tax.modules.no',
 'tax.modules.area',
 'tax.modules.percent',
 'shipping',
 'product',
 'payment',
 'satchmo_ext.satchmo_toolbar',
 'satchmo_utils',
 'app_plugins',
 'authority',
 'foodies',
 'localsite',
 'django_extensions',
 'south',
 'django_wysiwyg',
 'mptt',
 'tinymce',
 'tagging',
 'pages',
 'filebrowser',
 'html5lib']
Installed Middleware:
('django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.locale.LocaleMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.middleware.doc.XViewMiddleware',
 'django.middleware.locale.LocaleMiddleware')


Traceback:
File "/usr/local/lib/python2.6/dist-packages/django/core/handlers/base.py" in get_response
  101.                             request.path_info)
File "/usr/local/lib/python2.6/dist-packages/django/core/urlresolvers.py" in resolve
  250.             for pattern in self.url_patterns:
File "/usr/local/lib/python2.6/dist-packages/django/core/urlresolvers.py" in _get_url_patterns
  279.         patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
File "/usr/local/lib/python2.6/dist-packages/django/core/urlresolvers.py" in _get_urlconf_module
  274.             self._urlconf_module = import_module(self.urlconf_name)
File "/usr/local/lib/python2.6/dist-packages/django/utils/importlib.py" in import_module
  35.     __import__(name)
File "/var/www/website.co.uk/website_app/urls.py" in <module>
  4. from satchmo_store.urls import urlpatterns
File "/var/www/website.co.uk/lib/python2.6/site-packages/satchmo_store/urls/__init__.py" in <module>
  28. from default import urlpatterns as defaultpatterns
File "/var/www/website.co.uk/lib/python2.6/site-packages/satchmo_store/urls/default.py" in <module>
  9. admin.autodiscover()
File "/usr/local/lib/python2.6/dist-packages/django/contrib/admin/__init__.py" in autodiscover
  26.             import_module('%s.admin' % app)
File "/usr/local/lib/python2.6/dist-packages/django/utils/importlib.py" in import_module
  35.     __import__(name)
File "/var/www/website.co.uk/website_app/foodies/admin.py" in <module>
  2. from foodies.models import *
File "/var/www/website.co.uk/website_app/foodies/models.py" in <module>
  24. from pages.admin import *
File "/var/www/website.co.uk/lib/python2.6/site-packages/pages/admin/__init__.py" in <module>
  3. from pages import settings
File "/var/www/website.co.uk/lib/python2.6/site-packages/pages/settings.py" in <module>
  144.     join(_media_url, 'pages/'))
File "/usr/lib/python2.6/posixpath.py" in join
  67.         elif path == '' or path.endswith('/'):

Exception Type: AttributeError at /
Exception Value: 'NoneType' object has no attribute 'endswith'

Code from pages/settings.py

    # -*- coding: utf-8 -*-
"""Convenience module that provides default settings for the ``pages``
application when the project ``settings`` module does not contain
the appropriate settings."""
from os.path import join
from django.conf import settings
from django.core.exceptions import ImproperlyConfigured

# The path to default template 
DEFAULT_PAGE_TEMPLATE = getattr(settings, 'DEFAULT_PAGE_TEMPLATE', None)
if DEFAULT_PAGE_TEMPLATE is None:
    raise ImproperlyConfigured('Please make sure you specified a '
                               'DEFAULT_PAGE_TEMPLATE setting.')

# PAGE_TEMPLATES is a list of tuples that specifies the which templates 
# are available in the ``pages`` admin.  Templates should be assigned in 
# the following format:
#
# PAGE_TEMPLATES = (
#    ('pages/nice.html', 'nice one'),
#    ('pages/cool.html', 'cool one'),
# )
#
# One can also assign a callable (which should return the tuple) to this
# variable to achieve dynamic template list e.g.:
#
# def _get_templates():
#    ...
#
# PAGE_TEMPLATES = _get_templates

PAGE_TEMPLATES = getattr(settings, 'PAGE_TEMPLATES', None)
if (PAGE_TEMPLATES is None and 
    not (isinstance(PAGE_TEMPLATES, str) or
         isinstance(PAGE_TEMPLATES, unicode))):
    PAGE_TEMPLATES = ()

# The callable that is used by the CMS
def get_page_templates():
    if callable(PAGE_TEMPLATES):
        return PAGE_TEMPLATES()
    else:
        return PAGE_TEMPLATES

# Set ``PAGE_TAGGING`` to ``False`` if you do not wish to use the 
# ``django-tagging`` application. 
PAGE_TAGGING = getattr(settings, 'PAGE_TAGGING', False)
if PAGE_TAGGING and "tagging" not in getattr(settings, 'INSTALLED_APPS', []):
    raise ImproperlyConfigured('django-tagging could not be found.\n'
                               'Please make sure you\'ve installed it '
                               'correctly or disable the tagging feature by '
                               'setting PAGE_TAGGING to False.')

# Set this to ``True`` if you wish to use the ``django-tinymce`` application.
PAGE_TINYMCE = getattr(settings, 'PAGE_TINYMCE', False)
if PAGE_TINYMCE and "tinymce" not in getattr(settings, 'INSTALLED_APPS', []):
    raise ImproperlyConfigured('django-tinymce could not be found.\n'
                               'Please make sure you\'ve installed it '
                               'correctly or disable the tinymce feature by '
                               'setting PAGE_TINYMCE to False.')

# Set ``PAGE_UNIQUE_SLUG_REQUIRED`` to ``True`` to enforce unique slug names 
# for all pages.
PAGE_UNIQUE_SLUG_REQUIRED = getattr(settings, 'PAGE_UNIQUE_SLUG_REQUIRED', 
                                    False)

# Set ``PAGE_CONTENT_REVISION`` to ``False`` to disable the recording of 
# pages revision information in the database
PAGE_CONTENT_REVISION = getattr(settings, 'PAGE_CONTENT_REVISION', True)

# A list tuples that defines the languages that pages can be translated into.
#
# gettext_noop = lambda s: s
#
# PAGE_LANGUAGES = (
#    ('zh-cn', gettext_noop('Chinese Simplified')),
#    ('fr-ch', gettext_noop('Swiss french')),
#    ('en-us', gettext_noop('US English')),
#)
PAGE_LANGUAGES = getattr(settings, 'PAGE_LANGUAGES', settings.LANGUAGES)

# Defines which language should be used by default.  If 
# ``PAGE_DEFAULT_LANGUAGE`` not specified, then project's
# ``settings.LANGUAGE_CODE`` is used
PAGE_DEFAULT_LANGUAGE = getattr(settings, 'PAGE_DEFAULT_LANGUAGE', 
                                settings.LANGUAGE_CODE)

extra = [('can_freeze', 'Can freeze page',)]
for lang in PAGE_LANGUAGES:
    extra.append(
        ('can_manage_' + lang[0].replace('-', '_'),
        'Manage' + ' ' + lang[1])
    )

PAGE_EXTRA_PERMISSIONS = getattr(settings, 'PAGE_EXTRA_PERMISSIONS', extra)

# PAGE_LANGUAGE_MAPPING should be assigned a function that takes a single
# argument, the language code of the incoming browser request.  This function
# maps the incoming client language code to another language code, presumably
# one for which you have translation strings.  This is most useful if your
# project only has one set of translation strings for a language like Chinese,
# which has several variants like ``zh-cn``, ``zh-tw``, ``zh-hk`, etc., but
# you want to provide your Chinese translations to all Chinese browsers, not
# just those with the exact ``zh-cn``
# locale.
#
# Enable that behavior here by assigning the following function to the
# PAGE_LANGUAGE_MAPPING variable.
#
#     def language_mapping(lang):
#         if lang.startswith('zh'):
#             return 'zh-cn'
#         return lang
#     PAGE_LANGUAGE_MAPPING = language_mapping 
PAGE_LANGUAGE_MAPPING = getattr(settings, 'PAGE_LANGUAGE_MAPPING', lambda l: l)

# Set SITE_ID to the id of the default ``Site`` instance to be used on
# installations where content from a single installation is served on 
# multiple domains via the ``django.contrib.sites`` framework.
SITE_ID = getattr(settings, 'SITE_ID', 1)

# Set PAGE_USE_SITE_ID to ``True`` to make use of the ``django.contrib.sites``
# framework
PAGE_USE_SITE_ID = getattr(settings, 'PAGE_USE_SITE_ID', False)

# Set PAGE_USE_LANGUAGE_PREFIX to ``True`` to make the ``get_absolute_url``
# method to prefix the URLs with the language code
PAGE_USE_LANGUAGE_PREFIX = getattr(settings, 'PAGE_USE_LANGUAGE_PREFIX',
                                                                        False)

# Assign a list of placeholders to PAGE_CONTENT_REVISION_EXCLUDE_LIST
# to exclude them from the revision process.
PAGE_CONTENT_REVISION_EXCLUDE_LIST = getattr(settings,
    'PAGE_CONTENT_REVISION_EXCLUDE_LIST', ()
)

# Set ``PAGE_SANITIZE_USER_INPUT`` to ``True`` to sanitize the user input with
# ``html5lib``
PAGE_SANITIZE_USER_INPUT = getattr(settings, 'PAGE_SANITIZE_USER_INPUT', False)

# URL that handles pages media and uses <MEDIA_ROOT>/pages by default.
_media_url = getattr(settings, "STATIC_URL", settings.MEDIA_URL)
PAGES_MEDIA_URL = getattr(settings, 'PAGES_MEDIA_URL',
    join(_media_url, 'pages/'))

# Hide the slug's of the first root page ie: ``/home/`` becomes ``/``
PAGE_HIDE_ROOT_SLUG = getattr(settings, 'PAGE_HIDE_ROOT_SLUG', False)

# Show the publication start date field in the admin.  Allows for future dating
# Changing the ``PAGE_SHOW_START_DATE``  from ``True`` to ``False``
# after adding data could cause some weirdness.  If you must do this, you 
# should update your database to correct any future dated pages.
PAGE_SHOW_START_DATE = getattr(settings, 'PAGE_SHOW_START_DATE', False)

# Show the publication end date field in the admin, allows for page expiration
# Changing ``PAGE_SHOW_END_DATE`` from ``True`` to ``False`` after adding 
# data could cause some weirdness.  If you must do this, you should update 
# your database and null any pages with ``publication_end_date`` set.
PAGE_SHOW_END_DATE = getattr(settings, 'PAGE_SHOW_END_DATE', False)

# ``PAGE_CONNECTED_MODELS`` allows you to specify a model and form for this 
# model into your settings to get an automatic form to create
# and directly link a new instance of this model with your page in the admin.
#
# Here is an example:
#
# PAGE_CONNECTED_MODELS = [
#     {'model':'documents.models.Document',
#        'form':'documents.models.DocumentForm'},
# ]
#
PAGE_CONNECTED_MODELS = getattr(settings, 'PAGE_CONNECTED_MODELS', False)

# The page link filter enable a output filter on you content links. The goal
# is to transform special page class into real links at the last moment.
# This ensure that even if you have moved a page, the URL will remain correct.
PAGE_LINK_FILTER = getattr(settings, 'PAGE_LINK_FILTER', False)

# This setting is a function that can be defined if you need to pass extra
# context data to the pages templates.
PAGE_EXTRA_CONTEXT = getattr(settings, 'PAGE_EXTRA_CONTEXT', None)

# This setting is the name of a sub-folder where uploaded content, like
# placeholder images, is placed.
PAGE_UPLOAD_ROOT = getattr(settings, 'PAGE_UPLOAD_ROOT', 'upload')

I hope this is enough to go on but i'm really stuck as to why this is coming up!

Thanks

Burhan Khalid
  • 169,990
  • 18
  • 245
  • 284
JDavies
  • 2,730
  • 7
  • 34
  • 54

2 Answers2

3

In this stanza:

# URL that handles pages media and uses <MEDIA_ROOT>/pages by default.
_media_url = getattr(settings, "STATIC_URL", settings.MEDIA_URL)
PAGES_MEDIA_URL = getattr(settings, 'PAGES_MEDIA_URL',
    join(_media_url, 'pages/'))

STATIC_URL is not in settings, and settings.MEDIA_URL is None. Looks like you need to fix your settings.

Ethan Furman
  • 63,992
  • 20
  • 159
  • 237
  • Thanks, was a strange one but on the live site the 'STATIC_URL' was not set, so i've not set it on the dev site (the one i'm having an issue with) and it's all working fine. Thanks again for your help, much appreciated! – JDavies Sep 12 '13 at 10:59
1

in this line,

ile "/usr/lib/python2.6/posixpath.py" in join
  67.         elif path == '' or path.endswith('/'):

path is None. so a nonetype("path") has to attribute .endswith

i would suggest like the other users said to put the full traceback error and check your code and see why path is None.

riyoken
  • 574
  • 2
  • 7
  • 17