我正在尝试在Google App Engine中使用Django nonrel项目。我按照这里描述的设置了测试项目。我添加了一个名为“static”的文件夹来存放我的静态文件。对于app.yaml文件,我添加了以下行:
- url: /static
static_dir: static
我无法访问我的静态文件。我是否需要进行其他配置?
提前感谢。
我正在尝试在Google App Engine中使用Django nonrel项目。我按照这里描述的设置了测试项目。我添加了一个名为“static”的文件夹来存放我的静态文件。对于app.yaml文件,我添加了以下行:
- url: /static
static_dir: static
我无法访问我的静态文件。我是否需要进行其他配置?
提前感谢。
正如其他人指出的那样,你应该在 /.*
模式之前放置你的 static_dir
指令。
然而,这并不是你需要知道的全部。
将这个指令放在 app.yaml 文件中,可以让 AppEngine 服务器(无论是开发还是生产服务器)处理路径 /static
,并且你需要将所有静态文件放在 static 目录中。这意味着每次更改静态文件(特别是如果你有/使用带有静态文件的应用程序,比如 admin
或 django-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
文件,在上传应用时忽略static
和media
目录,因为所有静态文件都将被收集并从sitestatic
提供服务。然而,你应该只在上传时设置这个选项(否则这些文件将不会在调试服务器中可用)。
app.yaml
与 Django 没有任何关系,但它配置了 Google App Engine 的前端。答案取决于您想使用 Django 还是前端(这样做更便宜且更快)来提供静态文件。
如果您只是将您的 - url: /static
映射 "添加" 到末尾,请将其移动到 /.*
通配符之前。因为所有映射都是从上到下处理的 —— 第一个匹配的映射胜出。
我刚才弄清楚了。在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