Django静态文件无法工作。

16

由于某些原因,Django没有提供我的静态文件。

我已经查看了很多解决此问题的方法,但是我仍然没有找到解决方案。

这是我的配置:

urls.py

urlpatterns = patterns('',
    (r'^$', index),
    (r'^ajax/$', ajax),
    (r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root': path.join(path.dirname(__file__), 'static')}),
)

settings.py

STATIC_ROOT = '/home/aurora/Code/django/test/static/'
STATIC_URL = '/static/'
INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # Uncomment the next line to enable the admin:
    # 'django.contrib.admin',
    # Uncomment the next line to enable admin documentation:
    # 'django.contrib.admindocs',
)

当我访问 http://localhost:8000/static/css/default.css 时,出现错误:'css/default.css' 无法找到

当我访问 http://localhost:8000/static/ 时,出现错误:此处不允许目录索引。

看起来静态目录被映射了出来,但子目录没有被映射。


1
请查看我的答案:https://dev59.com/cWDVa4cB1Zd3GeqPaB-7#9168404。简而言之,您不应该将静态文件存储在`STATIC_ROOT`中。Django在开发过程中*从不*使用此目录。即使在生产环境中,也是您的Web服务器而不是Django从此目录提供服务。 - Chris Pratt
立即生效。如果您希望我将其标记为答案,请将其发布为答案。 - Franz Payer
8个回答

18

正在开发中:

  • STATICFILES_DIRS 应该包含所有静态文件目录,其中所有静态文件都存放在内。

  • 如果你的文件在本地机器上,STATIC_URL 应该是 /static/,否则在此处放置基本 URL,例如“http://example.com/”

  • INSTALLED_APPS 应该包括 'django.contrib.staticfiles'

在模板中,加载 staticfiles 模块:

{% load staticfiles %}
..
..
<img src='{% static "images/test.png" %}' alt='img' />

正在生产中:

  • 添加STATIC_ROOT,用于让Django从STATICFILES_DIRS中收集所有静态文件

  • 收集静态文件

python manage.py collectstatic [--noinput]
  • 将路径添加到urls.py文件中
  • 将路径添加到urls.py文件中
  • from . import settings
        ..
        ..
    urlpatterns = patterns('',
    ..
        url(r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root':settings.STATIC_ROOT)}),)`
    

    以下是更详细的文章:

    http://blog.xjtian.com/post/52685286308/serving-static-files-in-django-more-complicated

    http://agiliq.com/blog/2013/03/serving-static-files-in-django/


    1
    谢谢。这很好地总结了开发和生产的更改。 在我的情况下,我打错了STATICFILES_DIRS为STATICFILES_DIR,并一直努力让它工作。 - rks

    7
    尝试运行python manage.py collectstatic并查看静态文件的收集位置。
    将此添加到您的urls.py中,并在settings.py中设置DEBUG=True
    if settings.DEBUG:
        urlpatterns += patterns('',
                 (r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.STATIC_ROOT, 'show_indexes':True}),
             )
    
        urlpatterns += patterns('',
                (r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT, 'show_indexes':True}),
            )
    

    2
    0个静态文件已复制到'/home/aurora/Code/django/test/static/'。我在目录上执行了ls命令,我可以看到文件在那里... - Franz Payer
    'show_indexes':True应该可以帮助你在/static上列出索引列表。你在那里看到什么? - Pratik Mandrekar
    当我访问 /static/ 时,目录会被列出,但我无法访问目录中的文件。 - Franz Payer
    localhost:8000/admin/ 是否包含所有的 css 文件? - Pratik Mandrekar
    尝试编辑您的settings.py文件,将以下静态部分复制到“project_static”文件夹下,并运行“collectstatic”命令。 - Pratik Mandrekar
    以下是查找静态文件的类列表,它们知道如何在不同位置查找静态文件。STATICFILES_FINDERS = ( 'django.contrib.staticfiles.finders.FileSystemFinder', 'django.contrib.staticfiles.finders.AppDirectoriesFinder', )#从django.contrib.staticfiles包中,存储所有静态应用程序媒体(非用户生成)STATIC_URL = "/static/"STATIC_ROOT = os.path.join(DIRNAME ,'static')STATICFILES_DIRS = (os.path.join(DIRNAME , 'project_static'),) - Pratik Mandrekar

    5
    我认为你不需要在urls.py中使用静态路径,删除它应该就可以了。
    当前的写法是这样的:
    urlpatterns = patterns('',
        (r'^$', index),
        (r'^ajax/$', ajax),
        (r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root': path.join(path.dirname(__file__), 'static')}),
    )
    

    只需移除r'^static'这一行即可。

    urlpatterns = patterns('',
        (r'^$', index),
        (r'^ajax/$', ajax),
    )
    

    至少在Django 1.3及以上版本中,是这样进行的。

    仍然无法工作,当我访问http://localhost:8000/static/时,urls.py出现错误:“当前URL“static /”与任何内容都不匹配。” - Franz Payer
    在你的settings.py文件中的INSTALLED_APPS中,是否包含'django.contrib.staticfiles'? - Vaibhav Mishra
    是的,我还将我的settings.py中INSTALLED_APPS部分添加到了问题中。 - Franz Payer
    尝试访问此网址:http://localhost:8000/static/css/default.css,另一个通常不可访问。 - Vaibhav Mishra
    让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/15578/discussion-between-vaibhav-mishra-and-franz-payer - Vaibhav Mishra
    你能检查一下聊天室并应用建议吗? - Vaibhav Mishra

    4

    NameError:未定义名称'staticfiles_urlpatterns' - AnonymousUser

    0
    记住 STATICFILES_DIRS 这个名字,不要搞错,它是区分大小写的。

    这并没有回答问题。一旦您拥有足够的声望,您将能够评论任何帖子;相反,提供不需要提问者澄清的答案。- 来自审核 - undefined

    0

    我正在使用以下设置:(截至2021年4月)

    • macOS Big Sur
    • vscode
    • Ananconda 3(用于环境管理)

    当我尝试在Django中访问我的静态文件时,如果静态文件夹内存在test.txt文件,则使用http://localhost:8000/static/test.txt

    1. 在您的主项目文件夹中打开setting.py文件
    2. 将此代码粘贴到settings.py的最后一行:
    STATIC_URL = '/static/'
    
    # Added Manually
    STATICFILES_DIRS = [
        BASE_DIR / "static",
    ]
    
    

    然后重新启动 VS Code。

    避免将您的代码发布在图像中,而应该以文本格式发布! - GooDeeJAY
    好的,先生。非常感谢您的建议。我会去做的。 - Mayur Gupta
    它怎么可能在没有静态根的情况下运行? - Saikat Mukherjee

    0

    这里的主目录名称是mysite,应用程序名称是polls(投票应用程序项目Django教程)。

    1. 在主文件夹(mysite)内创建一个静态文件夹。

    2. 我们可以将静态文件(如JavaScript、图像文件、CSS等)添加到静态文件夹中。

    3. 创建静态文件夹后,我们需要在settings.py文件中添加以下行(在STATIC_URL = '/static/'行下方)来通知Django。

    1. STATIC_ROOT = os.path.join(BASE_DIR, 'static')

    #现在告诉Django在哪里查找您添加的静态文件。 #在settings.py文件的顶部添加import os

    1. STATICFILES_DIRS = [

      os.path.join(BASE_DIR, 'mysite/static/')

    ]

    #在终端中运行此命令以收集项目中的所有静态文件。

    1. python manage.py collectstatic

    #运行服务器,如果需要,添加端口号。

    1. python manage.py runserver 端口号

    1
    根据目前的写法,你的回答不够清晰。请编辑以添加更多细节,帮助其他人理解这如何回答所提出的问题。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - Community

    0
    STATIC_URL = '/static/' 
    STATIC_ROOT = os.path.join(BASE_DIR, "static/")
    

    4
    你应该添加一些解释说明。仅有代码的回答很可能会被删除。 - m02ph3u5

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接