Django служит для статического index.html с представлением '/' url
У меня есть мой index.html в/static/папке. Приложение django работает нормально, когда я пытаюсь:
http://127.0.0.1:8000/index.html
Но я хочу, чтобы acces 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 в static: я хочу сделать совместимое с Phonegap приложение django, поэтому после правильного кодирования все, что мне нужно сделать, это → сделать .zip из статической папки и загрузите его в Phonegap в качестве мобильного приложения. Легко и чисто.
Ответы
Ответ 1
Вы можете служить 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
файла для /
location
UPDATE
Я хочу объяснить, как это сделать. Например, ваше приложение django - это только admin и api view, но клиент взаимодействует с одностраничным приложением (Ember, Angular, что угодно). Таким образом, у вас есть как минимум два подпроекта, один с вашим основным приложением django, а второй - клиентское приложение со всеми материалами html/js/css. Очень удобно иметь клиентские скрипты отдельно от бэкэнда django, это позволяет вашим сторонним разработчикам выполнять свою работу и избегать существования django (когда-нибудь это можно будет переместить в отчетливое репо).
Итак, в этом случае вы получаете следующий рабочий процесс сборки:
- Запустите средство просмотра источников клиентских приложений, чтобы перестроить ваши скрипты/стили/шаблоны (
brunch watch
, grunt
задание или gulp
задача просмотра)
- Соберите статическую с django для производства
- Удостоверьтесь, что у вас исправлены ошибки в настройках и правильная конфигурация 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'),
)
Ответ 2
В этом случае вам не нужен подкласс TemplateView
. Вы можете использовать TemplateView
непосредственно в URL-адресе url, если index.html
находится в вашем каталоге шаблонов.
from django.views.generic.base import TemplateView
urlpatterns = [
url(r'^$', TemplateView.as_view(template_name='index.html'), name="home"),
]
Ответ 3
Посмотрите мое длинное объяснение того, как обслуживать index.html на /
в этом ответе (или расширен как сообщение в блоге). Однако это решение может оказаться недостаточным, если вы хотите иметь полноценный SPA, обслуживаемый Django (потому что вам нужна внешняя маршрутизация).
Я играл с различными методами маршрутизации /static/
до /
, пересылая все запросы в интерфейс, находя файлы index.html. В конце концов, я нашел лучший способ решить все это не путем настройки urls.py, а как расширение WhiteNoise, которое я выпустил как django-spa (инструкции по установке в README).
Вы можете найти некоторые из связанных вопросов в этой проблеме WhiteNoise.
Ответ 4
вы можете создать каталог шаблонов, поместить 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,
...