请参阅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来实现一个问候世界,以便我能够理解框架在做得更好。
答案 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