Это простой 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()
При взгляде на этот код:
возникает несколько вопросов. Как функция make_server
может работать только с именем функции application
? Я не понимаю, как это делает что-то еще, а затем возвращает строку "<function application at 0x7f71686286e0>"
(application.__repr__() method
функционального объекта ).
Почему определение прикладной функции определяет environ
как аргумент, если он не используется внутри этой функции и даже не задается в вызове функции application
позже?
Насколько я понимаю, аргумент 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
)Кто-нибудь знает, где он используется? Находка, которая потенциально может ответить на все мои вопросы.