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.

32
demandé sur Feanor 2013-08-01 12:51:56

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:

  1. exécutez client app sources watcher pour reconstruire vos scripts / styles / modèles (brunch watch, grunt travail ou gulp tâche de surveillance)
  2. collecte statique avec django pour la production de
  3. 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'),
)
43
répondu Anton Egorov 2014-04-17 13:51:07

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"),
]
36
répondu Alasdair 2016-03-09 11:22:48

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 .

0
répondu metakermit 2017-05-23 12:18:02

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,
    ...
0
répondu Michael Obichkin 2017-09-22 11:45:51

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>
0
répondu Geordie 2018-04-13 23:33:18