Почнемо з питання: коли Django насправді завантажує всі ті модулі, які ви імпортуєте?
Чи завжди це відбувається через лінійне завантаження? Якщо так, то чому ми отримуємо повідомлення в Sentry у всіх API, навіть якщо ми використовуємо пакети лише в конкретному API?
Ми розглянемо завантаження модулів в Django, використовуючи бібліотеку imgkit як приклад.
Коли ви запускаєте Django-застосунок, чи то через сервер розробки (python manage.py runserver), чи через виробничий сервер, такий як uWSGI, Django проходить через процес ініціалізації. Під час цього процесу воно завантажує різні модулі, включаючи ті, що належать до ваших встановлених додатків.
Згенеровано AI
Імпорти на рівні модуля
Розглянемо приклад, коли ми імпортуємо модуль imgkit на рівні модуля:
# image_helper.py
import imgkit
class ImageHelper(object):
@staticmethod
def generate_image_from_html(html_content, output_path):
options = {
'format': 'png',
'encoding': "UTF-8",
}
imgkit.from_string(html_content, output_path, options=options)
У цьому випадку модуль imgkit імпортується, коли Django завантажує файл image_helper.py, що зазвичай відбувається під час запуску додатку. Якщо модуль imgkit не встановлений, ви отримаєте помилку ImportError, коли Django намагатиметься запустити додаток, що може перешкодити його запуску.
Лог uWSGI
Імпорти на рівні методу
Тепер розглянемо альтернативний підхід, коли ми імпортуємо imgkit на рівні методу:
# image_helper.py
class ImageHelper(object):
@staticmethod
def generate_image_from_html(html_content, output_path):
import imgkit
options = {
'format': 'png',
'encoding': "UTF-8",
}
imgkit.from_string(html_content, output_path, options=options)
У цьому випадку модуль imgkit імпортується лише тоді, коли викликається функція generate_image_from_html. Це означає:
- Додаток може стартувати, навіть якщо
imgkitне встановлений. (усі інші API працюватимуть, окрім тих, що використовуютьgenerate_image_from_html) - Ви отримаєте
ImportErrorлише якщо хтось спробує використати функціюgenerate_image_from_html. - Це дозволяє мати більш детальну обробку помилок і потенційно швидший старт додатка.
Перекладено з: An Introduction to Module Loading in Django