Статические файлы django в корне URL
У меня есть общий вопрос о новой статической файловой структуре Django 1.3.
Мне очень нравится новая функциональность статического файла Django, представленная в Django 1.3. Обычно я устанавливаю STATIC_URL="/static/" и вводю тег шаблона {{ STATIC_URL }} в мои шаблоны. Прекрасно, что сервер разработки автоматически подает статические файлы, и весь мой контент обрабатывается, как и ожидалось.
The {{ STATIC_URL }} would be substituted in the template and might serve up files like this...
example.com/static/css/master.css
example.com/static/images/logo.png
example.com/static/js/site.js
Однако я работаю с устаревшим сайтом, на котором статический носитель монтируется в корне URL. Например, путь к статическим URL-адресам может выглядеть примерно так:
example.com/css/master.css
example.com/images/logo.png
example.com/js/site.js
Он не использует "статическое" пространство имен URL.
Мне было интересно, есть ли способ заставить новую функциональность staticfile не использовать статическое пространство имен и не обслуживать указанные выше URL-адреса, но при этом сохранить преимущества новой среды staticfile (collectstatic, статические файлы, обслуживаемые сервером разработки и т. Д.). Я попытался установить STATIC_URL="" и STATIC_URL="/", но ни один из них не дал желаемого эффекта.
Есть ли способ настроить статические файлы для обслуживания статических файлов без пространства имен? Спасибо за внимание.
3 ответа
Вы можете вручную добавить дополнительные места, которые не существуют в static
каталоги в вашем проекте:
urls.py
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = patterns('',
# ... the rest of your URLconf goes here ...
)
if settings.DEBUG:
urlpatterns += static('/css/', document_root='app_root/path/to/css/')
urlpatterns += static('/images/', document_root='app_root/path/to/images/')
urlpatterns += static('/js/', document_root='app_root/path/to/js/')
Это отобразит медиа для сервера разработки DEBUG. И когда вы работаете с сервером производственного режима, вы, очевидно, будете обрабатывать эти статические местоположения с веб-сервера, а не отправлять запрос в django.
Почему бы не сохранить функциональность staticfiles и просто использовать перезаписи на уровне веб-сервера для обслуживания контента.
например:
rewrite /css /static permanent; (for nginx)
это сделает каталог вашего проекта намного чище, а также упростит перемещение ваших статических каталогов в будущем, например, для перехода к вашему STATIC_URL в CDN.
Вот как вы настроили свой urls.py для обслуживания как index.html, так и других ваших статических файлов в / в Django 1.10 (при этом все еще в состоянии обслуживать другие представления Django):
from django.contrib.staticfiles.views import serve
from django.views.generic import RedirectView
urlpatterns = [
# / routes to index.html
url(r'^$', serve,
kwargs={'path': 'index.html'}),
# static files (*.css, *.js, *.jpg etc.) served on /
url(r'^(?!/static/.*)(?P<path>.*\..*)$',
RedirectView.as_view(url='/static/%(path)s')),
]
Посмотрите этот ответ, где я написал более полное объяснение такой конфигурации, особенно если вы хотите использовать ее для производства.