2016-01-03 3 views
6

J'essaye de construire un générateur de site statique en utilisant Django (parce que c'est une ressource de ce genre), et maintenant mes problèmes concernent la commande Django qui est supposé construire mon contenu de site statique dans un répertoire. Apparemment, mon objet 'NoneType' n'a pas d'attribut 'split', mais je ne sais pas ce qu'est cet objet 'NoneType'.Django: AttributeError: l'objet 'NoneType' n'a pas d'attribut 'split'

(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' 

Il semble que mon problème réside dans mon dossier de commande, que j'appelle build. La traceback fait également apparaître mon fichier views, qui fonctionne bien seul (c'est-à-dire que mes fichiers html peuvent être correctement servis sur le serveur local), mais je vais l'inclure de toute façon.

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 

et juste au cas où il devient utile de savoir, voici mon 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'), 
] 

Je trouve cela frustrant, principalement parce que ce problème semble être lié à la fonction reverse(), comme vu dans le module de construction, et je n'ai pas eu beaucoup de plaisir à utiliser cette fonction aussi longtemps que je me souvienne, mais je ne sais pas si c'est vraiment mon problème. Quelqu'un peut-il m'aider à comprendre d'où vient mon problème et comment le résoudre (si vous avez des conseils)? Cela serait très appréciable.

+0

votre site supporte-t-il i18n? – doniyor

Répondre

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

Cette ligne est un bogue dans Django 1.8 . Il a été fixé dans le cadre de 1.8.1:

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

Vous devez mettre à jour vers la dernière version 1.8.x, 1.8.8. au moment de l'écriture. Cela va corriger ce bug et d'autres.

Les versions mineures ne contiennent que des corrections de bogues et des correctifs de sécurité, vous devriez donc toujours passer à la dernière version mineure pour la version majeure que vous utilisez.

+0

Merci pour les commentaires! Je vais essayer ça. Sais-tu comment je devrais faire ça? Devrais-je pip désinstaller django 1.8 et installer django 1.8.8 ou puis-je mettre à jour en quelque sorte? – JellisHeRo

+3

Vous pouvez faire 'pip installer -U Django <1.9'. – knbk

+0

Merci! Vous et Doniyor avez tous deux raison dans vos solutions. Ils m'ont vraiment aidé! – JellisHeRo

5

essayez d'activer une langue dans votre page vue:

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) 

c'est parce que le processeur de contexte tente d'obtenir la langue de contexte et il est évidemment Aucun.

mise à jour:

ok, ce bogue dans 1,8 comme KNBK dit, vous devez le mettre à jour vers la nouvelle version ..

+0

Vous étiez tous les deux corrects! Votre réponse fonctionne en supposant que je voulais rester en 1.8. Merci! – JellisHeRo

+1

@JellisHeRo merci, s'il vous plaît vérifier la réponse de knbk comme accepté – doniyor