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.
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:
brunch watch
, grunt
job oder gulp
Watch-Task).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'),
)
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"),
]
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,
...
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>
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 .