Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django: AttributeError: 'NoneType' object has no attribute 'split'

I'm trying to build a static site generator using Django (because its resourceful that way), and right now my problems are dealing with the Django command that is supposed to build my static site content into a directory. Apparently my 'NoneType' object has no attribute 'split', but I dont know what that 'NoneType' object is.

(thisSite) C:\Users\Jaysp_000\thisSite\PROJECTx>python prototype.py build
Traceback (most recent call last):
  File "prototype.py", line 31, in <module>
    execute_from_command_line(sys.argv)
  File "C:\Users\Jaysp_000\thisSite\lib\site-packages\django\core\management\__init__.py",
 line 338, in execute_from_command_line
    utility.execute()
  File "C:\Users\Jaysp_000\thisSite\lib\site-packages\django\core\management\__init__.py",
 line 330, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "C:\Users\Jaysp_000\thisSite\lib\site-packages\django\core\management\base.py", lin
e 390, in run_from_argv
    self.execute(*args, **cmd_options)
  File "C:\Users\Jaysp_000\thisSite\lib\site-packages\django\core\management\base.py", lin
e 441, in execute
    output = self.handle(*args, **options)
  File "C:\Users\Jaysp_000\thisSite\PROJECTx\sitebuilder\management\commands\build.py", li
ne 38, in handle
    response = this_client_will.get(the_page_url)
  File "C:\Users\Jaysp_000\thisSite\lib\site-packages\django\test\client.py", line 500, in
 get
    **extra)
  File "C:\Users\Jaysp_000\thisSite\lib\site-packages\django\test\client.py", line 303, in
 get
    return self.generic('GET', path, secure=secure, **r)
  File "C:\Users\Jaysp_000\thisSite\lib\site-packages\django\test\client.py", line 379, in
 generic
    return self.request(**r)
  File "C:\Users\Jaysp_000\thisSite\lib\site-packages\django\test\client.py", line 466, in
 request
    six.reraise(*exc_info)
  File "C:\Users\Jaysp_000\thisSite\lib\site-packages\django\utils\six.py", line 659, in r
eraise
    raise value
  File "C:\Users\Jaysp_000\thisSite\lib\site-packages\django\core\handlers\base.py", line
132, in get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\Jaysp_000\thisSite\PROJECTx\sitebuilder\views.py", line 35, in page
    return render(request, 'page.html', context)
  File "C:\Users\Jaysp_000\thisSite\lib\site-packages\django\shortcuts.py", line 67, in re
nder
    template_name, context, request=request, using=using)
  File "C:\Users\Jaysp_000\thisSite\lib\site-packages\django\template\loader.py", line 99,
 in render_to_string
    return template.render(context, request)
  File "C:\Users\Jaysp_000\thisSite\lib\site-packages\django\template\backends\django.py",
 line 74, in render
    return self.template.render(context)
  File "C:\Users\Jaysp_000\thisSite\lib\site-packages\django\template\base.py", line 208,
in render
    with context.bind_template(self):
  File "C:\Python34\Lib\contextlib.py", line 59, in __enter__
    return next(self.gen)
  File "C:\Users\Jaysp_000\thisSite\lib\site-packages\django\template\context.py", line 23
5, in bind_template
    updates.update(processor(self.request))
  File "C:\Users\Jaysp_000\thisSite\lib\site-packages\django\template\context_processors.p
y", line 56, in i18n
    context_extras['LANGUAGE_BIDI'] = translation.get_language_bidi()
  File "C:\Users\Jaysp_000\thisSite\lib\site-packages\django\utils\translation\__init__.py
", line 177, in get_language_bidi
    return _trans.get_language_bidi()
  File "C:\Users\Jaysp_000\thisSite\lib\site-packages\django\utils\translation\trans_real.
py", line 263, in get_language_bidi
    base_lang = get_language().split('-')[0]
AttributeError: 'NoneType' object has no attribute 'split'

It seems that my problem lies in my command file, which I call build. The traceback also brings up my views file, which works well on its own (that is, my html files can be properly served on the local server), but I will include it anyway.

build.py

import os, shutil
from django.conf import settings
from django.core.management import call_command
from django.core.management.base import BaseCommand
from django.core.urlresolvers import reverse
from django.test.client import Client

def get_pages():
    for name in os.listdir(settings.STATIC_PAGES_DIRECTORY):
        if name.endswith('.html'):
            yield name[:-5]


class Command(BaseCommand):
    help = 'Build static site output.'

    def handle(self, *args, **options):
        """Request pages and build output."""
        if os.path.exists(settings.SITE_OUTPUT_DIRECTORY):
            shutil.rmtree(settings.SITE_OUTPUT_DIRECTORY)
        os.mkdir(settings.SITE_OUTPUT_DIRECTORY) 
        os.makedirs(settings.STATIC_ROOT)   
        call_command('collectstatic', interactive=False, clear=True, verbosity=0)
        this_client_will = Client()

        for page in get_pages():
            the_page_url = reverse('page',kwargs={'slug': page})      # PROBLEM SEEMS TO GENERATE STARTING HERE
            response = this_client_will.get(the_page_url)
            if page == 'index.html':
                output_dir = settings.SITE_OUTPUT_DIRECTORY
            else:
                output_dir = os.path.join(settings.SITE_OUTPUT_DIRECTORY, page)
                os.makedirs(output_dir)
            with open(os.path.join(output_dir, 'index.html'), 'wb', encoding='utf8') as f:
                f.write(response.content)

views.py

import os
from django.conf import settings
from django.http import Http404
from django.shortcuts import render
from django.template import Template
from django.utils._os import safe_join

# Create your views here.

def get_page_or_404(name):
    """Returns page content as a Django template or raise 404 error"""
    try:
        file_path = safe_join(settings.STATIC_PAGES_DIRECTORY, name)
    except ValueError:
        raise Http404("Page Not Found")
    else:
        if not os.path.exists(file_path):
            raise Http404("Page Not Found")

    with open(file_path,"r", encoding='utf8') as f:
        the_page = Template(f.read())

    return the_page

def page(request, slug='index'):
    """ Render the requested page if found """
    file_name = '{0}.html'.format(slug)
    page = get_page_or_404(file_name)
    context = {'slug': slug, 'page': page} 
    return render(request, 'page.html', context)   # THE TRACEBACK POINTS AT THIS LINE, TOO

and just in case it becomes useful to know, here is my urls.py:

from django.conf.urls import include, url

urlpatterns = [
    url(r'^page/(?P<slug>[-\w]+)/$', 'sitebuilder.views.page', name='page'),
    url(r'^page$', 'sitebuilder.views.page', name='homepage'),
]

I find this frustrating, primarily because this problem seems to be tied to the reverse() function, as seen in the build module, and I havent had a great time using that function for as long as I can remember, but I dont know if this is really my problem. Can someone help me figure out where my issue is coming from and how to solve it (if you have any tips)? It would be much appreciated.

like image 663
JellisHeRo Avatar asked Jan 03 '16 01:01

JellisHeRo


People also ask

Has no attribute split Python?

The Python "AttributeError: 'list' object has no attribute 'split'" occurs when we call the split() method on a list instead of a string. To solve the error, call split() on a string, e.g. by accessing the list at a specific index or by iterating over the list. Here is an example of how the error occurs.

Which triggered exception AttributeError NoneType object has no attribute split?

Conclusion # The Python "AttributeError: 'NoneType' object has no attribute 'split'" occurs when we try to call the split() method on a None value, e.g. assignment from function that doesn't return anything. To solve the error, make sure to only call split() on strings.

What does NoneType mean in Python?

NoneType in Python is a data type that simply shows that an object has no value/has a value of None . You can assign the value of None to a variable but there are also methods that return None .

How do you handle Typeerror NoneType object is not Subscriptable?

Hence, the error 'NoneType' object is not subscriptable. What is this? An object can only be subscriptable if its class has __getitem__ method implemented. By using the dir function on the list, we can see its method and attributes.


2 Answers

base_lang = get_language().split('-')[0]

This line is a bug in Django 1.8. It was fixed as part of 1.8.1:

Prevented TypeError in translation functions check_for_language() and get_language_bidi() when translations are deactivated (#24569).

You should upgrade to the latest 1.8.x release, 1.8.8. at the time of writing. That will fix this bug and others.

Minor releases only contain bugfixes and security patches, so you should always upgrade to the latest minor release for whatever major version you're using.

like image 152
knbk Avatar answered Sep 20 '22 23:09

knbk


try to activate a language in your page view:

from django.utils import translation

def page(request, slug='index'):
    """ Render the requested page if found """
    file_name = '{0}.html'.format(slug)
    page = get_page_or_404(file_name)
    context = {'slug': slug, 'page': page} 
    translation.activate('en') # <------- Activate language EN
    return render(request, 'page.html', context) 

it is because context processor is trying to get the context language and it is obviously None.

update:

ok, this is a bug in 1.8 as knbk said, so you need to upgrade it to new version..

like image 28
doniyor Avatar answered Sep 21 '22 23:09

doniyor