【问题标题】:How to use static files with django nonrel如何在 django nonrel 中使用静态文件
【发布时间】:2011-12-08 10:39:51
【问题描述】:

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

- url: /static   
static_dir: static

我无法访问我的静态文件。我需要做额外的配置吗?

提前致谢。

【问题讨论】:

  • 你有没有机会把你的模板放在那里?

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


【解决方案1】:

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

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

通过将此指令放入 app.yaml 中,您可以让 AppEngine 网络服务器(无论是开发服务器还是生产服务器)处理路径 /static,并且您需要将所有静态文件放在静态目录中。这意味着您每次更改静态文件中的任何内容时都必须运行python manage.py collectstatic(特别是如果您拥有/使用带有静态文件的应用程序——比如admindjango-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 配置为在上传应用程序时忽略staticmedia 目录,因为所有静态文件都将收集到sitestatic 并从sitestatic 提供服务。但是,您应该仅在上传时设置此选项(否则这些文件将无法在调试服务器中使用)

【讨论】:

  • 您可能还需要添加静态文件帮助程序 urlpatterns,并为没有 RequestContext 呈现的模板使用“静态”模板标签 - 请参阅 docs。此外,请确保 staticfiles dev helper 提供的静态文件的路径与 app.yaml 中的任何 static_dir 或 static_files 条目不匹配。 GAE 区分“静态”和“脚本”文件,并且开发应用程序服务器将阻止 Django 动态提供它认为是静态的文件 - 与生产一致,出于安全原因,它被阻止。 (GAE SDK 1.7.5)
  • 别忘了在urls.py中设置静态辅助函数docs.djangoproject.com/en/dev/howto/static-files/…
【解决方案2】:

app.yaml 与 Django 无关,但它确实配置了 App Engine 前端。答案取决于您是想用 Django 还是前端(嗯,更便宜、更快)来提供静态文件。

如果您只是将- url: /static 映射“添加”到末尾,请将其移到/.* 通配符之前。由于所有映射都是从上到下处理的——首先匹配的映射获胜。

【讨论】:

    【解决方案3】:

    嗯,我刚刚想通了。只需在 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
    

    【讨论】:

      猜你喜欢
      • 2014-07-24
      • 1970-01-01
      • 2019-03-05
      • 1970-01-01
      • 1970-01-01
      • 2016-03-20
      • 1970-01-01
      • 2020-11-13
      • 2012-11-10
      相关资源
      最近更新 更多