PEP-3333显示了simple_app示例,但uwsgi需要应用程序

时间:2014-03-07 18:32:25

标签: python nginx wsgi

请参阅PEP-3333的“应用程序/框架方面”部分。

它要求我创建一个具有simple_app功能的模块。所以我在/www/app.py中写了这段代码:

def simple_app(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return [b'<p>Hello World</p>']

然后我在/ etc / nginx / sites-enabled中为我的网站添加了一个文件。

server {
    listen 8080;
    root /www;
    index index.html index.htm;
    server_name foo;
    location / {
        uwsgi_pass 127.0.0.1:9090;
    }
}

然后我以这种方式启动了我的uwsgi服务器:

uwsgi --socket 127.0.0.1:9090 --wsgi-file /www/app.py

最后,我重新启动了nginx并访问了我的网站,我收到了“内部服务器错误”。

在uwsgi日志中,我看到了这个错误:

--- no python application found, check your startup logs for errors ---

如果我将模块中的simple_app重命名为application,一切正常。

我的问题是:如果函数必须命名为application才能被WSGI服务器识别,那么为什么PEP-3333会建议simple_app?如果我误解了PEP-3333,如果它确实要求我们定义application可调用,你能不能引用该文件?

顺便说一句,我知道应该使用一个框架来进行Python Web开发,但我只是想让一个hello world程序使用裸WSGI。我觉得我应该总是知道如何单独使用WSGI来实现一个问候世界,以便我能够理解框架在做得更好。

1 个答案:

答案 0 :(得分:3)

PEP定义您应该创建可调用,并且不规定它应该使用的名称。名称simple_app()只是一个示例名称;下面是另一个使用名为AppClass的类的示例。

此外,在PEP的Application Configuration section中指出:

  

此规范未定义服务器如何选择或获取要调用的应用程序。这些和其他配置选项是高度特定于服务器的事项。预计服务器/网关作者将记录如何配置服务器以执行特定的应用程序对象,以及使用哪些选项(例如线程选项)。

需要将每个WSGI服务器配置为加载可调用对象,但通常它们具有默认值。 uwsgi查找名为application的对象作为其默认值。

您可以使用callable option告诉uwsgi查找其他名称:

  

参数:字符串默认:应用

     

设置默认的WSGI可调用名称。

对于你的例子:

uwsgi --socket 127.0.0.1:9090 --wsgi-file /www/app.py --callable simple_app