2016-06-09 2 views
4

Я немного смущен относительно того, какая разница между STATIC_URL и STATIC_ROOT в приложении 'staticfiles' Django.В чем разница между STATIC_URL и STATIC_ROOT в Django?

Я считаю, что я понимаю, что такое STATIC_ROOT: это, по сути, место на сервере, где команда staticfiles collectstatic поместит статические файлы, собранные из вашего проекта django. Команда collectstatic выполняет поиск в местах, указанных вами в настройке STATIC_FINDERS.

Однако, что именно делает STATIC_URL? К чему это должно быть настроено? По-видимому, он предназначен для установки того, что пользователи могут получить доступ к статическим файлам. Но что это за отношения с STATIC_ROOT?

Почему значение по умолчанию STATIC_URL просто /static/? Делает STATIC_URL должен уметь ссылаться STATIC_ROOT?

ответ

4

Как вы упомянули, это довольно ясно из документации:

STATIC_ROOT:

Абсолютный путь к каталогу, в котором collectstatic будет собирать статические файлы для развертывания.

STATIC_URL

по умолчанию: Нет

URL для использования при ссылках на статические файлы, расположенные в STATIC_ROOT.

Пример: "/static/" или "http://static.example.com/"

Пока, STATIC_ROOT только путь к каталогу, в котором были собраны статические файлы, STATIC_URL является URL, который будет обслуживать эти статические файлы.

И, как вы можете видеть в примере, вы можете определить STATIC_URL как субдомен "http://static.example.com/" и при использовании его в шаблоне:

<link rel="stylesheet" href="{{ STATIC_URL }}css/base.css" type="text/css" /> 

Это будет рассматриваться как:

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

Но, если STATIC_URL был только /static/, то указанная ссылка будет указывать на:

<link rel="stylesheet" href="/static/css/base.css" type="text/css" /> 

И, так как это href начинается с / он добавит ваш домен, чтобы получить доступ к статическим файлам: http://yourdomain/static/css/base/css


Почему это значение по умолчанию STATIC_URL просто /static/? Должен ли STATIC_URL иметь возможность ссылаться на STATIC_ROOT?

Значение по умолчанию STATIC_URL не равно /static/, но нет, как вы можете видеть в документации. И он не должен ссылаться на STATIC_ROOT, потому что он не зависит от него (как показано в примере выше).

+0

Отличный ответ. Я должен добавить, что использование {{STATIC_URL}} внутри шаблона не рекомендуется. Вместо этого используйте {% load static%} ... {% static 'css/main.css'%}. http://staticfiles.productiondjango.com/blog/stop-using-static-url-in-templates/ – np8

0

STATIC_URL - это просто префикс или URL-адрес, который добавлен к вашим статическим файлам и используется методом static в шаблонах Django. https://docs.djangoproject.com/en/1.9/ref/settings/#std:setting-STATIC_URL https://docs.djangoproject.com/en/1.9/howto/static-files/

STATIC_ROOT это каталог или место, где ваши статические файлы будут развернуты при запуске collectstatic https://docs.djangoproject.com/en/1.9/ref/settings/#std:setting-STATIC_ROOT

Так что, когда у вас есть STATIC_URL определяется как /static/ то ваши пользователи будут запрашивать статические файлы из /static/file-name.example (относительного URL на ваш сервер).

Если бы вы настроили свой collectstatic развернуть статические файлы на другой сервер, вы можете установить STATIC_URL в https://static.example.org/, а затем вы бы получить доступ к файлам на https://static.example.org/filename.ext

Другой пример, который я использует библиотеку бото s3 в загружать статический и мультимедийный контент в amazon s3. Мой STATIC_URL выглядит как STATIC_URL = '//%s/%s/' % (CLOUDFRONT_DOMAIN, STATIC_S3_PATH), который создает статический префикс url, такой как //mycloudfront.whatever/static/, чтобы пользователи могли обслуживать файлы из нашего CDN.

Мой STATIC_ROOT однако определяется как STATIC_ROOT = '/%s/' % STATIC_S3_PATH, потому что мне нужно загрузить мой контент в Amazon S3 и не cloudfront.

0

STATIC_ROOT - это то, где все ваши активы будут собраны командой collectstatic. Содержимое этого содержимого содержит все статические активы из всех приложений, перечисленных в INSTALLED_APPS (из их собственных static папок) и любых мест в файлах, указанных в STATICFILE_DIRS.

После того, как вы собрали все эти активы, чтобы django создавал URL-адреса, вам нужно указать, что является основным URL-адресом этих активов, это настройка STATIC_URL, и она всегда должна заканчиваться косой чертой.