Django 在 OpenShift 上将斜杠附加到静态文件 URL

Posted

技术标签:

【中文标题】Django 在 OpenShift 上将斜杠附加到静态文件 URL【英文标题】:Django Appending Slashes to Static File URLs on OpenShift 【发布时间】:2014-09-07 17:34:38 【问题描述】:

我正在尝试使用 Python 3.3 插件在 OpenShift 上部署 Django 1.6 应用程序,但我遇到了静态文件问题。我在 OpenShift IRC 频道、教程/模板 (forexample) 和以前的 StackExchange 问题 (forexample) 方面取得了部分成功,但没有什么能完全解决问题。

当我通过 URL 请求静态内容时(例如“mydomain.com/static/stylesheet.css”或“mydomain.com/static/icons/cog.svg”),我可以很好地看到它们。当静态文件用作图标的 SVG 数据时,它们显示得很好。只有在链接到样式表时,我才会遇到问题。我使用以下内容在我的模板中包含 CSS:

<link type="text/css" rel="stylesheet" href=% static "stylesheet.css" %/>

我已经加载了带有% load staticfiles % 的静态文件标签集。 Django(我假设它是 Django,而不是 Apache)不是在 /static/stylesheet.css 上看到样式表,而是在 /static/stylesheet.css/ 上查找它(注意尾部的斜杠)。这会导致请求失败并显示 404 状态代码。当我使用其他文件扩展名(我尝试过.txt.css.svg)或链接到包含在static 的子目录中的文件时,也会发生同样的事情。只有在这种情况下才会附加一个额外的斜杠。

据我了解,如果 URL 与 urls.py 中定义的任何模式都不匹配,Django 会在 URL 后面附加一个斜杠。是否可以在 OpenShift 上配置 Apache,以便它直接处理对/static/* 形式的 URL 的所有请求?我在wsgi 目录中有一个.htaccess 文件,其中包含命令

Rewrite Engine On
Rewrite Rule ^application/static/(.+)$ /static/$1 [L]

但这并不能解决问题。我还尝试对样式表使用重写规则以及Alias 的一些东西,但在那里也没有运气。

Django 是否应该获得对这些静态文件的请求?我已经确认在我的settings.py 文件中将DEBUG 设置为False,并且在我的urls.py 文件中没有提及django.views.static.serve。以下是settings.py的相关部分:

STATIC_URL = '/static/'
if 'OPENSHIFT_REPO_DIR' in os.environ:
    STATIC_ROOT = os.path.join(os.environ.get('OPENSHIFT_REPO_DIR'),
                               'wsgi', 'static')
else:
    STATIC_ROOT = os.path.join(PROJECT_ROOT, 'static')

我没有为STATICFILES_DIRSSTATICFILES_FINDERS 设置值,因为目前我只处理在STATIC_ROOT 找到的静态文件。 OpenShift 项目看起来像

~/app-root/runtime/repo/wsgi/
    .htaccess
    application
    openshift/
        settings.py
        manage.py
        #And so on.
    static/
        stylesheet.css
        icons/
            cog.svg
            #More icons here.

这是我第一次尝试部署,但我被困在了这个绊脚石上。有谁知道我做错了什么?

【问题讨论】:

【参考方案1】:

试试href=% static "stylesheet.css" %,而不是href="% static 'stylesheet.css' %"

【讨论】:

我想你的意思是href="% static 'stylesheet.css' %",就像URL names一样。尽管如此,绝对是 +1 - 我之前设法完全错过了额外的双引号。

以上是关于Django 在 OpenShift 上将斜杠附加到静态文件 URL的主要内容,如果未能解决你的问题,请参考以下文章

Django 禁用斜杠

如何在单击的菜单项上将活动类附加到现有类?

在 auth 上将附加错误消息传递给验证错误包

在页面加载时将正斜杠附加到url的末尾

为啥字符和正斜杠被附加到我的 NSURL?

005.OpenShift访问控制-权限-角色