2013-08-01 18 views
27

Mam mój index.html w/statycznym/folderze. Moja aplikacja jest uruchomiona Django ok gdy próbuję:Django służyć static index.html z widokiem na "/" url

http://127.0.0.1:8000/index.html 

ale chcę acces index.html przez URL:

http://127.0.0.1:8000/ 

Napisałem widok i to działa:

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

Dodałem także do urls.py (to pozwala mi wyświetlać statyczne, takie jak 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 
     }), 

Ale myślę, że jest sposób, aby zrobić to, co chcę bez TemplateView.

Wszelkie sugestie? Dzięki. Moja wersja django jest: Django 1.5

EDIT:

Powód umieściłem index.html na statyczne: chcę, aby kompatybilny PhoneGap django app, więc po odpowiednim kodowaniu, wszystko co mam robić jest ->zrobić .zip z folderu statycznego i przesłać go do Phonegap jako aplikację mobilną. Łatwy i czysty.

+0

Dlaczego nie chcesz TemplateView? Jest tam z tego powodu. –

+0

Po prostu pomyślałem, że istnieje sposób, by służyć bez widoku. – Feanor

+3

Następnie użyj [aplikacji na płaskim ekranie] (https://docs.djangoproject.com/en/dev/ref/contrib/flatpages/). –

Odpowiedz

37

Można służyć static/index.html dla rozwoju tak:

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

Ale dla produkcji należy skonfigurować nginx (lub inny serwer frontend) służyć index.html plik dla / lokalizacji

UPDATE

Chcę wyjaśnić sprawę, którą powinieneś zrobić w ten sposób. Na przykład Twoja aplikacja Django to tylko widok administratora i interfejsu API, ale klient wchodzi w interakcję z pojedynczą aplikacją strony (Ember, Angular, cokolwiek). W związku z tym masz co najmniej dwa podprojekty, jeden z główną aplikacją django, a drugi to aplikacja kliencka z wszystkimi materiałami html/js/css. Bardzo wygodnie jest mieć skrypty klienta oddzielone od backendu django, pozwala to programistom frontendowym wykonywać swoją pracę i unikać istnienia django (pewnego dnia może zostać przeniesiony do odrębnego repozytorium).

Więc w tym przypadku można uzyskać następujące gromadzeniu obieg:

  1. źródła aplikacji klient Run Watcher odbudować swoje skrypty/Style/szablony (brunch watch, grunt pracy lub gulp zegarek zadania)
  2. Zbierz statyczne Django do produkcji
  3. Sprawdź, czy masz urlpatterns fix dla rozwoju i prawej nginx config do produkcji

Oto moja urls.py przykład

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

Dzięki za to. Jak radzisz sobie z interfejsem API historii HTML5 i obsługą z folderu src? Buduję aplikacje Angular, aby były dostarczane z src podczas dev. Poprawiłem wzorce, aby plik index.html został przechwycony przez wzorzec wszystkich wzorców adresów URL i umieszczony przed wzorcem dla zasobów. Wydaje się działać. Ale chciałbym obsługiwać js/css/img z templates/src. Próbowałem zmienić dokument. root, ale to nie działa (nie można wkleić kodu w odpowiedziach) – Howie

+0

@Howie to projekt open source? Czy możesz pokazać mi, co masz? –

+0

Witam @Anton. Przepraszam za późną odpowiedź. Stworzyłem płytę podstawową na Github, aby użyć powyższego zalecenia. Być może mógłbyś podać podpowiedź? SPA działa poza Django, ale nie jest obsługiwane przez Django https://github.com/howieweiner/django-angular-boilerplate. Thnx – Howie

32

W tym przypadku nie ma potrzeby stosowania podklasy TemplateView. Możesz użyć TemplateView bezpośrednio w twoim adresie URL, o ile index.html jest w twoim katalogu szablonów.

from django.views.generic.base import TemplateView 

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

hmm. brzmi już lepiej – Feanor

+0

Więc nie ma sposobu na wyświetlanie statycznego pliku HTML bez przekazywania go przez renderer szablonu? –

+3

Pomocnik ['views.serve'] (https://docs.djangoproject.com/en/1.6/ref/contrib/staticfiles/#django.contrib.staticfiles.views.serve) jest przeznaczony wyłącznie do programowania. Nie należy używać Django do serwowania plików statycznych podczas produkcji. Użyj swojego serwera internetowego, np. Apache lub Nginx do obsługi plików statycznych. – Alasdair

0

Sprawdź moje długie wyjaśnienie, jak służyć index.html na / w this answer (lub przekształcone jako blog post). To rozwiązanie może jednak nie wystarczyć, jeśli chcesz mieć pełnowartościowe SPA obsługiwane przez Django (ponieważ potrzebujesz routingu frontendowego).

Grałem z różnych metod routingu /static/ do /, przekazując wszystkie żądania do frontend, znalezienie index.html plików. W końcu znalazłem najlepszą metodę rozwiązania tego wszystkiego nie przez ulepszenie urls.py, ale jako rozszerzenie WhiteNoise, które wypuściłem jako django-spa (instrukcje instalacji w README).

Możesz znaleźć niektóre powiązane dyskusje w tym WhiteNoise issue.

0

można utworzyć katalogu szablonów, umieścić tam html, a następnie uczynić go od views.py

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

nie zapomnij ustawić templates_dir w 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, 
    ...