Saleor Django Apache mod_wsgi不会提供/ static / admin /

时间:2015-12-11 20:32:19

标签: python django apache mod-wsgi

我正在使用apache作为非特权用户使用virtualenv运行saleor django应用程序。

实际上让一切都进行起来相当简单,但有一点令我感到困惑。

未提供网站的/ static / admin /部分。

我查看了deployment docsother advice,但到目前为止找不到任何帮助。

我的/ static /目录服务很好。我确信这对非django-noob来说非常明显,但那就是我。我不确定它是另一个别名目录中的子目录别名的copacetic。我宁愿不诉诸符号链接。

# dev-site.conf

WSGIPythonPath/home/admin/project/saleor:/home/admin/project/venv/lib/python2.7/site-packages

<VirtualHost *:80>
        ServerName example.com
        ServerAdmin email@example.com
        DocumentRoot "/home/admin/project"

        WSGIDaemonProcess example.com python-path=/home/admin/project/saleor:/home/admin/project/venv/lib/python2.7/site-packages
        WSGIProcessGroup example.com
        WSGIScriptAlias / /home/admin/project/saleor/wsgi.py

        Alias /media/ /home/admin/project/media/
        <Directory /home/admin/project/media/>
                Require all granted
        </Directory>

        Alias /favicon.ico /home/admin/project/saleor/static/images/favicon.ico
        Alias /robots.txt /home/admin/project/saleor/static/robots.txt
        Alias /static/ /home/admin/project/saleor/static/
        <Directory /home/admin/project/saleor/static/>
                Require all granted
        </Directory>

        Alias /static/admin/ /home/admin/project/venv/lib/python2.7/site-packages/django/contrib/admin/static/admin/
        <Directory /home/admin/project/venv/lib/python2.7/site-packages/django/contrib/admin/static/admin/>
                Require all granted
        </Directory>

        <Directory /home/admin/project>
                <Files wsgi.py>
                        Require all granted
                </Files>
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

我将我的saleor / wsgi.py包含在smarts中。

# wsgi.py

python

import os
import sys
import site

site.addsitedir("/home/admin/project/venv/lib/python2.7/site-packages")
os.environ.setdefault("SECRET_KEY", "br549")
os.environ.setdefault("MYSQL_DB_URL", "mysql://dbuser:doublesecret@dbuser-dev.example.com:3306/saleor")
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "saleor.settings")

project = "/home/admin/project/saleor"
workspace = os.path.dirname(project)
sys.path.append(workspace)

from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

2 个答案:

答案 0 :(得分:0)

您不应该尝试让Apache直接从您自己的应用程序或管理应用程序的静态目录中提供服务。相反,请按照文档并使用collectstatic命令在一个位置收集所有应用程序的静态文件,然后从那里提供服务。

答案 1 :(得分:0)

我不理解serving the admin filesdjango-admin collectstatic上的文档。

提供管理文件的文档表明,如果在settings.py的INSTALLED_APPS部分中启用了“django.contrib.staticfiles”,则建议settings.py中的STATICFILES_DIRS列表包含“ django为它的开发服务器提供的静态“目录(django / contrib / admin / static / admin)。

有人告诉我们使用collectstatic管理命令,该命令将文件物理地复制到您将在sitename.conf文件中配置为ServerRoot的“静态”目录中,以便为其提供服务。

我的问题几乎是一个菜鸟错误。我按照说明操作,却不知道有什么实际用于运行“collectstatic”命令的知识。

而不是

django-admin collecstatic

需要(在我的情况下,ymmv)

python manage.py collectstatic

当使用django-admin调用collectstatic时,我遇到了令人抓狂的错误:

ImportError: No module named saleor.settings

这对我来说非常困惑,因为我在我的.env文件和我的wsgi.py文件中设置了enivronment变量。我认为这可能是与virtualenv的某种怪癖。在命令行上设置此变量导致:

django.core.exceptions.ImproperlyConfigured: Requested setting INSTALLED_APPS, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.

这导致了我非常恶心的兔子洞。我的virtualenv设置和我编辑过的每个配置文件。幸运的是,他们很好。实际调用是

$ python manage.py collectstatic

You have requested to collect static files at the destination
location as specified in your settings:

    /home/admin/project/static

This will overwrite existing files!
Are you sure you want to do this?

Type 'yes' to continue, or 'no' to cancel:

然后将我需要的东西(我希望!)神奇地复制到我的项目/静态目录中。

我的noob错误不是先读django-admin and manage.py,因此发现便利脚本有一个便利脚本。 边敲击

另一点困惑(对我而言,无论如何)是一个断言,即不应该从“app”或“admin app”提供静态文件。我想一个更简单的方法是:“必须运行一个脚本,它可以包装或复制rsync,从而复制静态文件来自myapp / static和〜/ project / venv / lib / python2.7 / contrib / admin所以apache将无法播放重要文件的愚蠢错误“。这并不意味着没有在sitename.conf文件中放置/ static /的路径。这里没有魔法,只是复制静态文件。

因此:

WSGIPythonPath /home/admin/project/saleor:/home/admin/project/venv/lib/python2.7/site-packages

<VirtualHost *:80>
        ServerName example.com
        ServerAdmin email@example.com
        DocumentRoot "/home/admin/project"

        Alias /media/ /home/admin/project/media/
        <Directory /home/admin/project/media/>
                Require all granted
        </Directory>

        Alias /static/ /home/admin/project/static/
        <Directory /home/admin/project/static/>
                Require all granted
        </Directory>

        WSGIDaemonProcess example.com python-path=/home/admin/project/saleor:/home/admin/project/venv/lib/python2.7/site-packages
        WSGIProcessGroup example.com
        WSGIScriptAlias / /home/admin/project/saleor/wsgi.py

        <Directory /home/admin/project>
                <Files wsgi.py>
                        Require all granted
                </Files>
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

我现在从〜/ project / static /目录中提供静态文件!

/我擦掉汗水。

谢谢丹尼尔!