Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

app_factory.py 2.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  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_otel,
  46. ext_otel_patch,
  47. ext_proxy_fix,
  48. ext_redis,
  49. ext_repositories,
  50. ext_sentry,
  51. ext_set_secretkey,
  52. ext_storage,
  53. ext_timezone,
  54. ext_warnings,
  55. )
  56. extensions = [
  57. ext_timezone,
  58. ext_logging,
  59. ext_warnings,
  60. ext_import_modules,
  61. ext_set_secretkey,
  62. ext_compress,
  63. ext_code_based_extension,
  64. ext_database,
  65. ext_app_metrics,
  66. ext_migrate,
  67. ext_redis,
  68. ext_storage,
  69. ext_repositories,
  70. ext_celery,
  71. ext_login,
  72. ext_mail,
  73. ext_hosting_provider,
  74. ext_sentry,
  75. ext_proxy_fix,
  76. ext_blueprints,
  77. ext_commands,
  78. ext_otel_patch, # Apply patch before initializing OpenTelemetry
  79. ext_otel,
  80. ]
  81. for ext in extensions:
  82. short_name = ext.__name__.split(".")[-1]
  83. is_enabled = ext.is_enabled() if hasattr(ext, "is_enabled") else True
  84. if not is_enabled:
  85. if dify_config.DEBUG:
  86. logging.info(f"Skipped {short_name}")
  87. continue
  88. start_time = time.perf_counter()
  89. ext.init_app(app)
  90. end_time = time.perf_counter()
  91. if dify_config.DEBUG:
  92. logging.info(f"Loaded {short_name} ({round((end_time - start_time) * 1000, 2)} ms)")
  93. def create_migrations_app():
  94. app = create_flask_app_with_configs()
  95. from extensions import ext_database, ext_migrate
  96. # Initialize only required extensions
  97. ext_database.init_app(app)
  98. ext_migrate.init_app(app)
  99. return app