如何使用django nonrel的静态文件

时间:2011-10-15 18:13:23

标签: django google-app-engine django-nonrel

我正在尝试将Django nonrel项目用于谷歌应用引擎。我按照here所述设置了测试项目。我为我的静态文件添加了一个名为“static”的项目的新文件夹。对于app.yaml文件,我添加了行;

- url: /static   
static_dir: static

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

提前谢谢。

3 个答案:

答案 0 :(得分:13)

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

但是,这不是你唯一应该知道的事情。

通过将此指令放入app.yaml,您可以使AppEngine Web服务器(无论是开发服务器还是生产服务器)处理路径/static,并且您需要将所有静态文件放在静态目录中。这意味着每次更改静态文件中的任何内容时都必须运行python manage.py collectstatic(特别是如果您拥有/使用包含静态文件的应用程序,例如admindjango-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

之前至少运行一次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'),
)

这意味着:您将静态fiels放入static dir(并进入您的应用'static dirs),collectstatic将它们收集到sitestatic目录中。适当的app.yaml指令是

- url: /static
  static_dir: sitestatic

最后,您可以将app.yaml配置为在上传应用时忽略staticmedia目录,因为所有静态文件都将从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