В приложении Python не удается найти, откуда берется элемент

#python #web2py

#python #web2py

Вопрос:

Я пытаюсь понять, как работает веб-фреймворк web2py, и есть этот вызываемый элемент request.client access.py , который я не могу понять, откуда он взялся. Я извлек код отсюда, и он начинается следующим образом:

 import base64
import os
import time
from gluon.admin import apath
from gluon.fileutils import read_file
from gluon.utils import web2py_uuid
from pydal.contrib import portalocker
# ###########################################################
# ## make sure administrator is on localhost or https
# ###########################################################


http_host = request.env.http_host.split(':')[0]
  

Мой вопрос: когда мы не знаем, откуда в коде появляется элемент, каков способ его найти?

Комментарии:

1. Посмотрите документацию библиотеки. В каждой законной библиотеке он будет.

2. вы пытались вызвать >>> справка (запрос.client)? вы можете найти там полезную информацию.

Ответ №1:

Как объясняется здесь, файлы модели, контроллера и представления web2py выполняются платформой в среде, которая уже заполнена основными объектами API, включая request , response , session , cache , DAL Field , HTML-помощников и средства проверки формы (другие части API, такие как Auth, Mail, Services, Scheduler,и многие дополнительные инструменты и внесенные библиотеки содержатся в модулях и импортируются как обычно).

В частности, request объект создается (при каждом запросе) внутри основного приложения WSGI (gluon.main.wsgibase) в этой строке, и впоследствии он передается в gluon.main.serve_controller в этой строке. serve_controller Функция добавляет request объект в среду выполнения, а затем выполняет файлы модели, контроллера и просмотра в этой среде.

В дополнение к файлам модели, контроллера и представления ваше приложение может включать свои собственные модули. Модули в приложениях не выполняются платформой (они должны быть импортированы) — следовательно, эти модули должны получать доступ к объектам API ядра web2py посредством импорта из gluon (объекты, зависящие от запроса, такие как request и response , доступны через current локальный объект потока, как описано здесь ).

Также может быть полезно просмотреть разделы документации о рабочем процессе, библиотеках и среде выполнения.

Ответ №2:

Файл, на который вы ссылаетесь, access.py , request впервые упоминает имя в строке 13:

 http_host = request.env.http_host.split(':')[0]
  

Этот символ, request , не import редактируется ниоткуда. Это неортодоксальный способ написания программ на Python в целом, и по отдельности это выглядит невозможным. Но это возможно, если символ request был добавлен в глобальную рабочую область этого файла каким-либо другим файлом, который завершает выполнение access.py . Вот минимальный пример:

 d = { 'request' : some_object() }
execfile( 'access.py', d )  # run the named file using d as its global workspace
  

Итак, в данном конкретном случае способ исследования — найти файл, который выполняется access.py .

[ В ответ на ваш комментарий об изучении каждого файла в библиотеке: для такого анализа и в целом для улучшения качества жизни программиста вам понадобится какой-нибудь инструмент, который может искать определенную строку во всей иерархии файлов (например, инструмент командной строки grep в Linux иmacOS или, как и многие сторонние текстовые редакторы и IDE в Windows, но не вечно ненадежная функция Windows «Search», которая утверждает, что может это сделать). ]

В ответ на ваш более общий вопрос о поиске того, откуда берутся вещи: В других ответах и комментариях упоминаются такие атрибуты, как __file__ и / или __module__ . Это может помочь, если у вас есть способ заставить ваш код выдавать отладочную информацию. Поскольку вы работаете с неконсольной (веб-) платформой, это может быть нетривиально, но одним из быстрых и грязных способов может быть вставка строки, подобной этой, в access.py :

 open('some_temporary_file_somewhere.txt', 'wt').write('n'.join([
    repr( request ),
    request.__module__,
    request.__class__,
])
  

Это должно дать вам подробную информацию о том, где request был определен класс (но не обязательно имя файла, в котором request был создан фактический экземпляр с именем).

Ответ №3:

При попытке выяснить, как элемент был импортирован в Python, вам нужно посмотреть на явные import инструкции в интересующем файле. В хорошо написанном коде это будет очевидно.

Если вы импортируете интересующий объект в оболочку python, вы можете использовать .__file__ атрибут для поиска файла байт-кода, из которого был импортирован этот объект. Существуют и другие подобные атрибуты, которые могут оказаться полезными, например

 .__name__
.__path__
.__package__
  

Если вы используете IPython, что настоятельно рекомендуется, вы можете легко получить список этих методов двойного подчеркивания, введя <obj>.__ и нажав tab.

Глядя на файл, который вы связали, я не уверен, где request был импортирован. client , хотя, является атрибутом request объекта.

Комментарии:

1. Извините, но ваши предложения мне совсем не помогают, я ищу метод, который нацелен на источник элемента, я мог бы проверить все библиотеки, упомянутые в импорте, но это не очень умно, не так ли?