【问题标题】:Location of Django Admin media files on Google App EngineDjango Admin 媒体文件在 Google App Engine 上的位置
【发布时间】:2012-04-09 06:38:39
【问题描述】:

我正在运行带有 Python 2.7 和 Django 1.3 的 GoogleAppEngine (GAE) 1.6.3:

libraries:
- name: django
  version: "1.3"

在我的app.yaml。以下内容应在 url /static/admin 处提供管理媒体文件:

- url: /static/admin
  static_dir: django/contrib/admin/media
  expiration: '0'

但是对于此类管理媒体(css 等),我会收到 404。我是否为 Django 管理员的媒体文件使用了正确的位置?

【问题讨论】:

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


    【解决方案1】:

    执行此操作的最佳方法是将media 目录复制或符号链接到本地​​文件中的应用程序目录中,以便与应用程序的文件一起上传。那么你的app.yaml就可以引用到app目录下的相对路径了。

    您可以在app.yaml 路径中使用$PYTHON_LIB 变量替换,但在Python 2.7 运行时的实时版本中,Django 似乎不在$PYTHON_LIB 之下。

    【讨论】:

    • 谢谢你的回复,我也有你的书,很好的书,虽然今天有点过时了。所以没有办法设置 GAE 静态文件处理程序来指向 Live 上的 Django 管理媒体?我已经在本地按照通常的方式对其进行了整理,Live是问题所在。所以我必须上传所有 Django Admin 媒体文件,对吗?我以为我可以避免这种情况。
    • 必须复制所有文件并将它们与其余文件放在一起上传。仅管理员静态文件就有 640Kb。那是我整个申请的一半以上!有什么“解决”这个问题的计划吗?谢谢!
    • 静态文件服务器与应用服务器完全分离,因此没有自己的 Django 副本。如果您希望静态文件服务器提供这些服务,则必须将它们作为您的应用程序的一部分上传。另一种选择是编写一个从应用服务器为它们提供服务的小处理程序,它可以使用 inspect.getfile(django) 或类似的东西找到 Django 目录。 (感谢您对本书的称赞;我正在积极编写第二版。:))
    • 很公平。接受这个作为解决方案。
    【解决方案2】:

    在部署时变量 $PYTHON_LIB 是否可能引用静态文件??

    文件 app.yaml

    application: hello
    version: 1
    runtime: python27
    api_version: 1
    threadsafe: true
    
    libraries:
    - name: django
      version: "1.3"
    
    handlers:
    - url: /admin/media
      static_dir: $PYTHON_LIB/lib/django_1_3/django/contrib/admin/media
    
    builtins:
    - django_wsgi: on
    

    登录本地:

    INFO 2012-04-03 02:06:19,200 dev_appserver.py:2884] "GET /admin/media/css/base.css HTTP/1.1" 200 -

    INFO 2012-04-03 02:06:19,207 dev_appserver.py:2884] "GET /admin/media/css/dashboard.css HTTP/1.1" 200 -

    INFO 2012-04-03 02:06:19,242 dev_appserver.py:2884] "GET /admin/media/img/admin/default-bg.gif HTTP/1.1" 200 -

    记录错误部署应用:

    2012-04-02 19:17:32.775 /admin/media/css/dashboard.css 404 6ms 0kb

      • [02/Apr/2012:19:17:32 -0700]“GET /admin/media/css/dashboard.css HTTP/1.1”404

    找不到处理程序引用的静态文件:$PYTHON_LIB/lib/django_1_3/django/contrib/admin/media/css/dashboard.css

    【讨论】:

    • 按照上面 Dan Sanderson 的回答中的 cmets。
    • 好的,谢谢。静态文件服务器完全独立于应用服务器。我不喜欢将静态文件复制到我的应用程序的解决方案
    • 是的,它也会减慢速度。看看performance howtos on GAE上的相关讨论。
    【解决方案3】:

    将此添加到app.yaml

    handlers:
    - url: /static/admin
      static_dir: static/admin
      expiration: '0'
    

    我能够通过以下方式提供 CSS 文件:

    将此添加到settings.py:

    BASE_DIR = os.path.abspath(os.path.dirname(__file__)) + os.sep
    STATIC_ROOT = BASE_DIR + 'static'
    

    然后运行

    python manage.py collectstatic
    

    管理媒体文件在本地以及在 appspot.com 上正确显示。 最后一个命令将媒体文件复制到static/ 目录中。所以事实上 Dan Sanderson 的建议是按照更自动化的方式进行的。

    【讨论】:

    • 不会取消将其他答案标记为正确,因为我目前没有使用 GAE,因此我无法验证您的灵魂是否正确。听起来仍然“更整洁”,即 +1ed
    • 这对我有用!顺便说一句,我在 app.yaml 的处理程序部分使用“/static”和“static/”而不是“/static/admin”和“static/admin”。
    【解决方案4】:

    我尝试了 Philipp Keller 的 collectstatic,但没有可用的命令。

    所以,将此处理程序添加到app.yaml

    - url: /static/admin
      static_dir: django/contrib/admin/static/admin
      expiration: '0'
    

    然后,在 settings.py 中,删除 ADMIN_MEDIA_PREFIX(在 django 1.4 中删除)并添加:

    STATIC_URL = '/static/'
    

    你有工作的 css。

    【讨论】:

    • 我不再从事这个项目了。仍然 +1,因为这是一个更新的答案。
    【解决方案5】:

    以下似乎对我来说很好。

    app.yaml

    handlers:
    - url: /static
      static_dir: staticfiles
    

    设置

    STATIC_URL = '/static/'
    STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
    STATICFILES_DIRS = (
        os.path.join(BASE_DIR, 'static'),
    )
    

    运行python manage.py collectstatic。现在应该在您的静态文件管理文件夹下创建。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-21
      • 2010-11-08
      • 2010-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-05
      相关资源
      最近更新 更多