Джанго:как вы обслуживаете медиа / таблицы стилей и ссылаетесь на них в шаблонах

StackOverflow https://stackoverflow.com/questions/446026

Вопрос

Были заданы варианты этого вопроса, но я по-прежнему не могу заставить свои таблицы стилей правильно загружаться при рендеринге моих шаблонов.

Я пытаюсь использовать статические носители из процесса 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/".
приложение 2 откроется в www.example.com/app2/, а приложение 3 откроется в www.example.com/application/app3/.Я думаю, это сбивало меня с толку.

Это было полезно?

Решение

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

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 .

Обычно я создаю свой собственный шаблон simple tag, потому что Django не предоставляет файлы CSS / JavaScript.Apache делает это так, что мой медиа-URL обычно 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">

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

Обязательно используйте косую черту в конце и чтобы она отличалась от настройки MEDIA_URL (поскольку один и тот же URL-адрес не может быть сопоставлен двум разным наборам файлов).

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top