正如人们已经指出的那样,您应该将 static_dir 指令放在 /.* 模式之前
然而,这不是你应该知道的唯一事情。
通过将此指令放入 app.yaml 中,您可以让 AppEngine 网络服务器(无论是开发服务器还是生产服务器)处理路径 /static,并且您需要将所有静态文件放在静态目录中。这意味着您每次更改静态文件中的任何内容时都必须运行python manage.py collectstatic(特别是如果您拥有/使用带有静态文件的应用程序——比如admin 或django-tinymce),只是为了测试这些更改本地服务器
那么如何避免呢?默认情况下,staticfiles 提供帮助程序来在开发服务器上提供这些文件,而无需每次都运行 collectstatic,问题是上一段中描述的目录名称冲突:Django can't catch requests to your static files path, as they are processed by appserver.您可以通过在开发和生产服务器上使用不同的路径来解决它:
# in settings.py
if DEBUG:
STATIC_URL = '/devstatic/'
else:
STATIC_URL = '/static/'
(djangoappengine 在开发服务器上将 DEBUG 设置为 True)。您可以离开ADMIN_MEDIA_PREFIX = '/static/admin/',但请记住在使用 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 配置为在上传应用程序时忽略static 和media 目录,因为所有静态文件都将收集到sitestatic 并从sitestatic 提供服务。但是,您应该仅在上传时设置此选项(否则这些文件将无法在调试服务器中使用)