我是Django新手在我的第一个项目上工作并且遇到静态文件问题。
我使用django.contrib.auth
创建了一个简单的身份验证系统,该系统由两个模板组成:mysite/templates/index.html
和mysite/templates/registration/login.html
。我在mysite/static
中拥有全局静态内容,我希望能够访问所有应用呈现的所有模板。
mysite/templates/index.html
包含<img src="{{ STATIC_URL }}pics03.jpg"/>
,其呈现为"static/pics03.jpg"
并在我访问网址时加载正常localhost:8000/
mysite/templates/registration/login.html
包含<img src="{{ STATIC_URL }}pics03.jpg"/>
也会呈现为"static/pics03.jpg"
,并且在我访问网址"localhost:8000/accounts/login/"
在我的urls.py中我有:
urlpatterns = patterns('',
url(r'^$', 'mysite.views.home'), # plays index.html template
url(r'^accounts/login/$', 'django.contrib.auth.views.login'),
在我的settings.py中,我有:
PROJECT_DIR = os.path.dirname(__file__)
STATICFILES_DIRS = (
# Put strings here, like "/home/html/static" or "C:/www/django/static".
# Always use forward slashes, even on Windows.
# Don't forget to use absolute paths, not relative paths.
os.path.join(PROJECT_DIR,'static'),
)
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)
STATIC_URL = '/static/'
STATIC_ROOT = ''
我的印象是Django应该在STATICFILES_DIRS中寻找全局静态内容,但是即使我将其中的url更改为静态文件夹的绝对路径,它也找不到login.html的静态内容。任何人都可以对此有所了解吗?
答案 0 :(得分:19)
您的问题是您在urls.py中没有收听URL“/ static /”
如果您通过apache或nginx等网络服务器为您的应用程序提供服务,那么这是正常的,因为网络服务器本身会处理静态文件。
对于开发,Django附带了一个内置的静态服务器
到urls.py,最后添加
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns += staticfiles_urlpatterns()
这样做是为了添加/ static / url,让你为没有网络服务器的人提供服务。
这相当于
url(
regex=r'^static/(?P<path>.*)$',
view='django.views.static.serve',
kwargs={'document_root': settings.STATIC_ROOT,}
)
有些人会告诉你,你需要将URL规则包装在“if settings.DEBUG”中以使用dev-only规则,但这根本不需要,实际上我发现这是一个糟糕的建议。
答案 1 :(得分:1)
在runserver中使用构建时遇到问题,或者使用Apache或类似服务?我有点挣扎。我遵循的文档是:https://docs.djangoproject.com/en/dev/howto/static-files/
准备好部署时,第二部分是关键。您需要定义一个静态根(开始时为空)并运行manage.py collectstatic
命令将静态文件从整个项目移动到该文件夹中。然后你可以从那里为他们服务。
答案 2 :(得分:0)
将STATIC_ROOT=''
更改为STATIC_ROOT='/'
会有帮助吗?
在我看来,唯一的区别是主页上存在static/pics03.jpg
(相对路径),但另一方面则不存在。
两种情况都存在绝对路径/static/pics03.jpg
。如果更改STATIC_ROOT
无效,只需在网址的开头添加/
即可。