您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

app_factory.py 3.0KB

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