我正在尝试使用Django构建一个静态站点生成器(因为它的资源丰富),而现在我的问题是处理Django命令,该命令应该将我的静态站点内容构建到目录中.显然我的'NoneType'对象没有属性'split',但我不知道'NoneType'对象是什么.
(thisSite) C:\Users\Jaysp_000\thisSite\PROJECTx>python prototype.py build Traceback (most recent call last): File "prototype.py", line 31, inexecute_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'
似乎我的问题出在我的命令文件中,我称之为build
.回溯还会调出我的views
文件,该文件可以自行运行(也就是说,我的html文件可以在本地服务器上正确提供),但无论如何我都会包含它.
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
以防万一有用知道,这是我的urls.py:
from django.conf.urls import include, url urlpatterns = [ url(r'^page/(?P[-\w]+)/$', 'sitebuilder.views.page', name='page'), url(r'^page$', 'sitebuilder.views.page', name='homepage'), ]
我发现这令人沮丧,主要是因为这个问题似乎与reverse()函数有关,正如构建模块中所见,并且我没有很长时间使用该函数,只要我记得,但我不知道是否这真的是我的问题.有人可以帮我弄清楚我的问题来自何处以及如何解决(如果你有任何提示)?非常感谢.
base_lang = get_language().split('-')[0]
这行是Django 1.8中的一个错误.它是作为1.8.1的一部分修复的:
当翻译被停用时,翻译函数check_for_language()和get_language_bidi()中的Prevented TypeError(#24569).
您应该升级到最新的1.8.x版本1.8.8.在撰写本文时.这将解决这个bug和其他问题.
次要版本仅包含错误修正和安全补丁,因此您应该始终升级到您正在使用的任何主要版本的最新次要版本.
尝试激活页面视图中的语言:
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)
这是因为上下文处理器试图获取上下文语言,它显然是无.
更新:
好吧,这是1.8中的一个bug,因为knbk说,所以你需要将它升级到新版本..