我最近一直在努力学习WSGI以及Web如何处理Python。所以我一直在阅读Werkzeug和PEP333来学习。
然而,我遇到了一个小问题,我认为我理解但可能没有,所以我很感激你的指导正确。
PEP333声明:
应用程序对象只是一个可调用的对象,它接受两个 参数。 “对象”一词不应被误解为要求 一个实际的对象实例:一个函数,方法,类或实例 调用方法都可以用作应用程序对象。 应用程序对象必须能够多次调用,如 几乎所有服务器/网关(CGI除外)都会这样做 重复请求。
实施:
class AppClass:
"""Produce the same output, but using a class
(Note: 'AppClass' is the "application" here, so calling it
returns an instance of 'AppClass', which is then the iterable
return value of the "application callable" as required by
the spec.
If we wanted to use *instances* of 'AppClass' as application
objects instead, we would have to implement a '__call__'
method, which would be invoked to execute the application,
and we would need to create an instance for use by the
server or gateway.
"""
def __init__(self, environ, start_response):
self.environ = environ
self.start = start_response
def __iter__(self):
status = '200 OK'
response_headers = [('Content-type', 'text/plain')]
self.start(status, response_headers)
yield "Hello world!\n"
我的问题只是澄清我是否理解正确。
它声明AppClass是应用程序,当我们调用它时,它返回一个AppClass实例。但是进一步指出'如果我们想要使用AppClass ass应用程序对象的实例,那么这就是说当WSGI的服务器端调用AppClass对象时,只有一个实例在运行吗?
例如。服务器可以向应用程序发出多个请求(200 OK)以获得更多响应,因此 iter 被放入类中。但是每个请求都运行在同一个单一的AppClass实例中,每个对服务器的请求基本上都没有实例化AppClass的多个实例?
对不起,如果这是长篇大论,如果我没有多大意义,请再次道歉。我正在努力提高自动量。
一如既往地欣赏您的输入。
感谢。
答案 0 :(得分:1)
服务器技术将为每个请求调用app
(在本例中为类AppClass
,从而导致对象构造)。这是因为每个请求都有一个可能唯一的environ
。
关于这一点的巧妙之处在于它并不意味着你的app
必须是一个类,我经常发现将我的wsgi应用程序(或中间件)定义为返回函数的函数是有用的: / p>
# I'd strongly suggest using a web framework instead to define your application
def my_application(environ, start_response):
start_response(str('200 OK'), [(str('Content-Type'), str('text/plain'))])
return [b'hello world!\n']
def my_middleware(app):
def middleware_func(environ, start_response):
# do something or call the inner app
return app(environ, start_response)
return middleware_func
# expose `app` for whatever server tech you're using (such as uwsgi)
app = my_application
app = my_middleware(app)
另一种常见模式涉及定义对象以存储构造一次的一些应用程序状态:
class MyApplication(object):
def __init__(self):
# potentially some expensive initialization
self.routes = ...
def __call__(self, environ, start_response):
# Called once per request, must call `start_response` and then
# return something iterable -- could even be `return self` if
# this class were to define `__iter__`
...
return [...]
app = MyApplication(...)
对于PEP333,我建议改为阅读PEP3333 - 它包含的信息基本相同,但澄清了整个数据类型。
答案 1 :(得分:1)
有关可以实现WSGI应用程序对象的各种方法的背景知识,请阅读此主题的博客文章。
我还建议阅读以下内容,其中讨论了Python Web服务器的一般工作方式。
除非你真的有需要,否则你可能只想使用一个框架。避免尝试使用WSGI从头开始编写任何内容。