【问题标题】:Django StaticFiles APP and WsgiDjango StaticFiles APP 和 Wsgi
【发布时间】:2011-07-31 09:30:14
【问题描述】:

这不像其他人那么简单的问题.. 至少。设置简单的基于单目录的静态文件位置不是问题..

https://bitbucket.org/sirex/django-starter/src

这里有一个非常有趣的项目.. 这个项目使用分发和构建来制作整个项目和 django 与一个目录中的模块。您可以轻松地从开发模式迁移到生产模式等等。您所需要的只是重命名 dir,然后在其中输入“make”,就是这样 =) 那里有手册...

适用于 python 服务器的情况,不适用于 apache mod_wsgi: 默认静态文件位置是:“var/htdocs/static”。这可以被一个静态目录位置覆盖,例如apps/myapp/myapp/static/。这适用于 python webserver,但不适用于 wsgi/apache。 wsgi 除了默认目录之外什么都看不到.. 示例:http://localhost:8000/static/css/main.css 有效,但与 apache 相同的 url 无效。这个文件位于 myproject/apps/myapp/myapp/static/css/main.css 虽然默认的静态目录是 var/htdocs/static =)

据我了解,在 settings.py 中使用 StaticFiles 应用程序进行的覆盖

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BUILDOUT_DIR, 'var', 'htdocs', 'static')
STATICFILES_DIRS = (
  os.path.join(BUILDOUT_DIR, 'project', 'static'), # <-- why "project" and not "apps" I don't know X_X
)

也许这个不正确,我不知道,但使用 py-server 可以。 apache vhost 使用默认位置.. 并设置为“var/htdocs/static”。

也许问题出在 wsgi 脚本中?

#!/usr/local/bin/python2.6

import os,sys
sys.path[0:0] = [
    '/usr/local/lib/python2.6/site-packages/',
    '/www/webapp/visimes/eggs/PIL-1.1.7-py2.6-freebsd-8.1-RELEASE-amd64.egg',
    '/www/webapp/visimes/eggs/South-0.7.3-py2.6.egg',
    '/www/webapp/visimes/eggs/django_annoying-0.7.6-py2.6.egg',
    '/www/webapp/visimes/eggs/coverage-3.4-py2.6-freebsd-8.1-RELEASE-amd64.egg',
    '/www/webapp/visimes/eggs/django_debug_toolbar-0.8.4-py2.6.egg',
    '/www/webapp/visimes/eggs/django_extensions-0.6-py2.6.egg',
    '/www/webapp/visimes/eggs/django_test_utils-0.3-py2.6.egg',
    '/www/webapp/visimes/eggs/ipdb-0.3-py2.6.egg',
    '/www/webapp/visimes/eggs/ipython-0.10.1-py2.6.egg',
    '/www/webapp/visimes/eggs/djangorecipe-0.21-py2.6.egg',
    '/www/webapp/visimes/eggs/zc.recipe.egg-1.3.2-py2.6.egg',
    '/www/webapp/visimes/eggs/zc.buildout-1.5.2-py2.6.egg',
    '/www/webapp/visimes/eggs/BeautifulSoup-3.2.0-py2.6.egg',
    '/www/webapp/visimes/eggs/setuptools-0.6c12dev_r88795-py2.6.egg',
    '/www/webapp/visimes/parts/django',
    '/www/webapp/visimes',
    '/www/webapp/visimes/project', # <-- this one need for monitor.py which i put in there
    '/www/webapp/visimes/apps/portal', # <-- startapp.sh script some how forgot to add this dir, it's my default app dir, which must be generated with startapp.sh and added in here..
    ]

import djangorecipe.wsgi

if __name__ == '__main__':
    djangorecipe.manage.main('project.development')

os.environ['DJANGO_SETTINGS_MODULE'] = 'project.development'

import monitor
monitor.start(interval=1.0)

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

我自己添加了最后 4 行。因为我无法启动 apache .. 我猜 djangorecipe.wsgi 应该使用 staticFile 覆盖来处理其他所有事情.. 无论如何,如果你在 linux 或 mac 上,请检查那个包,然后自己尝试。它必须工作

ps。 (顺便说一下 bin/django 需要复制为 bin/django.wsgi 和 etc/apache.conf 是为 apache 生成的 vhost)

如果有人尝试使用 wsgi 手动启动这个“Starter”,我真的很高兴......那么你就会明白一切。=)

编辑:任何关于 WSGI 如何理解除了 django 设置的默认位置之外他需要在哪里搜索静态文件的信息,非常感谢 =)

【问题讨论】:

  • 您将 apache 配置中的别名指向 /your/path/to/static/? 中的服务器静态文件?
  • 这个呢? docs.djangoproject.com/en/dev/ref/contrib/staticfiles/… 这东西是怎么工作的?它可以从多个位置收集静态文件?
  • 再一次,如果您将别名添加到指向托管静态文件的位置的 Apache 配置,则 Apache(或任何其他网络服务器)只能提供静态文件。是的,您应该使用 collectstatic 命令将所有静态文件收集到一个位置(为了方便或 bcs。您不想将许多别名设置到不同的位置)。 staticfiles 应用程序主要用于帮助您在本地开发服务器上进行开发,而无需执行诸如 collectstatic 之类的操作或在服务器配置中添加别名。在生产环境中,唯一的用法是在模板中包含 STATIC_URL。
  • 请参阅docs.djangoproject.com/en/dev/howto/deployment/modwsgi/…,了解有关如何在生产中处理媒体/静态文件的更多信息。

标签: django mod-wsgi vhosts


【解决方案1】:

没有办法像 django 那样对 WSGI 进行某种覆盖。

django“manage.py collectstatic”中有一个很棒的命令,它将所有文件从 STATIC_DIR 列表(在 settings.py 中)放置到主静态目录中。事实上,这个命令只是从所有这些目录中复制文件,就是这样 =)

很高兴知道,当该目录中的任何文件将被更新时,我怎样才能使这种复制自动进行.. 与 monitor.py 相同,用于在修改源时自动重新加载 wsgi...

【讨论】:

    【解决方案2】:

    官方 mod_wsgi 网站上有很多文档可以帮助您了解如何使用它。这包括如何设置它以提供静态媒体文件。见:

    http://code.google.com/p/modwsgi/wiki/IntegrationWithDjango http://code.google.com/p/modwsgi/wiki/QuickConfigurationGuide http://code.google.com/p/modwsgi/wiki/ConfigurationGuidelines

    【讨论】:

      【解决方案3】:

      WSGI 无事可做来提供静态文件。这在 Django 部署文档中都有明确的介绍 - 正如 Torsten 在 cmets 中建议的那样,您需要将 Apache 指向您的静态文件,可能通过别名。

      我必须说,这个项目看起来很狡猾。手动向 sys.path 添加大量鸡蛋并不是正确的处理方式 - 更好的方法是使用 virtualenv 之类的东西,它会为您管理所有这些。

      【讨论】:

      • 怎么样?这是一个管理命令,可将您的静态文件收集到一个位置,然后由 Apache 直接提供服务。
      • 关于“手动” sys.path 的评论:不,这不是手动的,这是自动将其插入那里的构建。这是 buildout 实现类似 virtualenv 的隔离的方式。 (这种 sys.path 方法的优点是您不必激活 virtualenv,它都设置正确,这有助于在 apache/iis 中运行)。
      猜你喜欢
      • 2011-12-29
      • 2012-06-29
      • 2012-08-17
      • 2018-05-14
      • 2017-04-20
      • 1970-01-01
      • 2015-02-27
      • 2017-01-22
      • 1970-01-01
      相关资源
      最近更新 更多