Django sert l'index statique.html avec vue à l'url'/'
J'ai mon index.html dans /static/ dossier. Mon application django fonctionne bien quand j'essaie:
http://127.0.0.1:8000/index.html
Mais je veux accéder à l'index.html par url:
http://127.0.0.1:8000/
J'ai écrit une vue et ça marche:
class IndexView(TemplateView):
template_name = 'index.html'
J'ai également ajouté à urls.py (cela me permet de servir statique comme 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
}),
Mais je pense qu'il y a un moyen de faire ce que je veux sans TemplateView.
Des suggestions? Grâce. Ma version django est: Django 1.5
Modifier :
La raison pour laquelle je placé à l'index.html en statique: je veux rendre l'application django compatible Phonegap, donc après un codage approprié, tout ce que j'ai à faire est --> make .zip à partir du dossier statique et téléchargez-le sur Phonegap en tant qu'application mobile. Facile et propre.
5 réponses
, Vous pouvez servir static/index.html
pour le développement comme ceci:
if settings.DEBUG:
urlpatterns += url(
r'^$', 'django.contrib.staticfiles.views.serve', kwargs={
'path': 'index.html', 'document_root': settings.STATIC_ROOT}),
, Mais pour la production, vous devez configurer votre nginx
(ou autre interface serveur) pour servir de index.html
fichier /
emplacement
Mise à JOUR
Je veux expliquer le cas que vous devriez faire comme ça. Par exemple, votre application django n'est qu'une vue admin et api, mais le client interagit avec une seule application de page (Ember, Angular, whatever). Donc, votre projet a au moins deux sous-projets, un avec votre application django principale et la seconde est une application client avec tous les trucs html/js/css. Il est très pratique d'avoir des scripts clients séparés du backend django, cela permet à vos développeurs frontend de faire leur travail et d'éviter l'existence de django (un jour, il peut être déplacé vers le repo distinct).
Donc, dans ce cas, vous obtenez le flux de travail de construction suivant:
- exécutez client app sources watcher pour reconstruire vos scripts / styles / modèles (
brunch watch
,grunt
travail ougulp
tâche de surveillance) - collecte statique avec django pour la production de
- assurez-vous d'avoir le correctif urlpatterns pour les développements et la bonne configuration nginx pour la production
Voici mon exemple 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'),
)
Vous n'avez pas besoin de sous-classe TemplateView
dans ce cas. Vous pouvez utiliser TemplateView
directement dans votre url conf, tant que index.html
se trouve dans votre répertoire templates.
from django.views.generic.base import TemplateView
urlpatterns = [
url(r'^$', TemplateView.as_view(template_name='index.html'), name="home"),
]
Consultez ma longue explication de la façon de servir index.html sur /
dans cette réponse (ou étendu comme un blog). Cette solution seule pourrait ne pas être suffisante, cependant, si vous voulez avoir un SPA à part entière servi par Django (parce que vous avez besoin de routage frontend).
J'ai joué avec différentes méthodes pour router /static/
vers /
, transférer toutes les requêtes vers le frontend, trouver index.fichiers html . En fin de compte j'ai trouvé la meilleure méthode pour résoudre tout cela n'a pas été en peaufinant urls.py , mais comme une extension de WhiteNoise que j'ai publié comme django-spa (instructions d'installation dans le README).
Vous pouvez trouver une partie de la discussion connexe dans ce numéro WhiteNoise .
Vous pouvez créer le répertoire templates, y placer le code html, puis le rendre à partir de views.py
def index(request):
return render(request, 'my_app/index.html', context={})
N'oubliez pas de définir le répertoire templates_dir dans le 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,
...
Il suffit d'envelopper votre fichier HTML statique dans un iframe défini dans un fichier HTML modélisé. Avec quelques réglages de style peuvent rendre l'iframe 100% largeur et hauteur.
{% 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>