除了“/”之外的 Python Flask 路由使用带有 nginx 和 uwsgi 的 virtualenv 给出 404s

jbl*_*bll 5 python nginx virtualenv flask uwsgi

我有一个简单的 Flask 应用程序,我试图在 nginx 和 uwsgi 后面运行它。当我使用 Flask 的开发服务器运行应用程序时,一切都按预期工作。我将浏览器指向 localhost:5000 和 localhost:5000/hello 并看到“嗨!” 和“你好!”,分别。

但是当我尝试使用 uwsgi 和 nginx 运行应用程序时,我可以看到“/”处的路由就好了,即,我看到“嗨!” 在本地主机上:8181。但是我在 localhost:8181/hello 处收到“/hello”路由的 404 Not Found。对于我尝试添加到应用程序的任何路径,我都会收到 404,而不仅仅是“/”。

我的应用程序的文件夹结构如下所示:

my_app/
    app/
        __init__.py
    venv/
    app.py
    uwsgi.xml
Run Code Online (Sandbox Code Playgroud)

哪里__init__.py简单:

import os
import sys
from flask import Flask, render_template

app = Flask(__name__)

@app.route('/hello')
def hello():
    return 'Hello!'

@app.route('/')
def hi():
    return 'Hi!'
Run Code Online (Sandbox Code Playgroud)

app.py 是:

from app import app
from flask import Flask

if __name__ == '__main__':
    app.run(host='0.0.0.0')
Run Code Online (Sandbox Code Playgroud)

uwsgi.xml:

<uwsgi>
    <plugin>python27</plugin>
    <socket>127.0.0.1:4141</socket>
    <master/>
    <processes>4</processes>
    <harakiri>60</harakiri>
    <reload-mercy>8</reload-mercy>
    <cpu-affinity>1</cpu-affinity>
    <stats>/tmp/stats.socket</stats>
    <max-requests>2000</max-requests>
    <limit-as>512</limit-as>
    <reload-on-as>256</reload-on-as>
    <reload-on-rss>192</reload-on-rss>
    <venv>/PATH/TO/my_app/venv</venv>
    <no-orphans/>
    <vacuum/>
    <enable-threads/>
</uwsgi>
Run Code Online (Sandbox Code Playgroud)

以及我的nginx.conf的相关内容:

upstream uwsgi_host4 {
    server 127.0.0.1:4141;
}

server {
    listen 8181;
    server_name localhost;
    root /PATH/TO/my_app;

    location / {
        set $app app;
        uwsgi_pass uwsgi_host4;
    }
}
Run Code Online (Sandbox Code Playgroud)

我一整天都被困在这个问题上,不禁认为答案是显而易见的。任何帮助将不胜感激!

**~ ~更新~ ~**

似乎是 virtualenv 的问题。如果我在 virtualenv 之外运行 uwsgi 命令并<venv></venv>从 uwsgi.xml 中删除该行,则一切正常。但是,uwsgi 说它使用的是 Python 3.3,这是我机器的默认值;我需要使用 virtualenv 的一个原因是我可以使用 2.7。

如果我使用<venv></venv>文件中的行在virtualenv 之外运行 uwsgi ,我会收到错误消息ImportError: No module named 'encodings'

如果我在激活 virtualenv 后运行 uwsgi,我会得到上述结果(除 '\' 以外的路由为 404s)