2013-08-01 4 views
27

У меня есть мой index.html в/static/folder. Мой Джанго приложение работает нормально, когда я пытаюсь:Django служит статический index.html с представлением '/' url

http://127.0.0.1:8000/index.html 

Но я хочу Acces index.html по URL:

http://127.0.0.1:8000/ 

я написал вид, и она работает:

class IndexView(TemplateView): 
    template_name = 'index.html' 

Я также добавил к urls.py (это позволяет мне статично, как http://127.0.0.1:8000/css/style.css):

url(r'^(?P<path>.*)$', 'django.contrib.staticfiles.views.serve', { 
      'document_root': settings.STATIC_ROOT, 'show_indexes':True 
     }), 

Но я думаю, что есть способ сделать то, что я хочу, без TemplateView.

Любые предложения? Благодарю. Моя Джанго версия: Джанго 1,5

EDIT:

Причины я помещен index.html на статический: я хочу сделать PhoneGap совместимого Джанго приложения, поэтому после надлежащего кодирования, все, что я должен сделать is ->сделать .zip из статической папки и загрузить ее в Phonegap в качестве мобильного приложения. Легко и чисто.

+0

Почему не вам нужен TemplateView? Именно по этой причине. –

+0

Я просто подумал, что есть способ служить без взгляда. – Feanor

+3

Используйте приложение [flatpage] (https://docs.djangoproject.com/en/dev/ref/contrib/flatpages/). –

ответ

37

Вы можете служить static/index.html для развития, как это:

if settings.DEBUG: 
    urlpatterns += url(
     r'^$', 'django.contrib.staticfiles.views.serve', kwargs={ 
      'path': 'index.html', 'document_root': settings.STATIC_ROOT}), 

Но для производства вы должны настроить nginx (или другой сервер во внешнем интерфейсе), чтобы служить index.html файл для / расположения

UPDATE

Я хочу объяснить, как это сделать. Например, ваше приложение django - это только admin и api view, но клиент взаимодействует с одностраничным приложением (Ember, Angular, whatever). Таким образом, у вас есть как минимум два подпроекта, один с вашим основным приложением django, а второй - клиентское приложение со всеми материалами html/js/css. Очень удобно иметь клиентские скрипты отдельно от бэкэнда django, это позволяет вашим сторонним разработчикам выполнять свою работу и избегать существования django (когда-нибудь его можно перенести на отчетливое репо).

Так что в этом случае вы получите следующий рабочий процесс сборки:

  1. источников приложения Run клиент Watcher, чтобы восстановить ваши скрипты/стили/шаблоны (brunch watch, grunt работы или gulp часов задачи)
  2. Сбор статичными с Джанго для производства
  3. Убедитесь, что вы urlpatterns исправить развитие событий и правой Nginx конфигурации для производства

Вот мой пример urls.py

urlpatterns += patterns(
    'django.contrib.staticfiles.views', 
    url(r'^(?:index.html)?$', 'serve', kwargs={'path': 'index.html'}), 
    url(r'^(?P<path>(?:js|css|img)/.*)$', 'serve'), 
) 
+0

Спасибо за это. Как вы работаете с API истории HTML5 и службой из папки src? Я создаю свои Угловые приложения, чтобы они служили от src во время dev. Я изменил шаблоны так, чтобы index.html был пойман путем уловления всего шаблона URL и поместил его перед шаблоном для активов. Кажется, работает. Но я хотел бы служить js/css/img из templates/src. Попытался изменить документ. root, но он не работает (не может вставить код в ответы argh) – Howie

+0

@ Хоуи это проект с открытым исходным кодом? Не могли бы вы показать мне, что у вас есть? –

+0

Привет @ Антон. Простите за поздний ответ. Я создал шаблон на Github, чтобы использовать ваши рекомендации выше. Возможно, вы могли бы дать подсказку? SPA работает за пределами Django, но не поддерживается через Django https://github.com/howieweiner/django-angular-boilerplate. Thnx – Howie

32

В этом случае не требуется подкласс TemplateView. Вы можете использовать TemplateView прямо в вашем url conf, пока index.html в вашем каталоге шаблонов.

from django.views.generic.base import TemplateView 

urlpatterns = [ 
    url(r'^$', TemplateView.as_view(template_name='index.html'), name="home"), 
] 
+0

hmm. звучит уже лучше – Feanor

+0

Таким образом, нет возможности обслуживать статический HTML-файл, не передавая его через средство визуализации шаблонов? –

+3

Хелпер ['views.serve'] (https://docs.djangoproject.com/en/1.6/ref/contrib/staticfiles/#django.contrib.staticfiles.views.serve) предназначен только для разработки. Вы не должны использовать Django для обслуживания статических файлов в процессе производства. Используйте веб-сервер, например. Apache или Nginx для обслуживания статических файлов. – Alasdair

0

Проверить мое длинное объяснение того, как служить index.html на / в this answer (или продлены как blog post). Однако этого решения может быть недостаточно, если вы хотите иметь полноценный SPA, обслуживаемый Django (потому что вам нужна внешняя маршрутизация).

Я играл с различными методами маршрутизации /static/ к /, переадресация всех запросов на внешний интерфейс, находя index.html файлы. В конце концов я нашел лучший способ решить все это не путем настройки urls.py, а как расширение WhiteNoise, которое я выпустил как django-spa (инструкции по установке в README).

Вы можете найти некоторые из связанных дискуссий в этом WhiteNoise issue.

0

вы можете создать каталог шаблонов, поставить HTML там, а затем вынести его из views.py

def index(request): 
     return render(request, 'my_app/index.html', context={}) 

не забудьте установить templates_dir в settings.py

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 
TEMPLATES_DIR = os.path.join(BASE_DIR, "templates") 

TEMPLATES = [ 
{ 
    'BACKEND': 'django.template.backends.django.DjangoTemplates', 
    'DIRS': [TEMPLATES_DIR,], 
    'APP_DIRS': True, 
    ... 
Смежные вопросы