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>

Уверяю вас, файлы (шаблоны / медиа) находятся в правильном каталоге в моей файловой системе. Если мне нужно предоставить дополнительную информацию, оставьте комментарий.


Редактировать:

Одна из моих проблем заключалась в использовании символа '/' перед моими ссылками. Если перед ним стоит косая черта, ссылка открывается из корня сайта. Если косая черта отсутствует, ссылка открывается на текущем уровне. Пример:

www.example.com/application/ содержит ссылку "/ app2 /" и ссылку "app3 /".
app2 откроется по адресу www.example.com/app2/, а app3 откроется по адресу www.example.com/application/app3/. Думаю, это меня сбивало с толку.

Один вопрос; Вы пробовали загрузить http: // <your-server-probably-localhost> /media/styles.css прямо из браузера?

muhuk 15.01.2009 11:49

Я единственный, кто считает глупым то, что вам нужно перепрыгивать через все эти обручи для тестирования / предварительного просмотра CSS и изображений во время разработки с Django? Конечно, вы не хотите делать это в продакшене и использовать настоящий веб-сервер, но для разработки вам нужно видеть стили / изображения, чтобы иметь хороший предварительный просмотр.

Wayne Molina 20.01.2009 18:02

Обручей, через которые нужно было прыгнуть, действительно было не так много. Я просто споткнулся там, где, наверное, не должен был.

Josh Smeaton 21.01.2009 09:55

вы сказали: «Если перед ним стоит косая черта, ссылка открывается с уровня ниже». но на самом деле косая черта загружает его с самого верхнего уровня. Итак, с site.com/a/b/c, если есть ссылка на / d, она перейдет на site.com/d.

fastmultiplication 21.03.2010 07:46
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
44
4
47 223
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

У меня есть пара идей, я не знаю, какая из них мне подходит :)

Make sure to use a trailing slash, and to have this be different from the MEDIA_URL setting (since the same URL cannot be mapped onto two different sets of files).

Это от http://docs.djangoproject.com/en/dev/ref/settings/#admin-media-prefix

Во-вторых, возможно, вы путаете каталоги в своей файловой системе с URL-адресами. Попробуйте использовать абсолютные URL-адреса, а затем уточнить их.

Я просто использую абсолютное именование. Если вы не запускаете сайт по глубокому пути (или даже если это так), я бы бросил .. и выбрал что-то вроде:

<link rel = "stylesheet" type = "text/css" href = "/media/styles.css">

Обычно я делаю свой собственный простой тег Template, потому что Django не предоставляет файлы CSS / JavaScript. Apache делает это, поэтому мой URL-адрес мультимедиа обычно http://static.mysite.com.

ваше приложение / 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 в каждый шаблон.

Или вы можете просто использовать django.core.context_processors.media, который встроен и делает то же самое.

Carl Meyer 15.01.2009 22:37

ааа, я должен был знать! Я так хотел создать свои собственные теги шаблонов, что пропустил этот!

bchhun 15.01.2009 23:10

@ Карл Мейер: Лучший ответ на данный момент. Спасибо.

Liam 10.03.2010 21:08

«Django не предоставляет файлы CSS / JavaScript» - что вы подразумеваете под «предоставлением»?

isomorphismes 27.04.2011 23:36
Ответ принят как подходящий

Мне просто нужно было разобраться в этом самому.

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"

MEDIA_URL и ADMIN_MEDIA_PREFIX; они могут быть такими же. Это просто не лучшая идея.

muhuk 17.01.2009 16:45

Верно, потому что одно всегда будет преобладать над другим, и вы в конечном итоге будете обслуживать мультимедийные файлы своего приложения из той же папки, что и мультимедийные файлы администратора. Обычно это не желаемый результат.

Ty. 19.01.2009 21:55

почему URL находится в разделе "settings.DEBUG"? он будет работать, если вы не в режиме отладки?

anc1revv 16.07.2012 07:56

Я использовал его как условное, потому что это не то, что вы хотите включать в производственной среде, и обычно параметр DEBUG включается только при локальной разработке. У вас должен быть настроен рабочий веб-сервер для обслуживания статических файлов, не передавая их Django.

Ty. 17.09.2013 00:55

Просто подумал, что быстро вмешаюсь. Хотя все предложения здесь работают отлично, и я действительно использую пример Тая при разработке, как только вы начнете производство, вы можете выбрать обслуживание файлов через обычный Apache или какой-либо другой сервер, который вы используете.

Что я делаю, так это настраиваю поддомен после завершения разработки и заменяю все ссылки на статические носители. Например:

<link rel = "stylesheet" type = "text/css" href = "http://static.mydomain.com/css/style.css" />

Для этого есть две причины. Во-первых, кажется, что Django будет медленнее обрабатывать эти запросы, когда они не нужны. Во-вторых, поскольку большинство браузеров могут загружать файлы одновременно из 3 разных доменов, использование второго поддомена для ваших статических файлов на самом деле ускорит загрузку ваших пользователей.

В Django уже есть контекстный процесс для MEDIA_URL, см. Документация Django.

Он должен быть доступен по умолчанию (если вы не настроили CONTEXT_PROCESSORS и не забыли добавить его) в RequestContext.

Например: <link rel = "stylesheet" type = "text / css" href = "{{MEDIA_URL}} styles.css" /> Вы также можете использовать этот бит, чтобы упростить локальную разработку: docs.djangoproject.com/en/1.0/howto/static-files

Edmundito 05.06.2009 01:52

Еще нужно добавить, что если у вас есть отдельный медиа-сервер в субдомене / другом домене, вы можете отключить файлы cookie для своего статического носителя. Небольшая экономия на обработке и пропускной способности.

Другие вопросы по теме