Путаница с простым сервером python wsgi (wsgiref.simple _server)

Это простой wsgi-сервер Python, который выводит Hello guys!!!на 0.0.0.0:8080.

from wsgiref.simple_server import make_server

content = 'Hello guys!!!'

def application(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/plain')])
    return [content]

server = make_server('0.0.0.0', 8080, application)
server.serve_forever()

При взгляде на этот код:

  1. возникает несколько вопросов. Как функция make_serverможет работать только с именем функции application? Я не понимаю, как это делает что-то еще, а затем возвращает строку "<function application at 0x7f71686286e0>"(application.__repr__() methodфункционального объекта ).

  2. Почему определение прикладной функции определяет environкак аргумент, если он не используется внутри этой функции и даже не задается в вызове функции applicationпозже?

  3. Насколько я понимаю, аргумент start_responseв определении функции используется здесь как своего рода идентификатор, что это будет имя функции, которая устанавливает другие свойства, необходимые позже в вызове функции make_server. Где эта функциональность определена в стандартной библиотеке?(Я проверил источник соответствующих модулей, но я не понимаю, где именно это делается)

Наблюдения :Изменение аргумента environв определении функции ничего не меняет в поведении кода, однако аргумент start_responseдолжен иметь то же имя, что и start_responseв теле функции application..

Я знаю, что os.environ— это словарь, но я не могу найти, где он вызывается в стандартной библиотеке Python. Если аргумент environнеобходим и является единственным жизнеспособным первым аргументом, я не понимаю, почему они требуют, чтобы вы явно называли первый аргумент(environ)каждый раз это дает вам иллюзию того, что использование другого аргумента влияет на его поведение. Я знаю о политике Python «лучше явно, чем неявно» -, но здесь я думаю, что это бесполезно и сбивает с толку.

Изменить

Из-за ответа Неда я теперь понимаю, глядя на источник, что make_server('0.0.0.0', 8080, application)создает экземпляр WSGIServer, такой как wsgiref.simple_server.WSGIServer((host, port), handler_class)). Посмотрев глубже, я обнаружил, что метод инициализации унаследован от BaseServer. Экземпляры BaseServer имеют server_addressи RequestHandlerClassв качестве переменных экземпляра среди прочих. Функциональный объект applicationхранится в переменной класса applicationдля WSGIServer.

Но я все еще не могу найти, где еще эта переменная класса applicationиспользуется где-то в исходном коде python. (Я просмотрел все модули, содержащие определения классов родительских классовWSGIServer)Кто-нибудь знает, где он используется? Находка, которая потенциально может ответить на все мои вопросы.

5
задан Bentley4 13 July 2012 в 14:49
поделиться