<p>好吧,对于你的问题,一个不那么合理的答案是关于mod\wsgi如何与你的应用程序接口。典型的flask应用程序如下所示:</p>
<pre><code>from flask import Flask
app = Flask(__name__)
app.route("/")
def hello():
return "Holy moly that tunnel was bright.. said Bit to NIC"
if __name__ == "__main__":
app.run()
</code></pre>
<p>不幸的是,Apache无法知道如何处理这个问题(尽管应用程序可以自己运行得很好)。为了让app和Apache更好地结合在一起,我们将使用mod wsgi。Mod_WSGI所做的对我们很重要,它提供了一个已知的接口(一个名为WSGI的文件类型),它将包装我们的应用程序并对其进行初始化,这样我们就可以通过Apache为它提供服务。在</p>
<p>我假设您使用的是python虚拟环境,但是如果您没有使用,您可以在下面的说明中省略处理这个问题的步骤。如果您想知道虚拟环境为什么这么好,<a href="http://mirnazim.org/writings/python-ecosystem-introduction/" rel="nofollow">feel free read about the python ecosystem</a>。在</p>
<p>另外-您可以包含一个额外的标志(假设您将wsgi作为守护进程运行),以便在您<code>touch</code>或更改wsgi文件时自动重新加载守护进程。这在开发和调试期间非常有用,因此我将在下面介绍。在</p>
<p>不管怎样,我们开始吧。我将把这个分解成下面的步骤。在</p>
<h2>配置Apache mod</h2>
<ol>
<li>在Apache中启用mod\u wsgi:
<ul>
<li><code>sudo apt-get install libapache2-mod-wsgi</code></li>
</ul></li>
<li><p>编辑您的<code>/etc/apache2/sites-available/<yoursite>.conf</code>。在</p>
<pre><code><VirtualHost interface:port>
WSGIDaemonProcess yourapp user=someUser processes=2 threads=15
WSGIProcessGroup yourapp
# In this case / refers to whatever relative URL path hosts flask
WSGIScriptAlias / /absolute/path/to/yourapp.wsgi
<Directory /path/to/your/main/py/file/ >
# Use good judgement here when server hardening, this assumes dev env
Order allow,deny
Allow from all
Require all granted
#The below enables 'auto-reload' of WSGI
WSGIScriptReloading On
</Directory>
# If you want to serve static files as well and bypass flask in those cases
Alias /relative/url/to/static/content/
<Directory /absolute/path/to/static/root/directory/>
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
</code></pre></li>
<li><p>创建您的你的app.wsgi文件并放在适当的地方:<em>小心文件权限!</em></p>
<pre><code>#!/usr/bin/python
import sys
import logging
# Activate virtual environment.
# If you are not using venv, skip this.
# But you really should be using it!
activate_this = "/path/to/venv/bin/activate_this.py"
execfile(activate_this, dict(__file__=activate_this))
# Handle logging
logging.basicConfig(stream=sys.stderr)
sys.path.insert(0, "/path/to/your/main/py/file/")
from YourMainPyFileName import app as application
application.secret_key = "your_secret_key"
</code></pre></li>
<li><p>重新加载Apache并解决问题。我可能每隔几周就为一个不同的项目或想法设立这个项目。。。从零开始做的时候,我通常要修理一件或另一件事。但不要绝望!<a href="http://flask.pocoo.org/docs/0.10/deploying/mod_wsgi/#configuring-apache" rel="nofollow">Flask has great documentation on this</a>。</p></li>
</ol>
<p>一旦你完成了所有这些,你应该在一个地方,烧瓶自己运行。上面的示例flask应用程序是我在设置此程序时用来验证一切工作正常的实际代码。在</p>
<hr/>
<p><strong>这里留着,以防有用,但与问题没有直接关系…</strong></p>
<p>这里的答案是使用x-send-file。这充分利用了让Apache做它擅长的事情(提供静态内容),同时首先让flask(或其他python框架)先做它的工作。我经常这样做是为了让flask在单页web应用程序中处理我的auth层,到目前为止,我对结果很满意。在</p>
<p>这样做需要两件事:</p>
<p>首先-在Apache2上启用xsendfile<code>sudo apt-get install libapache2-mod-xsendfile</code>。在</p>
<p>第二步-更改apache2配置,以便允许x-send-file头:</p>
<p>{并在cd3>中添加文件}。。。在</p>
<ul>
<li><code>XSendFile On</code></li>
<li><code>XSendFilePath /path/to/static/directory</code></li>
</ul>
<p><em>这可以在<code><Virtualhost></Virtualhost></code>标记的顶层输入。</em></p>
<p>别忘了重启Apache <code>sudo service apache2 restart</code>。在</p>
<p>最后-配置你的flask应用程序在你的应用程序副本文件:</p>
<p><code>app.user_x_sendfile = True</code></p>
<p><em>注意:必须在应用程序初始化后完成。因此也可以作为初始化参数传递。</em></p>
<p><a href="http://flask.pocoo.org/docs/0.10/api/#flask.Flask.use_x_sendfile" rel="nofollow">Flask has documentation on this</a>(节选如下):</p>
<blockquote>
<p><strong>use_x_sendfile</strong></p>
<p>Enable this if you want to use the X-Sendfile feature. Keep in mind that the server has to support this. This only affects files sent with the send_file() method.</p>
<p><em>New in version 0.2.</em></p>
<p><em>This attribute can also be configured from the config with the USE_X_SENDFILE configuration key. Defaults to False.</em></p>
</blockquote>