Шаблон для избавления от импорта в модулях, как в контроллерах web2py
Я новичок в web2py и python. Я пишу пример приложения блога в этой структуре. Я хочу разделить бизнес-логику, которая вызывается в каждом методе контроллера, на его собственный модуль, и нашел этот пример полезным:
- http://www.web2pyslices.com/slice/show/1478/using-modules-in-web2py
- Очистка web2py моих контроллеров
Как видите, вам нужно импортировать объекты в модули или устанавливать их через globals.current. Контроллер может ссылаться на экземпляры "db" и "request" (например) без какого-либо импорта. Какой механизм кодирования делает это возможным в контроллере, но не в другом месте?
2 ответа
Нашел ответ: Похоже, как работает web2py, компилируя код на python для контроллеров, моделей и представлений на лету. Он запускает их в своей особой "среде". Связанные фрагменты кода:
https://github.com/web2py/web2py/blob/master/gluon/main.py В приведенном выше файле посмотрите на: build_environment, run_models_in, run_controller_in functions (ниже):
- https://github.com/web2py/web2py/blob/master/gluon/compileapp.py
- https://github.com/web2py/web2py/blob/master/gluon/compileapp.py
- https://github.com/web2py/web2py/blob/master/gluon/compileapp.py
Которые запускают код Python в "ограниченной" среде:
Фреймворк web2py делает много закулисных работ, чтобы сделать все эти вещи доступными. Например, когда вы переходите по URL-адресу, такому как host/app/controller, этот контроллер вызывается web2py (начиная с чего-то в web2py.py), который обрабатывает импорт модулей web2py, предоставляет объекты запроса / ответа и т. Д.
Вещи, размещенные в модулях, предназначены для автономного кода Python, не обязательно специфического для web2py.