app_factory.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. import logging
  2. import time
  3. from configs import dify_config
  4. from contexts.wrapper import RecyclableContextVar
  5. from dify_app import DifyApp
  6. # ----------------------------
  7. # Application Factory Function
  8. # ----------------------------
  9. def create_flask_app_with_configs() -> DifyApp:
  10. """
  11. create a raw flask app
  12. with configs loaded from .env file
  13. """
  14. dify_app = DifyApp(__name__)
  15. dify_app.config.from_mapping(dify_config.model_dump())
  16. # add before request hook
  17. @dify_app.before_request
  18. def before_request():
  19. # add an unique identifier to each request
  20. RecyclableContextVar.increment_thread_recycles()
  21. return dify_app
  22. def create_app() -> DifyApp:
  23. start_time = time.perf_counter()
  24. app = create_flask_app_with_configs()
  25. initialize_extensions(app)
  26. end_time = time.perf_counter()
  27. if dify_config.DEBUG:
  28. logging.info(f"Finished create_app ({round((end_time - start_time) * 1000, 2)} ms)")
  29. return app
  30. def initialize_extensions(app: DifyApp):
  31. from extensions import (
  32. ext_app_metrics,
  33. ext_blueprints,
  34. ext_celery,
  35. ext_code_based_extension,
  36. ext_commands,
  37. ext_compress,
  38. ext_database,
  39. ext_hosting_provider,
  40. ext_import_modules,
  41. ext_logging,
  42. ext_login,
  43. ext_mail,
  44. ext_migrate,
  45. ext_proxy_fix,
  46. ext_redis,
  47. ext_sentry,
  48. ext_set_secretkey,
  49. ext_storage,
  50. ext_timezone,
  51. ext_warnings,
  52. )
  53. extensions = [
  54. ext_timezone,
  55. ext_logging,
  56. ext_warnings,
  57. ext_import_modules,
  58. ext_set_secretkey,
  59. ext_compress,
  60. ext_code_based_extension,
  61. ext_database,
  62. ext_app_metrics,
  63. ext_migrate,
  64. ext_redis,
  65. ext_storage,
  66. ext_celery,
  67. ext_login,
  68. ext_mail,
  69. ext_hosting_provider,
  70. ext_sentry,
  71. ext_proxy_fix,
  72. ext_blueprints,
  73. ext_commands,
  74. ]
  75. for ext in extensions:
  76. short_name = ext.__name__.split(".")[-1]
  77. is_enabled = ext.is_enabled() if hasattr(ext, "is_enabled") else True
  78. if not is_enabled:
  79. if dify_config.DEBUG:
  80. logging.info(f"Skipped {short_name}")
  81. continue
  82. start_time = time.perf_counter()
  83. ext.init_app(app)
  84. end_time = time.perf_counter()
  85. if dify_config.DEBUG:
  86. logging.info(f"Loaded {short_name} ({round((end_time - start_time) * 1000, 2)} ms)")
  87. def create_migrations_app():
  88. app = create_flask_app_with_configs()
  89. from extensions import ext_database, ext_migrate
  90. # Initialize only required extensions
  91. ext_database.init_app(app)
  92. ext_migrate.init_app(app)
  93. return app