Почнемо з питання: коли 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