【发布时间】:2012-06-13 15:51:52
【问题描述】:
我想在视图中创建一个动态 CSS 文件,然后渲染一个加载该 CSS 文件的模板。根据赋予视图的参数,每次调用视图时,CSS 可能在某些位置具有不同的值。我该怎么做呢? (我应该补充一点,我没有使用 Python/Django 编写文件的经验。)
这是我认为应该如何工作的简化示例:
# urls.py
urlpatterns = patterns('',
(r'^myview/(?P<color>[0-9a-f]{6})/$', create_css_file),
)
# views.py
def create_css_file(request, color):
raw = "@charset 'UTF-8';\n\n"
raw += "body {\n"
raw += " color: #" + color + ";\n"
raw += "}\n\n"
f = open('mydynamic.css', 'r+')
f.write(raw)
return render_to_response('mytemplate.html', locals())
# mytemplate.html
{% extends "base.html" %}
{% block head %}
<link rel="stylesheet" media="screen" href="{{ f.name }}" />
{% endblock %}
由于某种原因,这不起作用,尽管在生成的 HTML 页面的源代码中,看起来 CSS 文件已正确加载。 f 甚至可以正确到达模板,因为当我将 <link>... 行更改为
<link rel="stylesheet" media="screen" href="{{ f }}" />
(f而不是f.name)。但是 HTML 是在没有所需颜色设置的情况下呈现的。谁能告诉我这是为什么?
我怀疑是路径问题,我玩弄了很多不同的路径,但无济于事。
请不要建议我准备几个硬编码的 CSS 文件(正如我在类似问题的答案中发现的那样),因为会有数百种可能性。
【问题讨论】:
-
链接 点击是否会出现 404 错误?
-
呃,把它放在
<style>中?在这样的视图中写入文件是愚蠢的,不会起作用。 -
@CatPlusPlus:乍一看,把它放在
<style>似乎可行,谢谢!但是由于我想学习,您能否详细说明为什么在视图中写入文件是愚蠢的,为什么它不起作用?我在其他地方看到过这个建议,但不幸的是没有具体说明。 -
@Jo.:因为它写入应用程序的当前工作目录,该目录不太可能在 webroot 附近(也不应该),所以客户端将永远无法访问它。
-
@Jo.:是的,但无论如何这不是一个好主意。这是每个请求的额外(和不必要的)I/O 操作,并发请求可能会使其失败,即使客户端确实可以访问该文件(考虑一个客户端完成了对该文件的写入,但还没有来得及获取它,然后另一个用自己的东西重写它,然后第一个获取它 - bork'd)。
标签: django django-templates dynamic-css