Вступ до завантаження модулів у Django

Почнемо з питання: коли Django насправді завантажує всі ті модулі, які ви імпортуєте?

Чи завжди це відбувається через лінійне завантаження? Якщо так, то чому ми отримуємо повідомлення в Sentry у всіх API, навіть якщо ми використовуємо пакети лише в конкретному API?

Ми розглянемо завантаження модулів в Django, використовуючи бібліотеку imgkit як приклад.

Коли ви запускаєте Django-застосунок, чи то через сервер розробки (python manage.py runserver), чи через виробничий сервер, такий як uWSGI, Django проходить через процес ініціалізації. Під час цього процесу воно завантажує різні модулі, включаючи ті, що належать до ваших встановлених додатків.

pic

Згенеровано 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 намагатиметься запустити додаток, що може перешкодити його запуску.

pic

Лог 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. Це означає:

  1. Додаток може стартувати, навіть якщо imgkit не встановлений. (усі інші API працюватимуть, окрім тих, що використовують generate_image_from_html)
  2. Ви отримаєте ImportError лише якщо хтось спробує використати функцію generate_image_from_html.
  3. Це дозволяє мати більш детальну обробку помилок і потенційно швидший старт додатка.

Перекладено з: An Introduction to Module Loading in Django

Leave a Reply

Your email address will not be published. Required fields are marked *