Django : 미디어 / 스타일 시트를 제공하고 템플릿 내에서 그들과 연결하는 방법
-
22-07-2019 - |
문제
이 질문의 변형이 요청되었지만 템플릿이 렌더링 될 때 스타일이 올바르게로드 될 수는 없습니다.
개발 중 Django 프로세스에서 정적 미디어를 제공하려고 노력하고 있습니다. 생산에서 강력하게 낙담하고 있습니다. 구성과 템플릿을 게시하겠습니다. 누군가가 내가 어디에서 잘못 될지 이해하도록 도와 줄 수 있기를 바랍니다.
Django Project 웹 사이트의 예제를 따르려고했지만 템플릿에서 스타일 시트를 참조하는 방법을 언급하지 않습니다. 나는 또한 같은 것들의 다양한 변형을 시도 했으므로 내 코드/설정이 설명 된 내용에서 약간 벗어날 수 있습니다.
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>
파일 (템플릿/미디어)이 내 파일 시스템의 올바른 디렉토리에 있습니다. 제공해야 할 추가 정보가 있으면 의견을 게시하십시오.
편집하다:
내가 가진 문제 중 하나는 '/'링크를 사용하는 것입니다. 정방향 슬래시가 배정되면 사이트의 루트에서 링크가 열립니다. 전방 슬래시가 없으면 링크가 현재 레벨에서 열립니다. An example:
www.example.com/application/에는 "/app2/및"app3/"링크가 있습니다.
APP2는 www.example.com/app2/에서 열리고 App3은 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에 대한 컨텍스트 프로세스가 있습니다. 장고의 문서.
RequestContext에서 Context_Processors를 사용자 정의하고 추가하는 것을 잊지 않는 한 기본적으로 사용 가능해야합니다.
Django가 CSS/JavaScript 파일을 제공하지 않기 때문에 보통 내 자신의 템플릿 간단한 태그를 만듭니다. 아파치는 내 미디어 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의 예제를 사용하지만 프로덕션을 치면 직선 아파치를 통해 파일을 제공하거나 사용중인 다른 서버를 통해 파일을 제공하기를 원할 수 있습니다.
내가하는 일은 개발을 마치면 하위 도메인을 설정하고 모든 링크를 정적 미디어로 바꾸는 것입니다. 예를 들어:
<link rel="stylesheet" type="text/css" href="http://static.mydomain.com/css/style.css" />
이를 수행하는 이유는 두 가지입니다. 첫째, Django가 필요하지 않은 경우 이러한 요청을 처리하는 것이 느리게 보입니다. 둘째, 대부분의 브라우저는 실제로 3 개의 다른 도메인에서 파일을 동시에 동시에 다운로드 할 수 있으므로 정적 파일에 두 번째 하위 도메인을 사용하면 실제로 사용자의 다운로드 속도 속도가 높아집니다.
추가해야 할 또 다른 사항은 하위 도메인/다른 도메인에 별도의 미디어 서버가있는 경우 정적 미디어의 쿠키를 비활성화 할 수 있다는 것입니다. 약간의 처리와 대역폭을 저장합니다.