我正在尝试将Django nonrel项目用于谷歌应用引擎。我按照here所述设置了测试项目。我为我的静态文件添加了一个名为“static”的项目的新文件夹。对于app.yaml文件,我添加了行;
- url: /static
static_dir: static
我无法访问我的静态文件。我是否需要进行其他配置?
提前谢谢。答案 0 :(得分:13)
正如人们已经指出的那样,你应该在static_dir
模式之前放置/.*
指令
但是,这不是你唯一应该知道的事情。
通过将此指令放入app.yaml,您可以使AppEngine Web服务器(无论是开发服务器还是生产服务器)处理路径/static
,并且您需要将所有静态文件放在静态目录中。这意味着每次更改静态文件中的任何内容时都必须运行python manage.py collectstatic
(特别是如果您拥有/使用包含静态文件的应用程序,例如admin
或django-tinymce
)只是为了在本地服务器上测试这些更改
那么如何避免呢?默认情况下,staticfiles提供帮助程序来在开发服务器上提供这些文件而不必每次都运行collectstatic,问题是上一段中描述的目标名称冲突:Django无法捕获对静态文件路径的请求,因为它们由appserver处理。您可以通过在开发和生产服务器上使用不同的路径来解决它:
# in settings.py
if DEBUG:
STATIC_URL = '/devstatic/'
else:
STATIC_URL = '/static/'
(djangoappengine在开发服务器上将DEBUG设置为True)。您可以离开ADMIN_MEDIA_PREFIX = '/static/admin/'
,但请记住在使用admin
当然记得在模板中使用{{ 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'),
)
这意味着:您将静态fiels放入static
dir(并进入您的应用'static
dirs),collectstatic
将它们收集到sitestatic
目录中。适当的app.yaml
指令是
- url: /static
static_dir: sitestatic
最后,您可以将app.yaml
配置为在上传应用时忽略static
和media
目录,因为所有静态文件都将从sitestatic
收集并提供。但是,您应该仅在上载时设置此项(否则这些文件在调试服务器中不可用)
答案 1 :(得分:11)
app.yaml
与Django无关,但它确实配置了App Engine前端。答案取决于你是想用Django还是前端(这样,更好,更快,更快)提供静态文件。
如果您刚刚将- url: /static
映射“添加”到最后,请在 /.*
通配符之前移动。由于所有映射都是从上到下处理的 - 第一次匹配映射获胜。
答案 2 :(得分: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