Python + Apache: WSGIPythonPath相对路径

0 投票
1 回答
2848 浏览
提问于 2025-04-29 03:30

我在Windows上设置一个Flask应用程序。在我的httd.conf文件中,我包含了一个应用程序的配置文件,这个文件位于这样的目录中:

C:\prod\apps\my_app\
                    \my_app
                        my_app.conf
                        my_app.py
                        my_app.wsgi
                    \my_service
                    \my_data
                    \my_python_virtual_env

我可以在Apache中配置这个应用,并且使用绝对路径来设置my_app.conf中的WSGIPythonPath,这样一切运行得很好。但是,我无法使用相对路径来设置WSGIPythonPath让它工作。我本以为,根据上面的结构,它应该像这样:

WSGIPythonPath ../my_app;../my_service;../my_data;../my_python_virtual_env
<Directory "/">
    Require all granted
</Directory>

但是,Apache并没有按照我想的那样理解这些相对路径的根目录。我想知道我尝试的这个方法是否可行,如果不行,有没有其他建议可以让我实现这个目标?如果能为不同的环境使用一个配置文件,那就太好了。

暂无标签

1 个回答

1

你需要多了解一下 WSGImodwsgi 是怎么和 Apache 一起工作的,以及一些最佳实践。

首先,你应该在一个独立的 virtualenv 环境中构建你的 Flask 应用。这是任何基于 Python 的网页应用(无论是 Flask、Django 还是其他)的最佳做法。使用 pip 来管理你的软件包。搜索这两个词,你会找到很多教程教你怎么做。

接下来,你应该把 Flask 应用的配置放在 Apache 的一个命名虚拟主机上,并指定一个专用的端口。你需要确保你的 WSGIDaemonProcess 包含指向 Flask 的 site-packages 的虚拟环境特定的 python-path 变量。

你还应该创建一个系统 Flask 用户和组,以便将 Flask 系统与其他部分隔离开来。这样做会更安全。

下面是一个示例配置。注意我创建了一个特定的 flask-main 用户和 flask-main 组,并且我把所有流量指向我的 Flask 应用的端口设置为 8789。

#####
# START: Flask App
WSGISocketPrefix /var/run/wsgi
Listen 8789    
NameVirtualHost *:8789
<VirtualHost *:8789>
    DocumentRoot /path/to/www/
    ErrorLog "/path/to/logs/httpd/flask-8789-error_log"
    LogLevel info 
    ProxyRequests Off
    WSGIDaemonProcess flask-main user=flask-main group=flask-main display-name=%{GROUP} python-path=/path/to/www:/path/to/lib/python2.6/site-packages
    WSGIProcessGroup flask-main
    WSGIScriptAlias / /path/to/www/mygateway.wsgi process-group=flask-main application-group=%{GLOBAL}
    <Directory /path/to/www>
        WSGIProcessGroup run
        WSGIApplicationGroup %{GLOBAL}
        Order deny,allow
        Allow from all
    </Directory>
    <Directory /path/to/www/static>                                                        
        Order deny,allow
        Allow from all
    </Directory>
</VirtualHost>

希望这些能帮助你朝着正确的方向前进。

撰写回答