Колба рамки исходного кода чтения весь процесс
"" " App.run () , по существу , выполняется это run_simple (внутрибрюшинно, Host, Self) Атман текущая цель приложение приложение .__ call__ " ""
_request_ctx_stack = LocalStack () _app_ctx_stack = LocalStack () current_app = LocalProxy (_find_app) Запрос = LocalProxy (частичный (_lookup_req_object, " запрос " )) сессия = LocalProxy (частичный (_lookup_req_object, " Сессия " ))
DEF wsgi_app (Self, Environ, The start_response): # объект RequestContext, то , что содержит текущий запрос. = СТХ self.request_context (Environ) ошибка = Отсутствует Попробовать : Попробовать : # объект RequestContext, ctx.push, метод толчок выполняется RequestContext объект # СТХ помещен в местном ctx.push () # запроса и расширенной функции отклика ответ = self.full_dispatch_request () исключения того исключения , так как E: ошибка = E Response =self.handle_exception (е) , за исключением : # noqa: B001 ошибки = sys.exc_info () [1 ] повышение возврата ответа (окружать, start_response) , наконец : если self.should_ignore_error (ошибка): ошибка = None ctx.auto_pop (ошибка)
# 1 Мы self.request_context (окружать) исполнение: Так CTX является RequestContext (я, окружать) возвращаемое значение: DEF request_context (Self, Environ): # дождаться возвращения CTX является результатом RequestContext () исполнения. Возвращение RequestContext (Self, Environ) # 2 RequestContext (Self, Environ) Каковы результаты реализации? Является ли RequestContext объекта , который содержит reuqest информации , такие как класс RequestContext (Object): # App, Environ, CTX, является RequestContext объекта DEF __init__ (Self, приложение, Environ, Запрос = нет, сессия = None): Сам .app = App ЕСЛИ Запрос IS Нет: Запрос =app.request_class (Environ) self.request = запрос
# Метод 1 Нажмите метод ctx.push реализации объекта RequestContext: # Источник: DEF методом рассылки (самостоятельно): # Текущий самость объект RequestContext является CTX, _request_ctx_stack.push (Я) # 2 _request_ctx_stack, мы нашли это глобальный LocalStack () объекта. # _Request_ctx_stack.push (Self) является реализацией методы LocalStack толчка в и нажмите CTX , передаваемый в методе # _request_ctx_stack.push. CTX = Автономный # LocalStack толкающий Источник: DEF PUSH (Self, OBJ): RV = GetAttr (self._local, " Стек " , None) IF RV НЕ None: # Хранение [нити сопрограммная ID] [ "стек" ] = [] = RV = self._local.stack [] rv.append (объект) возвращение RV # выше коды self._local Локальных объектов используются для обеспечения безопасности данных. # Когда выполнение кода self._local.stack = RV = [], а затем Локальная структура хранения объекта: хранение [нить сопрограмма ID] [ "Стек"] = [] # rv.append (OBJ), хранение [нить сопрограмма ID] [ "стек"] = [OBJ], и потому , что OBJ = CTX, даже помещается в CTX Локальный объект. Структура , как местная (). Хранение [нить сопрограмма ID] [ "стек"] = [CTX]
# 1 # Это предложение обратиться к нам , чтобы выполнить расширение и функцию отклика # , а затем запросить продление и ответных действий , которые вы можете использовать запрос, и если он хочет добиться? из Колба Импорта Колбы, запрос, сессии App = Колба ( в __name__ ) DEF индекса (): Print (request.method) Печать (сессия) возвращение « OK » # таких , как выше кода request.method, как получить содержимое , связанное с запросом это? # 2 # мы увидим , что и запрос смысл? = Запрос LocalProxy (частичный (_lookup_req_object, « запрос » )) # Мы обнаружили , что объект запроса является LocalProxy. #Тогда мы должны быть в состоянии найти другой метод LocalProxy свойства, но обнаружили , нет, так как там нет, он должен написать __getattr__ # посмотреть __getattr__ источник: DEF __getattr__ (Self, имя): # request.method, имя теперь метод, ЕСЛИ имя == « __members__ » : возвращение реж (self._get_current_object ()) # теперь имя метода, результаты self._get_current_object () функция результатого выполнения на стороне # результатов частичной функции для получения метода, # частичных исполнение результат функции запроса. # etattr (Request, метод,) возвращение GetAttr (self._get_current_object (), имя) # 3 # мы смотрим на _get_current_object () Что является результатом выполнения? #self._get_current_object () Источник: DEF _get_current_object (Self): возвращение . Само __local () # выше self._get_current_object результата выполнения () само .__ локальный) результат выполнения ( # 4 # Само .__ Что такое местное? # Мы нашли это экземпляр я .__ местное время прошло, также местный, следующий код DEF __init__ (Self, местное, имя = None): # собственного .__ местного _LocalProxy__local = = частичный локальный (_lookup_req_object, "Запрос") # Домашняя .__ местного набора свойств , чтобы скрыть, Object. __setattr__ (Self, " _LocalProxy__local " , местный) #.__ = местный местное самоуправление # локальный экземпляр передаются. Мы экземпляр этого LocalProxy (частичный (_lookup_req_object "Request")) # наш Самостоятельно .__ = местные = self._get_current_object локальный = частичный (_lookup_req_object, "Запрос") # 5 # , что в конечном счете , мы понимаем: DEF __getattr__ (Self, имя ): # request.method, название теперь метод, IF имя == " __members__ " : возвращение реж (self._get_current_object ()) возвращение GetAttr (self._get_current_object (), имя) # self._get_current_object результат выполнения () частичный (_lookup_req_object, «запрос») результатов. #Является ctx.request, так GetAttr (self._get_current_object (), имя) , соответствующее GetAttr (ctx.request, метод) # 6. # Частичный (_lookup_req_object, "Запрос") () результат выполнения # _lookup_req_object кода следующим образом : DEF _lookup_req_object (имя): # имя здесь «Запрос» сверху = _request_ctx_stack.top # кто сверху? Является CTX. IF Top ЯВЛЯЕТСЯ Нет: Рейз RuntimeError (_request_ctx_err_msg) # Top внутри , чтобы найти запрос, а именно топ = CTX - «CTX найти внутри запроса. Возврат GetAttr (Top, имя) # 7 #А поскольку объект _request_ctx_stack LocalStack () объекта, так _request_ctx_stack.top выполняется LocalStack () в верхней части: # _request_ctx_stack.top Источник: @property DEF Top (Self): Попробовать : # хранение [нить ассоциации Ченг ID] [ "Стек"] = [СОЕ] # теперь верхнего значение Retrun СОГО возврата self._local.stack [-1 ] исключение того (AttributeError, IndexError): возвращение Отсутствует # коды self._local Локальных объектов, Местный является объектом нашего времени существования CTX.