Django: как вы обслуживаете медиа / таблицы стилей и ссылаетесь на них в шаблонах
Были заданы варианты этого вопроса, но я все еще не могу правильно загрузить таблицы стилей при визуализации моих шаблонов.
Я пытаюсь обслуживать статический носитель из процесса Django во время разработки, что, как мне известно, настоятельно не рекомендуется в производстве. Я опубликую свою конфигурацию и мой шаблон, и, надеюсь, кто-то может помочь мне понять, где я иду не так.
Обратите внимание, что я попытался следовать примеру на веб-сайте проекта Django, однако там не упоминается, как ссылаться на ваши таблицы стилей из шаблона. Я также попробовал много разных вариантов одной и той же вещи, так что мой код / настройки могут немного отличаться от описанного.
settings.py
MEDIA_ROOT = 'D:/Dev Tools/django_projects/dso/media'
MEDIA_URL = '/media/'
ADMIN_MEDIA_PREFIX = '/media/'
urls.py
from django.conf.urls.defaults import *
from django.conf import settings
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
(r'^admin/(.*)', admin.site.root),
(r'^ovramt/$', 'dso.ovramt.views.index'),
)
if settings.DEBUG:
urlpatterns += patterns('',
(r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}),
)
В моем шаблоне:
<head>
<title> {% block title %} DSO Template {% endblock %} </title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" >
<link rel="stylesheet" type="text/css" href="../media/styles.css">
</head>
Уверяю вас, файлы (templates / media) находятся в правильном каталоге в моей файловой системе. Если есть какая-то дополнительная информация, которую я должен предоставить, пожалуйста, оставьте комментарий.
Редактировать:
Одной из проблем, с которыми я столкнулся, было использование "/" для добавления моих ссылок. Если перед ним стоит косая черта, ссылка открывается из корня сайта. Если косой черты нет, ссылка открывается на текущем уровне. Пример:
www.example.com/application/ содержит ссылку "/ app2/" и ссылку "app3 /".
app2 откроется на www.example.com/app2/, а app3 откроется на www.example.com/application/app3/. Это сбило меня с толку, я думаю.
7 ответов
Я просто должен был понять это сам.
settings.py:
MEDIA_ROOT = 'C:/Server/Projects/project_name/static/'
MEDIA_URL = '/static/'
ADMIN_MEDIA_PREFIX = '/media/'
urls.py:
from django.conf import settings
...
if settings.DEBUG:
urlpatterns += patterns('',
(r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}),
)
файл шаблона:
<link rel="stylesheet" type="text/css" href="/static/css/style.css" />
С файлом, расположенным здесь:
"C:/Server/Projects/project_name/static/css/style.css"
У Django уже есть контекстный процесс для MEDIA_URL, см . Документацию Django.
Он должен быть доступен по умолчанию (если вы не настроили CONTEXT_PROCESSORS и не забыли добавить его) в RequestContext.
Я обычно делаю свой собственный простой шаблонный тег, потому что Django не предоставляет файлы CSS/JavaScript. Apache делает это так, что мой медиа-адрес обычно http://static.mysite.com/.
YourApp / templatetags / media_url.py:
from django.template import Library
from yourapp.settings import MEDIA_URL
register = Library()
@register.simple_tag
def media_url():
return MEDIA_URL
И в моем файле шаблона:
{% load media_url %}
<link href="{{ media_url }}css/main.css" rel="stylesheet" type="text/css">
Вы также можете создать свой собственный контекстный препроцессор для добавления переменной media_url в каждый шаблон.
Я просто использую абсолютное наименование. Если вы не ведете сайт по глубокому пути (или даже если вы это делаете), я бы бросил ..
и пойти на что-то вроде:
<link rel="stylesheet" type="text/css" href="/media/styles.css">
Просто подумал, что я быстро включился. Хотя все предложения здесь работают отлично, и я использую пример Тая при разработке, как только вы попадете в производство, вы можете захотеть обслуживать файлы с помощью простого Apache или любого другого сервера, который вы используете.
Что я делаю, так это настраиваю поддомен после завершения разработки и заменяю все ссылки на статические носители. Например:
<link rel="stylesheet" type="text/css" href="http://static.mydomain.com/css/style.css" />
Причин для этого двоякие. Во-первых, кажется, что Django будет обрабатывать эти запросы медленнее, когда в этом нет необходимости. Во-вторых, поскольку большинство браузеров могут загружать файлы одновременно из 3 разных доменов, использование второго субдомена для статических файлов на самом деле увеличит скорость загрузки ваших пользователей.
У меня есть пара идей, я не знаю, какая из них работает для меня:)
Убедитесь, что вы используете конечную косую черту, и это должно отличаться от параметра MEDIA_URL (поскольку один и тот же URL не может быть сопоставлен с двумя разными наборами файлов).
Это от http://docs.djangoproject.com/en/dev/ref/settings/
Во-вторых, возможно, вы путаете каталоги в вашей файловой системе с путями URL. Попробуйте использовать абсолютные URL-адреса, а затем уточните их.
Еще одна вещь, которую нужно добавить: если у вас есть отдельный медиасервер в поддомене / другом домене, вы можете отключить куки для вашего статического носителя. Экономит немного обработки и пропускной способности.