mirror of
https://github.com/langgenius/dify.git
synced 2024-11-16 11:42:29 +08:00
refactor: extract cors configs into dify config and cleanup the config class (#5507)
Co-authored-by: takatost <takatost@gmail.com>
This commit is contained in:
parent
ec1d3ddee2
commit
2a0f03a511
2
.github/workflows/api-tests.yml
vendored
2
.github/workflows/api-tests.yml
vendored
|
@ -77,7 +77,6 @@ jobs:
|
||||||
docker/docker-compose.pgvecto-rs.yaml
|
docker/docker-compose.pgvecto-rs.yaml
|
||||||
docker/docker-compose.pgvector.yaml
|
docker/docker-compose.pgvector.yaml
|
||||||
docker/docker-compose.chroma.yaml
|
docker/docker-compose.chroma.yaml
|
||||||
docker/docker-compose.oracle.yaml
|
|
||||||
services: |
|
services: |
|
||||||
weaviate
|
weaviate
|
||||||
qdrant
|
qdrant
|
||||||
|
@ -87,7 +86,6 @@ jobs:
|
||||||
pgvecto-rs
|
pgvecto-rs
|
||||||
pgvector
|
pgvector
|
||||||
chroma
|
chroma
|
||||||
oracle
|
|
||||||
|
|
||||||
- name: Test Vector Stores
|
- name: Test Vector Stores
|
||||||
run: poetry run -C api bash dev/pytest/pytest_vdb.sh
|
run: poetry run -C api bash dev/pytest/pytest_vdb.sh
|
||||||
|
|
|
@ -24,7 +24,6 @@ from flask_cors import CORS
|
||||||
from werkzeug.exceptions import Unauthorized
|
from werkzeug.exceptions import Unauthorized
|
||||||
|
|
||||||
from commands import register_commands
|
from commands import register_commands
|
||||||
from config import Config
|
|
||||||
|
|
||||||
# DO NOT REMOVE BELOW
|
# DO NOT REMOVE BELOW
|
||||||
from events import event_handlers
|
from events import event_handlers
|
||||||
|
@ -82,7 +81,6 @@ def create_flask_app_with_configs() -> Flask:
|
||||||
with configs loaded from .env file
|
with configs loaded from .env file
|
||||||
"""
|
"""
|
||||||
dify_app = DifyApp(__name__)
|
dify_app = DifyApp(__name__)
|
||||||
dify_app.config.from_object(Config())
|
|
||||||
dify_app.config.from_mapping(DifyConfig().model_dump())
|
dify_app.config.from_mapping(DifyConfig().model_dump())
|
||||||
return dify_app
|
return dify_app
|
||||||
|
|
||||||
|
@ -232,7 +230,7 @@ def register_blueprints(app):
|
||||||
app = create_app()
|
app = create_app()
|
||||||
celery = app.extensions["celery"]
|
celery = app.extensions["celery"]
|
||||||
|
|
||||||
if app.config['TESTING']:
|
if app.config.get('TESTING'):
|
||||||
print("App is running in TESTING mode")
|
print("App is running in TESTING mode")
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,42 +0,0 @@
|
||||||
import os
|
|
||||||
|
|
||||||
import dotenv
|
|
||||||
|
|
||||||
DEFAULTS = {
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
def get_env(key):
|
|
||||||
return os.environ.get(key, DEFAULTS.get(key))
|
|
||||||
|
|
||||||
|
|
||||||
def get_bool_env(key):
|
|
||||||
value = get_env(key)
|
|
||||||
return value.lower() == 'true' if value is not None else False
|
|
||||||
|
|
||||||
|
|
||||||
def get_cors_allow_origins(env, default):
|
|
||||||
cors_allow_origins = []
|
|
||||||
if get_env(env):
|
|
||||||
for origin in get_env(env).split(','):
|
|
||||||
cors_allow_origins.append(origin)
|
|
||||||
else:
|
|
||||||
cors_allow_origins = [default]
|
|
||||||
|
|
||||||
return cors_allow_origins
|
|
||||||
|
|
||||||
|
|
||||||
class Config:
|
|
||||||
"""Application configuration class."""
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
dotenv.load_dotenv()
|
|
||||||
|
|
||||||
self.TESTING = False
|
|
||||||
self.APPLICATION_NAME = "langgenius/dify"
|
|
||||||
|
|
||||||
# cors settings
|
|
||||||
self.CONSOLE_CORS_ALLOW_ORIGINS = get_cors_allow_origins(
|
|
||||||
'CONSOLE_CORS_ALLOW_ORIGINS', get_env('CONSOLE_WEB_URL'))
|
|
||||||
self.WEB_API_CORS_ALLOW_ORIGINS = get_cors_allow_origins(
|
|
||||||
'WEB_API_CORS_ALLOW_ORIGINS', '*')
|
|
|
@ -5,6 +5,16 @@ class DeploymentConfig(BaseModel):
|
||||||
"""
|
"""
|
||||||
Deployment configs
|
Deployment configs
|
||||||
"""
|
"""
|
||||||
|
APPLICATION_NAME: str = Field(
|
||||||
|
description='application name',
|
||||||
|
default='langgenius/dify',
|
||||||
|
)
|
||||||
|
|
||||||
|
TESTING: bool = Field(
|
||||||
|
description='',
|
||||||
|
default=False,
|
||||||
|
)
|
||||||
|
|
||||||
EDITION: str = Field(
|
EDITION: str = Field(
|
||||||
description='deployment edition',
|
description='deployment edition',
|
||||||
default='SELF_HOSTED',
|
default='SELF_HOSTED',
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
from pydantic import AliasChoices, BaseModel, Field, NonNegativeInt, PositiveInt
|
from pydantic import AliasChoices, BaseModel, Field, NonNegativeInt, PositiveInt, computed_field
|
||||||
|
|
||||||
from configs.feature.hosted_service import HostedServiceConfig
|
from configs.feature.hosted_service import HostedServiceConfig
|
||||||
|
|
||||||
|
@ -125,6 +125,28 @@ class HttpConfig(BaseModel):
|
||||||
default=False,
|
default=False,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
inner_CONSOLE_CORS_ALLOW_ORIGINS: str = Field(
|
||||||
|
description='',
|
||||||
|
validation_alias=AliasChoices('CONSOLE_CORS_ALLOW_ORIGINS', 'CONSOLE_WEB_URL'),
|
||||||
|
default='',
|
||||||
|
)
|
||||||
|
|
||||||
|
@computed_field
|
||||||
|
@property
|
||||||
|
def CONSOLE_CORS_ALLOW_ORIGINS(self) -> list[str]:
|
||||||
|
return self.inner_CONSOLE_CORS_ALLOW_ORIGINS.split(',')
|
||||||
|
|
||||||
|
inner_WEB_API_CORS_ALLOW_ORIGINS: Optional[str] = Field(
|
||||||
|
description='',
|
||||||
|
validation_alias=AliasChoices('WEB_API_CORS_ALLOW_ORIGINS'),
|
||||||
|
default='*',
|
||||||
|
)
|
||||||
|
|
||||||
|
@computed_field
|
||||||
|
@property
|
||||||
|
def WEB_API_CORS_ALLOW_ORIGINS(self) -> list[str]:
|
||||||
|
return self.inner_WEB_API_CORS_ALLOW_ORIGINS.split(',')
|
||||||
|
|
||||||
|
|
||||||
class InnerAPIConfig(BaseModel):
|
class InnerAPIConfig(BaseModel):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import logging
|
import logging
|
||||||
|
import os
|
||||||
import time
|
import time
|
||||||
from enum import Enum
|
from enum import Enum
|
||||||
from threading import Lock
|
from threading import Lock
|
||||||
|
@ -8,7 +9,6 @@ from httpx import get, post
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
from yarl import URL
|
from yarl import URL
|
||||||
|
|
||||||
from config import get_env
|
|
||||||
from core.helper.code_executor.entities import CodeDependency
|
from core.helper.code_executor.entities import CodeDependency
|
||||||
from core.helper.code_executor.javascript.javascript_transformer import NodeJsTemplateTransformer
|
from core.helper.code_executor.javascript.javascript_transformer import NodeJsTemplateTransformer
|
||||||
from core.helper.code_executor.jinja2.jinja2_transformer import Jinja2TemplateTransformer
|
from core.helper.code_executor.jinja2.jinja2_transformer import Jinja2TemplateTransformer
|
||||||
|
@ -18,8 +18,8 @@ from core.helper.code_executor.template_transformer import TemplateTransformer
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
# Code Executor
|
# Code Executor
|
||||||
CODE_EXECUTION_ENDPOINT = get_env('CODE_EXECUTION_ENDPOINT')
|
CODE_EXECUTION_ENDPOINT = os.environ.get('CODE_EXECUTION_ENDPOINT', 'http://sandbox:8194')
|
||||||
CODE_EXECUTION_API_KEY = get_env('CODE_EXECUTION_API_KEY')
|
CODE_EXECUTION_API_KEY = os.environ.get('CODE_EXECUTION_API_KEY', 'dify-sandbox')
|
||||||
|
|
||||||
CODE_EXECUTION_TIMEOUT= (10, 60)
|
CODE_EXECUTION_TIMEOUT= (10, 60)
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,7 @@ def example_env_file(tmp_path, monkeypatch) -> str:
|
||||||
file_path.write_text(dedent(
|
file_path.write_text(dedent(
|
||||||
"""
|
"""
|
||||||
CONSOLE_API_URL=https://example.com
|
CONSOLE_API_URL=https://example.com
|
||||||
|
CONSOLE_WEB_URL=https://example.com
|
||||||
"""))
|
"""))
|
||||||
return str(file_path)
|
return str(file_path)
|
||||||
|
|
||||||
|
@ -47,14 +48,13 @@ def test_flask_configs(example_env_file):
|
||||||
flask_app.config.from_mapping(DifyConfig(_env_file=example_env_file).model_dump())
|
flask_app.config.from_mapping(DifyConfig(_env_file=example_env_file).model_dump())
|
||||||
config = flask_app.config
|
config = flask_app.config
|
||||||
|
|
||||||
# configs read from dotenv directly
|
|
||||||
assert config['LOG_LEVEL'] == 'INFO'
|
|
||||||
|
|
||||||
# configs read from pydantic-settings
|
# configs read from pydantic-settings
|
||||||
|
assert config['LOG_LEVEL'] == 'INFO'
|
||||||
assert config['COMMIT_SHA'] == ''
|
assert config['COMMIT_SHA'] == ''
|
||||||
assert config['EDITION'] == 'SELF_HOSTED'
|
assert config['EDITION'] == 'SELF_HOSTED'
|
||||||
assert config['API_COMPRESSION_ENABLED'] is False
|
assert config['API_COMPRESSION_ENABLED'] is False
|
||||||
assert config['SENTRY_TRACES_SAMPLE_RATE'] == 1.0
|
assert config['SENTRY_TRACES_SAMPLE_RATE'] == 1.0
|
||||||
|
assert config['TESTING'] == False
|
||||||
|
|
||||||
# value from env file
|
# value from env file
|
||||||
assert config['CONSOLE_API_URL'] == 'https://example.com'
|
assert config['CONSOLE_API_URL'] == 'https://example.com'
|
||||||
|
@ -71,3 +71,7 @@ def test_flask_configs(example_env_file):
|
||||||
'pool_recycle': 3600,
|
'pool_recycle': 3600,
|
||||||
'pool_size': 30,
|
'pool_size': 30,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
assert config['CONSOLE_WEB_URL']=='https://example.com'
|
||||||
|
assert config['CONSOLE_CORS_ALLOW_ORIGINS']==['https://example.com']
|
||||||
|
assert config['WEB_API_CORS_ALLOW_ORIGINS'] == ['*']
|
||||||
|
|
|
@ -1,4 +1,10 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
set -x
|
set -x
|
||||||
|
|
||||||
pytest api/tests/integration_tests/vdb/
|
pytest api/tests/integration_tests/vdb/chroma \
|
||||||
|
api/tests/integration_tests/vdb/milvus \
|
||||||
|
api/tests/integration_tests/vdb/pgvecto_rs \
|
||||||
|
api/tests/integration_tests/vdb/pgvector \
|
||||||
|
api/tests/integration_tests/vdb/qdrant \
|
||||||
|
api/tests/integration_tests/vdb/weaviate \
|
||||||
|
api/tests/integration_tests/vdb/test_vector_store.py
|
Loading…
Reference in New Issue
Block a user