如何在使用django nonrel时使用静态文件

10

我正在尝试在Google App Engine中使用Django nonrel项目。我按照这里描述的设置了测试项目。我添加了一个名为“static”的文件夹来存放我的静态文件。对于app.yaml文件,我添加了以下行:

- url: /static   
static_dir: static

我无法访问我的静态文件。我是否需要进行其他配置?

提前感谢。


你有没有把你的模板放在那里? - Dave W. Smith
3个回答

13

正如其他人指出的那样,你应该在 /.* 模式之前放置你的 static_dir 指令。

然而,这并不是你需要知道的全部。

将这个指令放在 app.yaml 文件中,可以让 AppEngine 服务器(无论是开发还是生产服务器)处理路径 /static,并且你需要将所有静态文件放在 static 目录中。这意味着每次更改静态文件(特别是如果你有/使用带有静态文件的应用程序,比如 admindjango-tinymce),你都需要运行 python manage.py collectstatic 来测试这些更改是否在本地服务器上生效。

那么如何避免这种麻烦呢?默认情况下,staticfiles 提供了一些帮助程序,可以在开发服务器上提供这些文件,而无需每次运行 collectstatic。问题在于第二段描述的目录名冲突:Django 无法捕获到你的静态文件路径的请求,因为它们被 appserver 处理。你可以通过在开发和生产服务器上使用不同的路径来解决这个问题:

# in settings.py
if DEBUG: 
    STATIC_URL = '/devstatic/'
else:
    STATIC_URL = '/static/'

(djangoappengine在开发服务器上将DEBUG设置为True)。您可以保留ADMIN_MEDIA_PREFIX = '/static/admin/',但记得在使用管理员之前至少运行一次collectstatic。

当然,请记得在模板中使用{{ STATIC_URL }}path/to.css而不是/static/path/to.css

哦,并且我假设您区分了您正在处理的原始静态文件的目录和应该收集静态文件的目录。 我在我的settings.py中使用此设置:

STATIC_ROOT = os.path.join(os.path.dirname(__file__), 'sitestatic')
STATICFILES_DIRS = (
    os.path.join(os.path.dirname(__file__), 'static'),
)

这意味着:你将静态文件放入 static 目录(包括你的应用程序的 static 目录),collectstatic 将它们收集到 sitestatic 目录中。适当的 app.yaml 指令是:

- url: /static
  static_dir: sitestatic

最后,你可以配置app.yaml文件,在上传应用时忽略staticmedia目录,因为所有静态文件都将被收集并从sitestatic提供服务。然而,你应该只在上传时设置这个选项(否则这些文件将不会在调试服务器中可用)。


您可能还需要添加staticfiles helper urlpatterns,并对没有RequestContext渲染的模板使用'static' templatetag - 请参阅文档。此外,请确保由staticfiles dev helper提供服务的静态文件路径不与app.yaml中的任何static_dir或static_files条目匹配。 GAE区分“静态”和“脚本”文件,开发应用程序服务器将阻止Django动态提供它认为是静态的文件 - 以保持与生产一致,在那里出于安全原因而被阻止。(GAE SDK 1.7.5) - jgiles
1
不要忘记在urls.py中设置静态帮助函数https://docs.djangoproject.com/en/dev/howto/static-files/#serving-static-files-in-development - taelimoh

11

app.yaml 与 Django 没有任何关系,但它配置了 Google App Engine 的前端。答案取决于您想使用 Django 还是前端(这样做更便宜且更快)来提供静态文件。

如果您只是将您的 - url: /static 映射 "添加" 到末尾,请将其移动到 /.* 通配符之前。因为所有映射都是从上到下处理的 —— 第一个匹配的映射胜出。


4

我刚才弄清楚了。在main.py之前使用static_dir行即可。因此,app.yaml应如下所示:

application: test
version: 1
runtime: python
api_version: 1

builtins:
- remote_api: on

inbound_services:
- warmup

handlers:
- url: /_ah/queue/deferred
  script: djangoappengine/deferred/handler.py
  login: admin

- url: /_ah/stats/.*
  script: djangoappengine/appstats/ui.py

- url: /media/admin
  static_dir: django/contrib/admin/media
  expiration: '0'

- url: /static
  static_dir: static

- url: /.*
  script: djangoappengine/main/main.py

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