web-dev-qa-db-fra.com

Django sert static index.html avec vue sur "/" url

J'ai mon index.html dans/static/folder. Mon application Django fonctionne correctement lorsque j'essaie:

http://127.0.0.1:8000/index.html

Mais je veux accéder à 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 aussi 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.

Aucune suggestion? Merci. Ma version de Django est: Django 1.5  

MODIFIER:

La raison pour laquelle j'ai placé index.html en statique: je veux rendre l'application Django compatible avec Phonegap, donc après un codage approprié, tout ce que je dois faire est de -> créer un fichier .zip statique et le télécharger sur Phonegap en tant que mobile app. Facile et propre.

35
Feanor

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 un autre serveur frontal) pour servir le fichier index.html à l'emplacement /

METTRE &AGRAVE; JOUR

Je veux expliquer le cas, vous devriez faire comme ça. Par exemple, votre application Django est uniquement une vue administrateur et api, mais le client interagit avec une application à une seule page (Ember, Angular, peu importe). Donc, votre projet a au moins deux sous-projets, un avec votre application Django principale et le second est une application client contenant tous les éléments html/js/css. Il est très pratique de séparer les scripts clients du serveur Django, cela permet à vos développeurs frontaux de faire leur travail et d'éviter l'existence de Django (un jour, il peut être déplacé vers le référentiel distinct).

Donc, dans ce cas, vous obtenez le workflow de construction suivant:

  1. Exécutez l'observateur de sources d'applications client pour reconstruire vos scripts/styles/modèles (tâche brunch watch, grunt ou gulp)
  2. Recueillir de l'électricité statique avec Django pour la production
  3. Assurez-vous que urlpatterns corrige les développements et que nginx config est adapté à 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'),
)
45
Anton Egorov

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 est dans votre répertoire de modèles.

from Django.views.generic.base import TemplateView

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

vous pouvez créer un répertoire de modèles, y placer le code HTML, puis le restituer depuis views.py

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

n'oubliez pas de définir templates_dir dans le fichier 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
Michael Obichkin

Enveloppez simplement votre fichier HTML statique dans une iframe définie dans un fichier HTML basé sur des modèles. Avec certains ajustements de style, l’iframe peut faire 100% de largeur et de 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
Geordie

Découvrez ma longue explication sur la façon de servir index.html sur / dans this answer (ou étendu sous la forme d'un blog post ). Cette solution à elle seule peut ne pas être suffisante, cependant, si vous souhaitez avoir un SPA à part entière desservi par Django (car vous avez besoin d'un routage frontal).

J'ai joué avec différentes méthodes d'acheminement de /static/ à /, en transférant toutes les demandes au serveur frontal, en recherchant les fichiers index.html. Finalement, j'ai trouvé que la meilleure méthode pour résoudre tout cela ne consistait pas à peaufiner urls.py, mais plutôt à WhiteNoise que je publiais sous le nom Django-spa (instructions d'installation dans le README).

Vous pouvez trouver une partie de la discussion dans cette question WhiteNoise .

0
metakermit