webentwicklung-frage-antwort-db.com.de

Django servieren statische index.html mit View unter '/' url

Ich habe meine index.html im Ordner/static /. Meine Django-App läuft in Ordnung, wenn ich es versuche:

http://127.0.0.1:8000/index.html

Aber ich möchte index.html per URL zugreifen:

http://127.0.0.1:8000/

Ich habe eine Ansicht geschrieben und es funktioniert:

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

Ich habe auch zu urls.py hinzugefügt (dies erlaubt mir statisch wie 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
        }),

Aber ich denke, es gibt einen Weg, was ich ohne TemplateView tun kann.

Irgendwelche Vorschläge? Vielen Dank. Meine Django-Version ist: Django 1.5 

EDIT:

Der Grund, warum ich index.html in static gesetzt habe: Ich möchte eine Phonegap-kompatible Django-App erstellen. Nach der richtigen Kodierung muss ich nur noch -> make .Zip aus dem static -Ordner machen und als mobilen App in Phonegap hochladen App. Einfach und sauber.

35
Feanor

Sie können static/index.html für die Entwicklung wie folgt liefern:

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

Für die Produktion sollten Sie jedoch nginx (oder einen anderen Frontend-Server) so konfigurieren, dass index.html-Datei für /-Speicherort bereitgestellt wird

UPDATE

Ich möchte den Fall erklären, den Sie so machen sollten. Zum Beispiel ist Ihre Django-App nur Admin- und API-Ansicht, der Client interagiert jedoch mit einer einzelnen Seiten-App (Ember, Angular, was auch immer). Ihr Projekt hat also mindestens zwei Unterprojekte, eines mit Ihrer Haupt-Django-App und das zweite ist eine Client-App mit sämtlichen HTML-/Js/CSS-Dateien. Es ist sehr praktisch, Client-Skripte vom Django-Backend zu trennen. Dies ermöglicht Ihren Frontend-Entwicklern, ihre Arbeit zu erledigen und die Existenz von Django zu vermeiden (eines Tages kann es in ein anderes Repo verschoben werden).

In diesem Fall erhalten Sie den folgenden Build-Workflow:

  1. Führen Sie den Watcher für Client-App-Quellen aus, um Ihre Skripts/Stile/Vorlagen neu zu erstellen (brunch watch, grunt job oder gulp Watch-Task).
  2. Sammle Static mit Django für die Produktion
  3. Stellen Sie sicher, dass Sie urlpatterns-Updates für die Entwicklung und die richtige Nginx-Konfiguration für die Produktion haben

Hier ist mein urls.py Beispiel

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

Sie müssen in diesem Fall keine TemplateView-Klasse definieren. Sie können TemplateView direkt in Ihrem URL-Conf verwenden, solange sich index.html in Ihrem Vorlagenverzeichnis befindet.

from Django.views.generic.base import TemplateView

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

sie können ein Templates-Verzeichnis erstellen, das HTML dort ablegen und es dann aus views.py rendern

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

vergessen Sie nicht, das templates_dir in der settings.py einzustellen

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,
    ...
0

Wickeln Sie einfach Ihre statische HTML-Datei in einen Iframe, der in einer HTML-Datei mit Vorlagen definiert ist. Mit einigen Style-Tweaks lässt sich der iframe auf 100% Breite und Höhe einstellen.

{% load static %}
<html>
    <head>
        <title>Templated HTML</title>

        <style>
            html, body {
                width: 100%;
                width: 100%;
                margin: 0;
                padding: 0;
                border-width: 0;
            }

            iframe {
                position: absolute;
                top: 0;
                left: 0;
                width: 100vw;
                height: 100vh;
                margin: 0;
                padding: 0;
                border-width: 0;
            }
        </style>
    </head>
    <body>
        {{ content }}
        <iframe src="{% static 'main/html/test.html' %}"></iframe>
    </body>
</html>
0
Geordie

Lesen Sie meine ausführliche Erklärung, wie Sie index.html mit / in dieser Antwort (oder als blog post erweitert) dienen. Diese Lösung allein reicht jedoch möglicherweise nicht aus, wenn Sie ein vollwertiges SPA von Django bedienen möchten (weil Sie ein Frontend-Routing benötigen).

Ich habe mit verschiedenen Methoden zum Weiterleiten von /static/ an / gespielt, alle Anforderungen an das Frontend weitergeleitet und index.html -Dateien gesucht. Am Ende fand ich die beste Methode, um all dies zu lösen, nicht durch das Optimieren von urls.py, sondern als Erweiterung von WhiteNoise, die ich als Django-spa (Installationsanweisungen in der README) veröffentlicht habe.

Einige der entsprechenden Diskussionen finden Sie in dieser WhiteNoise-Ausgabe .

0
metakermit