it-swarm.com.ru

Django обслуживает статический index.html с представлением по ссылке '/'

У меня есть мой index.html в/static/папке. Мое приложение Django работает нормально, когда я пытаюсь:

http://127.0.0.1:8000/index.html

Но я хочу получить доступ к index.html по URL:

http://127.0.0.1:8000/

Я написал вид, и он работает:

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

Я также добавил в urls.py (это позволяет мне использовать статические как 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
        }),

Но я думаю, что есть способ сделать то, что я хочу без TemplateView.

Какие-либо предложения? Благодарю. Моя версия Django: Django 1.5 

ПРАВКА:

Причина, по которой я поместил index.html в статический файл: я хочу сделать приложение Django совместимым с Phonegap, поэтому после правильного кодирования все, что мне нужно сделать, это -> make .Zip из статической папки и загрузить его в Phonegap как мобильный приложение. Легко и чисто.

35
Feanor

Вы можете использовать static/index.html для разработки следующим образом:

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

Но для производства вы должны настроить свой nginx (или другой сервер внешнего интерфейса) для обслуживания файла index.html для местоположения /

ОБНОВЛЕНИЕ

Я хочу объяснить, почему вы должны так поступить. Например, ваше приложение Django имеет вид только admin и api, но клиент взаимодействует с одностраничным приложением (Ember, Angular и т.д.). Таким образом, у вашего проекта есть как минимум два подпроекта, один с основным приложением Django, а второй - клиентское приложение со всеми элементами html/js/css. Очень удобно иметь клиентские скрипты отдельно от бэкэнда Django, это позволяет разработчикам внешнего интерфейса выполнять свою работу и избегать существования Django (когда-нибудь его можно перенести в отдельный репозиторий).

Таким образом, в этом случае вы получаете следующий рабочий процесс сборки:

  1. Запустите средство отслеживания исходных кодов клиентских приложений, чтобы перестроить ваши скрипты/стили/шаблоны (задание просмотра brunch watch, grunt или задание gulp)
  2. Сбор статики с Джанго для производства
  3. Убедитесь, что у вас есть исправление urlpatterns для разработки и правильный конфиг nginx для производства

Вот мой пример 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

Вам не нужно создавать подкласс TemplateView в этом случае. Вы можете использовать TemplateView непосредственно в вашей url conf, если index.html находится в каталоге шаблонов.

from Django.views.generic.base import TemplateView

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

вы можете создать каталог шаблонов, поместить туда HTML, а затем отобразить его из views.py

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

не забудьте установить templates_dir в 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

Просто оберните ваш статический HTML-файл в iframe, определенный в шаблонном HTML-файле. С некоторыми стилями настройки можно сделать iframe 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>
0
Geordie

Посмотрите мое длинное объяснение того, как обслуживать index.html в / в этот ответ (или расширено как сообщение в блоге ). Однако одного этого решения может быть недостаточно, если вы хотите, чтобы Django обслуживал полноценный SPA (потому что вам нужна маршрутизация через внешний интерфейс).

Я играл с разными методами для маршрутизации /static/ в /, переадресации всех запросов во внешний интерфейс, поиска файлов index.html. В конце концов я нашел лучший способ решить все это не путем настройки urls.py, а как расширение WhiteNoise, которое я выпустил как Django-spa (инструкции по установке в README).

Вы можете найти некоторые связанные с этим обсуждения в этом проблема WhiteNoise .

0
metakermit