variable template tag registered one not must library ifequal files examples bootstrap django django-views django-staticfiles

template - Django sirve static index.html con vista en ''/'' url



ifequal django (5)

Mira mi larga explicación de cómo servir index.html en / en esta respuesta (o extendida como una publicación de blog ). Sin embargo, esa solución por sí sola podría no ser suficiente si desea tener un SPA de pleno derecho atendido por Django (porque necesita el enrutamiento frontend).

He estado jugando con diferentes métodos para enrutar /static/ to / , reenviando todas las solicitudes a la interfaz, encontrando archivos index.html . Al final encontré que el mejor método para resolver todo esto no era ajustar urls.py , sino como una extensión de WhiteNoise que lancé como django-spa (instrucciones de instalación en el README).

Puede encontrar algo de la discusión relacionada en este problema de WhiteNoise .

Tengo mi index.html en / static / folder. Mi aplicación django está funcionando bien cuando intento:

http://127.0.0.1:8000/index.html

Pero quiero acceder a index.html por url:

http://127.0.0.1:8000/

Escribí una vista y funciona:

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

También agregué urls.py (esto me permite servir como static 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 }),

Pero creo que hay una manera de hacer lo que quiero sin TemplateView.

¿Alguna sugerencia? Gracias. Mi versión de django es: Django 1.5

EDITAR :

La razón por la que puse index.html en static: quiero hacer que la aplicación django sea compatible con Phonegap, así que después de una codificación adecuada, todo lo que tengo que hacer es -> hacer .zip desde la carpeta estática y subirlo a Phonegap como aplicación móvil. Fácil y limpio


No es necesario crear una subclase de TemplateView en este caso. Puede usar TemplateView directamente en su conf url, siempre y cuando index.html esté en su directorio de plantillas.

from django.views.generic.base import TemplateView urlpatterns = [ url(r''^$'', TemplateView.as_view(template_name=''index.html''), name="home"), ]


Puede servir static/index.html para un desarrollo como este:

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

Pero para la producción debe configurar su nginx (u otro servidor frontend) para servir el archivo index.html para / location

ACTUALIZAR

Quiero explicarle el caso en que debería hacer esto. Por ejemplo, su aplicación django es solo admin y api view, pero el cliente interactúa con una aplicación de una sola página (Ember, Angular, lo que sea). Por lo tanto, el proyecto tiene al menos dos subproyectos, uno con su aplicación django principal y el segundo es una aplicación cliente con todo lo relacionado con html / js / css. Es muy conveniente tener scripts de cliente separados del backend de django, esto permite a los desarrolladores de frontend hacer su trabajo y evitar la existencia de django (algún día se puede mover al repositorio distinto).

Entonces, en este caso, obtienes el siguiente flujo de trabajo de compilación:

  1. Ejecute el asistente de fuentes de la aplicación cliente para reconstruir sus scripts / estilos / plantillas ( brunch watch , grunt job o gulp watch task)
  2. Recoge estática con django para producción
  3. Asegúrate de que tienes los patrones Urlpatterns para los desarrollos y las configuraciones correctas de nginx para producción

Aquí está mi ejemplo de 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''), )


Simplemente envuelva su archivo HTML estático en un iframe definido en un archivo HTML con plantilla. Con algunos ajustes de estilo, el iframe puede tener un ancho y una altura del 100%.

{% 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>


puedes crear un directorio de plantillas, poner el html allí y luego renderizarlo desde views.py

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

no te olvides de configurar el dir_parálas en 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, ...