2016-01-03 23 views
6

Próbuję zbudować statyczny generator witryn za pomocą Django (ponieważ jest on zaradny w ten sposób), a teraz moje problemy dotyczą polecenia Django, które jest powinien stworzyć moją statyczną zawartość strony w katalogu. Najwyraźniej mój obiekt "NoneType" nie ma atrybutu "split", ale nie wiem, co to jest obiekt "NoneType".Django: AttributeError: Obiekt "NoneType" nie ma atrybutu "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' 

Wydaje się, że mój problem leży w moim pliku polecenia, które ja nazywam build. Funkcja traceback wyświetla również mój plik views, który działa dobrze na własną rękę (to znaczy, moje pliki html mogą być poprawnie obsługiwane na serwerze lokalnym), ale mimo to dołączę je.

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 

i tylko w przypadku, gdy staje się przydatna wiedzieć, tu jest mój 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'), 
] 

Uważam, że to frustrujące, głównie dlatego, że problem ten wydaje się być związany z funkcją reverse(), jak widać w module kompilacji, i nie miałem świetnego czasu, używając tej funkcji tak długo, jak pamiętam, ale nie wiem jeśli to naprawdę mój problem. Czy ktoś może mi pomóc dowiedzieć się, skąd pochodzi mój problem i jak go rozwiązać (jeśli masz jakieś wskazówki)? Byłoby to bardzo doceniane.

+0

Czy Twoja witryna obsługuje i18n? – doniyor

Odpowiedz

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

Linia ta jest błąd w Django 1.8 . Została ona ustalona w ramach 1.8.1:

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

należy uaktualnić do najnowszej wersji 1.8.x, 1.8.8. w momencie pisania. To naprawi ten błąd i inne.

Drobne wydania zawierają tylko poprawki błędów i poprawki zabezpieczeń, więc zawsze powinieneś aktualizować do najnowszej wersji drugorzędnej dla dowolnej głównej wersji, której używasz.

+0

Dzięki za informację zwrotną! Spróbuję tego. Czy wiesz, jak powinienem to zrobić? Czy powinienem odinstalować django 1.8 i zainstalować django 1.8.8, czy mogę jakoś uaktualnić? – JellisHeRo

+3

Możesz wykonać 'pip install -U Django <1.9'. – knbk

+0

Dzięki! Zarówno ty, jak i doniyor mieliście rację w swoich rozwiązaniach. Naprawdę mi pomogli! – JellisHeRo

5

spróbuj aktywować język w widoku strony:

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) 

to dlatego procesor kontekst próbuje dostać się języka kontekstowe i to jest oczywiście brak.

aktualizacja:

ok, to jest to błąd w 1,8 jak knbk powiedział, więc trzeba uaktualnić go do nowej wersji ..

+0

Oboje mieliście rację! Twoja odpowiedź działa, zakładając, że chcę zostać w 1.8. Dzięki! – JellisHeRo

+1

@JellisHeRo dzięki, sprawdź odpowiedź Knbka jako zaakceptowaną – doniyor

Powiązane problemy