2016-01-03 28 views
6

Ich versuche, einen statischen Site-Generator mit Django zu erstellen (weil es auf diese Weise findig ist), und jetzt haben meine Probleme mit dem Django-Befehl zu tun soll meinen statischen Site-Inhalt in ein Verzeichnis einbauen. Anscheinend hat mein Objekt 'NoneType' kein Attribut 'split', aber ich weiß nicht, was das Objekt 'NoneType' ist.Django: AttributeError: 'NoneType' -Objekt hat kein 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' 

Es scheint, dass mein Problem in meinem Befehl Datei liegt, die ich build nennen. Das Traceback bringt auch meine views Datei, die gut für sich selbst funktioniert (das heißt, meine HTML-Dateien können ordnungsgemäß auf dem lokalen Server bedient werden), aber ich werde es trotzdem hinzufügen.

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 

und für alle Fälle wird es sinnvoll, hier zu wissen, ist mein 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'), 
] 

Ich finde das frustrierend, vor allem, weil dieses Problem mit der reverse() - Funktion verbunden zu sein scheint, wie im Build-Modul gesehen, und ich hatte keine großartige Zeit mit dieser Funktion, solange ich mich erinnern kann, aber ich weiß es nicht Wenn das wirklich mein Problem ist. Kann mir jemand helfen herauszufinden, woher mein Problem kommt und wie ich es lösen kann (wenn Sie irgendwelche Tipps haben)? Es wäre sehr geschätzt.

+0

unterstützt Ihre Website i18n? – doniyor

Antwort

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

Diese Linie um einen Fehler in Django 1.8 . Es wurde im Rahmen des 1.8.1 fixed:

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

Sie auf die neueste Version aktualisieren 1.8.x sollten 1.8.8. zum Zeitpunkt des Schreibens. Das wird diesen Fehler und andere beheben.

Minor-Versionen enthalten nur Bugfixes und Sicherheitspatches. Daher sollten Sie immer auf die neueste Minor-Version für die von Ihnen verwendete Hauptversion aktualisieren.

+0

Danke für die Rückmeldung! Ich werde das versuchen. Weißt du wie ich das machen soll? Soll ich django 1.8 deinstallieren und django 1.8.8 installieren oder kann ich irgendwie upgraden? – JellisHeRo

+3

Sie können 'pip install -U Django <1.9' installieren. – knbk

+0

Danke! Sowohl du als auch doniyor hatten Recht in deinen Lösungen. Sie haben mir wirklich geholfen! – JellisHeRo

5

versuchen, eine Sprache in Ihrer Seite Ansicht zu aktivieren:

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) 

es ist, weil Kontext Prozessor versucht, den Kontext Sprache zu bekommen und es ist offensichtlich keine.

Update:

ok, das ist ein Fehler in 1.8 als knbk sagte, so dass Sie es auf eine neue Version aktualisieren müssen ..

+0

Beide von euch waren richtig! Ihre Antwort funktioniert, vorausgesetzt, ich wollte in 1.8 bleiben. Vielen Dank! – JellisHeRo

+1

@JellisHeRo danke, bitte überprüfen knbks Antwort als akzeptiert – doniyor