【问题标题】:What am I doing wrong with Django static files?我对 Django 静态文件做错了什么?
【发布时间】:2011-10-17 04:50:14
【问题描述】:

我是第一次编写 Django 应用程序,如果我有点落后,请耐心等待。

这是我的 settings.py 的摘录:

STATIC_ROOT = os.getcwd().replace('\\','/') + '/static'

STATIC_URL = '/static_files/'

STATICFILES_DIRS = (
    os.getcwd().replace('\\','/') + '/static'
)

STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)

注意:我希望os.getcwd()... 行有效。我很确定这不是我的问题,但如果这是一个问题,请告诉我。它是用于本地开发目的的占位符,所以当我部署时不用担心它会保留在那里。

我的第一个问题是模板变量似乎不起作用。

摘自我的主模板文件:

<link rel="stylesheet" type="text/css" href="{{ STATIC_URL|default:'/static_files/' }}css/base.css" />

我最初只有{{ STATIC_URL }},但它什么也没返回,所以我尝试添加|default:'...'。这确实成功地在生成的 HTML 中生成了给定的字符串,但仍然没有工作,这让我想到了我的第二个(更重要的是,老实说)问题。

我根本无法使用静态文件。我在这里尝试了几种不同的方法。我尝试在上述每个 STATIC_* 变量中放置绝对路径和相对路径(以各种组合),我尝试使用等效的 MEDIA_URL 变量,并尝试将以下内容放入我的 urls.py

urlpatterns = ('',

    # ...

    (r'^static_files/(?P<path>.*)$', 
        'serve', {
            'document_root': '/path/to/django/dir/static_files/',
            'show_indexes': True 
        }
    ),
)

(我从http://www.arthurkoziel.com/2008/09/02/handling-static-files-django/获取了上面的sn-p。)

现在我应该注意,一旦初始开发完成,我希望最终能够从并行 Apache 进程中提供静态文件,但我仍然很想知道我做错了什么。我无法在网上或 StackOverflow 上找到关于静态文件的相当全面的教程。

非常感谢所有帮助。

编辑:如果很重要,我在 Windows 7 上使用 Python 2.7。

【问题讨论】:

    标签: django variables django-templates static-files


    【解决方案1】:

    一种可能性 - 除非您传入 RequestContext,否则不会在模板中填写 STATIC_URL。

    确保您的视图中有类似的内容:

    return render_to_response(template, context, context_instance=RequestContext(request))
    

    从 Django 1.3 开始,您还可以使用新的快捷方式:

    return render(request, template, context)
    

    另外,请确保您的上下文处理器中有“django.core.context_processors.static”。


    编辑:第二个问题的可能答案,尝试改变

    STATICFILES_DIRS = (
        os.getcwd().replace('\\','/') + '/static'
    )
    

    STATICFILES_DIRS = (
        os.getcwd().replace('\\','/') + '/static',
    )
    

    编辑 2:更多可能的修复

    您可以删除 STATICFILES_FINDERS。您只需将其设置为默认值,因此除非您打算稍后扩展它,否则请摆脱它(少一件事出错)。

    你也可以去掉 urlpatterns 条目。没必要。

    您的 STATIC_ROOT 可能不正确。这应该是 Django 将在您迁移到生产环境时从您的项目中收集所有静态文件(包括 STATICFILES_DIRS 中描述的目录)的地方。

    我的典型 settings.py 示例:

    PROJECT_DIR = os.path.dirname(__file__)
    
    STATIC_URL = '/static/'
    
    STATICFILES_DIRS = (
        os.path.join(PROJECT_DIR, 'static'),
    )
    
    STATIC_ROOT = '/var/www/myproject_staticfiles/'
    

    就是这样!

    如果您想测试 Django 是否正确查找和放置静态文件,请尝试运行

    python manage.py collectstatic
    

    就我而言,这将遍历我的项目目录,找到所有静态文件,然后将它们复制到“/var/www/myproject_staticfiles/”,我可以在其中使用 apache 托管它们。

    Django 开发服务器会自动从您的项目文件夹中提供静态文件,因此在开发时不需要 collect_static。在投入生产之前,您甚至不需要设置 STATIC_ROOT。

    【讨论】:

    • 这绝对解决了我的第一个小问题。但是,我的第二个问题仍然存在。
    • 不幸的是,这对我没有任何帮助。我很确定添加逗号不会改变任何东西。它最终仍然是一个只有一个条目的元组。
    • 你必须小心 python 中的列表和元组,因为 ('foo') 将迭代为 ['f', 'o', 'o']。无论如何,我在上面添加了更多可能的修复。
    • 关于具有单个字符串元素的元组非常好。我没有想到这一点。我最终通过使用 MEDIA_* vars 而不是 STATIC_* vars 解决了我的问题。因为解决了我的第一个问题并给了我一些非常有用的提示,所以我仍然给你打勾。知道为什么 MEDIA_* 可以工作,但 STATIC_* 不行吗?
    猜你喜欢
    • 1970-01-01
    • 2011-06-25
    • 2011-12-22
    • 2020-10-17
    • 2013-08-10
    • 1970-01-01
    • 2017-02-01
    • 1970-01-01
    • 2010-11-07
    相关资源
    最近更新 更多