fal 1.28.0__tar.gz → 1.28.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of fal might be problematic. Click here for more details.

Files changed (186) hide show
  1. {fal-1.28.0/fal.egg-info → fal-1.28.1}/PKG-INFO +1 -1
  2. {fal-1.28.0 → fal-1.28.1/fal.egg-info}/PKG-INFO +1 -1
  3. {fal-1.28.0 → fal-1.28.1}/src/fal/_fal_version.py +2 -2
  4. {fal-1.28.0 → fal-1.28.1}/src/fal/api.py +5 -0
  5. {fal-1.28.0 → fal-1.28.1}/src/fal/app.py +24 -21
  6. {fal-1.28.0 → fal-1.28.1}/src/fal/toolkit/file/file.py +12 -10
  7. {fal-1.28.0 → fal-1.28.1}/.gitignore +0 -0
  8. {fal-1.28.0 → fal-1.28.1}/Makefile +0 -0
  9. {fal-1.28.0 → fal-1.28.1}/README.md +0 -0
  10. {fal-1.28.0 → fal-1.28.1}/docs/conf.py +0 -0
  11. {fal-1.28.0 → fal-1.28.1}/docs/index.rst +0 -0
  12. {fal-1.28.0 → fal-1.28.1}/fal.egg-info/SOURCES.txt +0 -0
  13. {fal-1.28.0 → fal-1.28.1}/fal.egg-info/dependency_links.txt +0 -0
  14. {fal-1.28.0 → fal-1.28.1}/fal.egg-info/entry_points.txt +0 -0
  15. {fal-1.28.0 → fal-1.28.1}/fal.egg-info/requires.txt +0 -0
  16. {fal-1.28.0 → fal-1.28.1}/fal.egg-info/top_level.txt +0 -0
  17. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/README.md +0 -0
  18. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/__init__.py +0 -0
  19. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/api/__init__.py +0 -0
  20. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/api/applications/__init__.py +0 -0
  21. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/api/applications/app_metadata.py +0 -0
  22. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/api/billing/__init__.py +0 -0
  23. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/api/billing/get_user_details.py +0 -0
  24. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/api/comfy/__init__.py +0 -0
  25. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/api/comfy/create_workflow.py +0 -0
  26. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/api/comfy/delete_workflow.py +0 -0
  27. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/api/comfy/get_workflow.py +0 -0
  28. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/api/comfy/list_user_workflows.py +0 -0
  29. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/api/comfy/update_workflow.py +0 -0
  30. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/api/files/__init__.py +0 -0
  31. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/api/files/check_dir_hash.py +0 -0
  32. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/api/files/upload_local_file.py +0 -0
  33. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/api/users/__init__.py +0 -0
  34. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/api/users/get_current_user.py +0 -0
  35. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/api/workflows/__init__.py +0 -0
  36. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/api/workflows/create_workflow.py +0 -0
  37. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/api/workflows/delete_workflow.py +0 -0
  38. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/api/workflows/get_workflow.py +0 -0
  39. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/api/workflows/list_user_workflows.py +0 -0
  40. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/api/workflows/update_workflow.py +0 -0
  41. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/client.py +0 -0
  42. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/errors.py +0 -0
  43. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/models/__init__.py +0 -0
  44. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/models/app_metadata_response_app_metadata.py +0 -0
  45. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/models/body_upload_local_file.py +0 -0
  46. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_detail.py +0 -0
  47. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_item.py +0 -0
  48. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema.py +0 -0
  49. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_extra_data.py +0 -0
  50. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_fal_inputs.py +0 -0
  51. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_fal_inputs_dev_info.py +0 -0
  52. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_prompt.py +0 -0
  53. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/models/current_user.py +0 -0
  54. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/models/customer_details.py +0 -0
  55. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/models/hash_check.py +0 -0
  56. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/models/http_validation_error.py +0 -0
  57. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/models/lock_reason.py +0 -0
  58. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/models/page_comfy_workflow_item.py +0 -0
  59. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/models/page_workflow_item.py +0 -0
  60. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/models/team_role.py +0 -0
  61. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/models/typed_comfy_workflow.py +0 -0
  62. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/models/typed_comfy_workflow_update.py +0 -0
  63. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/models/typed_workflow.py +0 -0
  64. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/models/typed_workflow_update.py +0 -0
  65. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/models/user_member.py +0 -0
  66. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/models/validation_error.py +0 -0
  67. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents.py +0 -0
  68. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_metadata.py +0 -0
  69. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_nodes.py +0 -0
  70. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_output.py +0 -0
  71. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_detail.py +0 -0
  72. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_detail_contents.py +0 -0
  73. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_item.py +0 -0
  74. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_node.py +0 -0
  75. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_node_type.py +0 -0
  76. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_schema.py +0 -0
  77. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_schema_input.py +0 -0
  78. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_schema_output.py +0 -0
  79. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/py.typed +0 -0
  80. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/openapi_fal_rest/types.py +0 -0
  81. {fal-1.28.0 → fal-1.28.1}/openapi-fal-rest/pyproject.toml +0 -0
  82. {fal-1.28.0 → fal-1.28.1}/openapi_rest.config.yaml +0 -0
  83. {fal-1.28.0 → fal-1.28.1}/pyproject.toml +0 -0
  84. {fal-1.28.0 → fal-1.28.1}/setup.cfg +0 -0
  85. {fal-1.28.0 → fal-1.28.1}/src/fal/__init__.py +0 -0
  86. {fal-1.28.0 → fal-1.28.1}/src/fal/__main__.py +0 -0
  87. {fal-1.28.0 → fal-1.28.1}/src/fal/_serialization.py +0 -0
  88. {fal-1.28.0 → fal-1.28.1}/src/fal/_version.py +0 -0
  89. {fal-1.28.0 → fal-1.28.1}/src/fal/apps.py +0 -0
  90. {fal-1.28.0 → fal-1.28.1}/src/fal/auth/__init__.py +0 -0
  91. {fal-1.28.0 → fal-1.28.1}/src/fal/auth/auth0.py +0 -0
  92. {fal-1.28.0 → fal-1.28.1}/src/fal/auth/local.py +0 -0
  93. {fal-1.28.0 → fal-1.28.1}/src/fal/cli/__init__.py +0 -0
  94. {fal-1.28.0 → fal-1.28.1}/src/fal/cli/_utils.py +0 -0
  95. {fal-1.28.0 → fal-1.28.1}/src/fal/cli/api.py +0 -0
  96. {fal-1.28.0 → fal-1.28.1}/src/fal/cli/apps.py +0 -0
  97. {fal-1.28.0 → fal-1.28.1}/src/fal/cli/auth.py +0 -0
  98. {fal-1.28.0 → fal-1.28.1}/src/fal/cli/cli_nested_json.py +0 -0
  99. {fal-1.28.0 → fal-1.28.1}/src/fal/cli/create.py +0 -0
  100. {fal-1.28.0 → fal-1.28.1}/src/fal/cli/debug.py +0 -0
  101. {fal-1.28.0 → fal-1.28.1}/src/fal/cli/deploy.py +0 -0
  102. {fal-1.28.0 → fal-1.28.1}/src/fal/cli/doctor.py +0 -0
  103. {fal-1.28.0 → fal-1.28.1}/src/fal/cli/files.py +0 -0
  104. {fal-1.28.0 → fal-1.28.1}/src/fal/cli/keys.py +0 -0
  105. {fal-1.28.0 → fal-1.28.1}/src/fal/cli/main.py +0 -0
  106. {fal-1.28.0 → fal-1.28.1}/src/fal/cli/parser.py +0 -0
  107. {fal-1.28.0 → fal-1.28.1}/src/fal/cli/profile.py +0 -0
  108. {fal-1.28.0 → fal-1.28.1}/src/fal/cli/run.py +0 -0
  109. {fal-1.28.0 → fal-1.28.1}/src/fal/cli/runners.py +0 -0
  110. {fal-1.28.0 → fal-1.28.1}/src/fal/cli/secrets.py +0 -0
  111. {fal-1.28.0 → fal-1.28.1}/src/fal/cli/teams.py +0 -0
  112. {fal-1.28.0 → fal-1.28.1}/src/fal/config.py +0 -0
  113. {fal-1.28.0 → fal-1.28.1}/src/fal/console/__init__.py +0 -0
  114. {fal-1.28.0 → fal-1.28.1}/src/fal/console/icons.py +0 -0
  115. {fal-1.28.0 → fal-1.28.1}/src/fal/console/ux.py +0 -0
  116. {fal-1.28.0 → fal-1.28.1}/src/fal/container.py +0 -0
  117. {fal-1.28.0 → fal-1.28.1}/src/fal/exceptions/__init__.py +0 -0
  118. {fal-1.28.0 → fal-1.28.1}/src/fal/exceptions/_base.py +0 -0
  119. {fal-1.28.0 → fal-1.28.1}/src/fal/exceptions/_cuda.py +0 -0
  120. {fal-1.28.0 → fal-1.28.1}/src/fal/exceptions/auth.py +0 -0
  121. {fal-1.28.0 → fal-1.28.1}/src/fal/files.py +0 -0
  122. {fal-1.28.0 → fal-1.28.1}/src/fal/flags.py +0 -0
  123. {fal-1.28.0 → fal-1.28.1}/src/fal/logging/__init__.py +0 -0
  124. {fal-1.28.0 → fal-1.28.1}/src/fal/logging/isolate.py +0 -0
  125. {fal-1.28.0 → fal-1.28.1}/src/fal/logging/style.py +0 -0
  126. {fal-1.28.0 → fal-1.28.1}/src/fal/logging/trace.py +0 -0
  127. {fal-1.28.0 → fal-1.28.1}/src/fal/logging/user.py +0 -0
  128. {fal-1.28.0 → fal-1.28.1}/src/fal/project.py +0 -0
  129. {fal-1.28.0 → fal-1.28.1}/src/fal/py.typed +0 -0
  130. {fal-1.28.0 → fal-1.28.1}/src/fal/rest_client.py +0 -0
  131. {fal-1.28.0 → fal-1.28.1}/src/fal/sdk.py +0 -0
  132. {fal-1.28.0 → fal-1.28.1}/src/fal/sync.py +0 -0
  133. {fal-1.28.0 → fal-1.28.1}/src/fal/toolkit/__init__.py +0 -0
  134. {fal-1.28.0 → fal-1.28.1}/src/fal/toolkit/audio/__init__.py +0 -0
  135. {fal-1.28.0 → fal-1.28.1}/src/fal/toolkit/audio/audio.py +0 -0
  136. {fal-1.28.0 → fal-1.28.1}/src/fal/toolkit/exceptions.py +0 -0
  137. {fal-1.28.0 → fal-1.28.1}/src/fal/toolkit/file/__init__.py +0 -0
  138. {fal-1.28.0 → fal-1.28.1}/src/fal/toolkit/file/providers/fal.py +0 -0
  139. {fal-1.28.0 → fal-1.28.1}/src/fal/toolkit/file/providers/gcp.py +0 -0
  140. {fal-1.28.0 → fal-1.28.1}/src/fal/toolkit/file/providers/r2.py +0 -0
  141. {fal-1.28.0 → fal-1.28.1}/src/fal/toolkit/file/providers/s3.py +0 -0
  142. {fal-1.28.0 → fal-1.28.1}/src/fal/toolkit/file/types.py +0 -0
  143. {fal-1.28.0 → fal-1.28.1}/src/fal/toolkit/image/__init__.py +0 -0
  144. {fal-1.28.0 → fal-1.28.1}/src/fal/toolkit/image/image.py +0 -0
  145. {fal-1.28.0 → fal-1.28.1}/src/fal/toolkit/image/nsfw_filter/__init__.py +0 -0
  146. {fal-1.28.0 → fal-1.28.1}/src/fal/toolkit/image/nsfw_filter/env.py +0 -0
  147. {fal-1.28.0 → fal-1.28.1}/src/fal/toolkit/image/nsfw_filter/inference.py +0 -0
  148. {fal-1.28.0 → fal-1.28.1}/src/fal/toolkit/image/nsfw_filter/model.py +0 -0
  149. {fal-1.28.0 → fal-1.28.1}/src/fal/toolkit/image/nsfw_filter/requirements.txt +0 -0
  150. {fal-1.28.0 → fal-1.28.1}/src/fal/toolkit/image/safety_checker.py +0 -0
  151. {fal-1.28.0 → fal-1.28.1}/src/fal/toolkit/kv.py +0 -0
  152. {fal-1.28.0 → fal-1.28.1}/src/fal/toolkit/optimize.py +0 -0
  153. {fal-1.28.0 → fal-1.28.1}/src/fal/toolkit/types.py +0 -0
  154. {fal-1.28.0 → fal-1.28.1}/src/fal/toolkit/utils/__init__.py +0 -0
  155. {fal-1.28.0 → fal-1.28.1}/src/fal/toolkit/utils/download_utils.py +0 -0
  156. {fal-1.28.0 → fal-1.28.1}/src/fal/toolkit/utils/endpoint.py +0 -0
  157. {fal-1.28.0 → fal-1.28.1}/src/fal/toolkit/utils/retry.py +0 -0
  158. {fal-1.28.0 → fal-1.28.1}/src/fal/toolkit/video/__init__.py +0 -0
  159. {fal-1.28.0 → fal-1.28.1}/src/fal/toolkit/video/video.py +0 -0
  160. {fal-1.28.0 → fal-1.28.1}/src/fal/utils.py +0 -0
  161. {fal-1.28.0 → fal-1.28.1}/src/fal/workflows.py +0 -0
  162. {fal-1.28.0 → fal-1.28.1}/tests/__init__.py +0 -0
  163. {fal-1.28.0 → fal-1.28.1}/tests/assets/cat.png +0 -0
  164. {fal-1.28.0 → fal-1.28.1}/tests/cli/__init__.py +0 -0
  165. {fal-1.28.0 → fal-1.28.1}/tests/cli/test_apps.py +0 -0
  166. {fal-1.28.0 → fal-1.28.1}/tests/cli/test_auth.py +0 -0
  167. {fal-1.28.0 → fal-1.28.1}/tests/cli/test_deploy.py +0 -0
  168. {fal-1.28.0 → fal-1.28.1}/tests/cli/test_keys.py +0 -0
  169. {fal-1.28.0 → fal-1.28.1}/tests/cli/test_run.py +0 -0
  170. {fal-1.28.0 → fal-1.28.1}/tests/cli/test_secrets.py +0 -0
  171. {fal-1.28.0 → fal-1.28.1}/tests/conftest.py +0 -0
  172. {fal-1.28.0 → fal-1.28.1}/tests/integration_test.py +0 -0
  173. {fal-1.28.0 → fal-1.28.1}/tests/mainify_package/__init__.py +0 -0
  174. {fal-1.28.0 → fal-1.28.1}/tests/mainify_package/impl.py +0 -0
  175. {fal-1.28.0 → fal-1.28.1}/tests/mainify_package/utils.py +0 -0
  176. {fal-1.28.0 → fal-1.28.1}/tests/mainify_target.py +0 -0
  177. {fal-1.28.0 → fal-1.28.1}/tests/test_apps.py +0 -0
  178. {fal-1.28.0 → fal-1.28.1}/tests/test_files.py +0 -0
  179. {fal-1.28.0 → fal-1.28.1}/tests/test_kv.py +0 -0
  180. {fal-1.28.0 → fal-1.28.1}/tests/test_stability.py +0 -0
  181. {fal-1.28.0 → fal-1.28.1}/tests/toolkit/file/providers/test_fal_retry.py +0 -0
  182. {fal-1.28.0 → fal-1.28.1}/tests/toolkit/file_test.py +0 -0
  183. {fal-1.28.0 → fal-1.28.1}/tests/toolkit/image_test.py +0 -0
  184. {fal-1.28.0 → fal-1.28.1}/tests/toolkit/test_types.py +0 -0
  185. {fal-1.28.0 → fal-1.28.1}/tests/toolkit/utils/retry.py +0 -0
  186. {fal-1.28.0 → fal-1.28.1}/tools/demo_script.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fal
3
- Version: 1.28.0
3
+ Version: 1.28.1
4
4
  Summary: fal is an easy-to-use Serverless Python Framework
5
5
  Author: Features & Labels <support@fal.ai>
6
6
  Requires-Python: >=3.8
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fal
3
- Version: 1.28.0
3
+ Version: 1.28.1
4
4
  Summary: fal is an easy-to-use Serverless Python Framework
5
5
  Author: Features & Labels <support@fal.ai>
6
6
  Requires-Python: >=3.8
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '1.28.0'
21
- __version_tuple__ = version_tuple = (1, 28, 0)
20
+ __version__ = version = '1.28.1'
21
+ __version_tuple__ = version_tuple = (1, 28, 1)
@@ -953,6 +953,11 @@ def function( # type: ignore
953
953
  ):
954
954
  if host is None:
955
955
  host = FalServerlessHost()
956
+
957
+ # NOTE: assuming kind="container" if image is provided
958
+ if config.get("image"):
959
+ kind = "container"
960
+
956
961
  options = host.parse_options(kind=kind, **config)
957
962
 
958
963
  def wrapper(func: Callable[ArgsT, ReturnT]):
@@ -411,28 +411,31 @@ class App(BaseServable):
411
411
  )
412
412
  return response
413
413
 
414
- @app.middleware("http")
415
- async def set_global_object_preference(request, call_next):
416
- try:
417
- preference_dict = request_lifecycle_preference(request)
418
- if preference_dict is not None:
419
- # This will not work properly for apps with multiplexing enabled
420
- # we may mix up the preferences between requests
421
- LIFECYCLE_PREFERENCE.set(preference_dict)
422
- except Exception:
423
- from fastapi.logger import logger
424
-
425
- logger.exception(
426
- "Failed set a global lifecycle preference %s",
427
- self.__class__.__name__,
428
- )
414
+ multiplexing = self.host_kwargs.get("max_multiplexing") or 1
415
+ if multiplexing == 1:
416
+ # just register the middleware if we are not multiplexing
417
+ @app.middleware("http")
418
+ async def set_global_object_preference(request, call_next):
419
+ try:
420
+ preference_dict = request_lifecycle_preference(request)
421
+ if preference_dict is not None:
422
+ # This will not work properly for apps with multiplexing enabled
423
+ # we may mix up the preferences between requests
424
+ LIFECYCLE_PREFERENCE.set(preference_dict)
425
+ except Exception:
426
+ from fastapi.logger import logger
427
+
428
+ logger.exception(
429
+ "Failed set a global lifecycle preference %s",
430
+ self.__class__.__name__,
431
+ )
429
432
 
430
- try:
431
- return await call_next(request)
432
- finally:
433
- # We may miss the global preference if there are operations
434
- # being done in the background that go beyond the request
435
- LIFECYCLE_PREFERENCE.set(None)
433
+ try:
434
+ return await call_next(request)
435
+ finally:
436
+ # We may miss the global preference if there are operations
437
+ # being done in the background that go beyond the request
438
+ LIFECYCLE_PREFERENCE.set(None)
436
439
 
437
440
  @app.middleware("http")
438
441
  async def set_request_id(request, call_next):
@@ -201,9 +201,11 @@ class File(BaseModel):
201
201
 
202
202
  fdata = FileData(data, content_type, file_name)
203
203
 
204
- object_lifecycle_preference = (
205
- request_lifecycle_preference(request) or LIFECYCLE_PREFERENCE.get()
206
- )
204
+ if request:
205
+ object_lifecycle_preference = request_lifecycle_preference(request)
206
+ else:
207
+ object_lifecycle_preference = LIFECYCLE_PREFERENCE.get()
208
+
207
209
  save_kwargs.setdefault(
208
210
  "object_lifecycle_preference", object_lifecycle_preference
209
211
  )
@@ -250,9 +252,12 @@ class File(BaseModel):
250
252
  fallback_save_kwargs = fallback_save_kwargs or {}
251
253
 
252
254
  content_type = content_type or "application/octet-stream"
253
- object_lifecycle_preference = (
254
- request_lifecycle_preference(request) or LIFECYCLE_PREFERENCE.get()
255
- )
255
+
256
+ if request:
257
+ object_lifecycle_preference = request_lifecycle_preference(request)
258
+ else:
259
+ object_lifecycle_preference = LIFECYCLE_PREFERENCE.get()
260
+
256
261
  save_kwargs.setdefault(
257
262
  "object_lifecycle_preference", object_lifecycle_preference
258
263
  )
@@ -332,12 +337,9 @@ class CompressedFile(File):
332
337
  shutil.rmtree(self.extract_dir)
333
338
 
334
339
 
335
- def request_lifecycle_preference(request: Optional[Request]) -> dict[str, str] | None:
340
+ def request_lifecycle_preference(request: Request) -> dict[str, str] | None:
336
341
  import json
337
342
 
338
- if request is None:
339
- return None
340
-
341
343
  preference_str = request.headers.get(OBJECT_LIFECYCLE_PREFERENCE_KEY)
342
344
  if preference_str is None:
343
345
  return None
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes