Allow gunicorn timeout be set in pcconfig.py (#1193)

This commit is contained in:
Sergei Ozeranskii 2023-06-16 06:24:44 +08:00 committed by GitHub
parent fe89d53dcf
commit 8500a8444a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 50 additions and 6 deletions

View File

@ -8,7 +8,7 @@ To navigate our codebase with confidence, see [Pynecone Docs](https://pynecone.i
- Have a question? Want to discuss a feature? [Start a discussion](https://github.com/pynecone-io/pynecone/discussions) - Have a question? Want to discuss a feature? [Start a discussion](https://github.com/pynecone-io/pynecone/discussions)
We welome and discussions and questions. We want to make sure that Pynecone is the best it can be, and we can't do that without your help. We welcome any discussions and questions. We want to make sure that Pynecone is the best it can be, and we can't do that without your help.
### Issues ### Issues

View File

@ -174,7 +174,7 @@ class Config(Base):
# Additional frontend packages to install. # Additional frontend packages to install.
frontend_packages: List[str] = [] frontend_packages: List[str] = []
# The Admin Dash # The Admin Dash.
admin_dash: Optional[AdminDash] = None admin_dash: Optional[AdminDash] = None
# Backend transport methods. # Backend transport methods.
@ -191,12 +191,15 @@ class Config(Base):
# The maximum size of a message when using the polling backend transport. # The maximum size of a message when using the polling backend transport.
polling_max_http_buffer_size: Optional[int] = constants.POLLING_MAX_HTTP_BUFFER_SIZE polling_max_http_buffer_size: Optional[int] = constants.POLLING_MAX_HTTP_BUFFER_SIZE
# Dotenv file path # Dotenv file path.
env_path: Optional[str] = constants.DOT_ENV_FILE env_path: Optional[str] = constants.DOT_ENV_FILE
# Whether to override OS environment variables # Whether to override OS environment variables.
override_os_envs: Optional[bool] = True override_os_envs: Optional[bool] = True
# Timeout when launching the gunicorn server.
timeout: int = constants.TIMEOUT
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
"""Initialize the config values. """Initialize the config values.

View File

@ -106,7 +106,7 @@ INSTALL_BUN = f"curl -fsSL https://bun.sh/install | bash -s -- bun-v{MAX_BUN_VER
# Default host in dev mode. # Default host in dev mode.
BACKEND_HOST = get_value("BACKEND_HOST", "0.0.0.0") BACKEND_HOST = get_value("BACKEND_HOST", "0.0.0.0")
# The default timeout when launching the gunicorn server. # The default timeout when launching the gunicorn server.
TIMEOUT = 120 TIMEOUT = get_value("TIMEOUT", 120, type_=int)
# The command to run the backend in production mode. # The command to run the backend in production mode.
RUN_BACKEND_PROD = f"gunicorn --worker-class uvicorn.workers.UvicornH11Worker --preload --timeout {TIMEOUT} --log-level critical".split() RUN_BACKEND_PROD = f"gunicorn --worker-class uvicorn.workers.UvicornH11Worker --preload --timeout {TIMEOUT} --log-level critical".split()
RUN_BACKEND_PROD_WINDOWS = f"uvicorn --timeout-keep-alive {TIMEOUT}".split() RUN_BACKEND_PROD_WINDOWS = f"uvicorn --timeout-keep-alive {TIMEOUT}".split()

View File

@ -65,7 +65,7 @@ pre-commit = {version = "^3.2.1", python = ">=3.8,<4.0"}
pc = "pynecone.pc:main" pc = "pynecone.pc:main"
[build-system] [build-system]
requires = ["poetry-core>=1.0.0"] requires = ["poetry-core>=1.5.1"]
build-backend = "poetry.core.masonry.api" build-backend = "poetry.core.masonry.api"
[tool.pyright] [tool.pyright]

View File

@ -6,6 +6,7 @@ import pytest
import pynecone as pc import pynecone as pc
from pynecone import constants from pynecone import constants
from pynecone.config import DBConfig from pynecone.config import DBConfig
from pynecone.constants import get_value
@pytest.fixture @pytest.fixture
@ -34,6 +35,21 @@ def config_empty_db_url_values(base_config_values):
""" """
base_config_values["db_url"] = None base_config_values["db_url"] = None
yield base_config_values yield base_config_values
os.environ.pop("DB_URL", None)
@pytest.fixture
def config_none_db_url_values(base_config_values):
"""Create config values with None (string) db_url.
Args:
base_config_values: Base config values fixture.
Yields:
Config values
"""
base_config_values["db_url"] = "None"
yield base_config_values
os.environ.pop("DB_URL") os.environ.pop("DB_URL")
@ -68,6 +84,16 @@ def test_empty_db_url(config_empty_db_url_values):
assert config.db_url is None assert config.db_url is None
def test_none_db_url(config_none_db_url_values):
"""Test that db_url is set 'None' (string) assigned if an 'None' (string) value is defined.
Args:
config_none_db_url_values: Config values with None (string) db_url.
"""
config = pc.Config(**config_none_db_url_values)
assert config.db_url == "None"
def test_db_url_precedence(base_config_values, sqlite_db_config_values): def test_db_url_precedence(base_config_values, sqlite_db_config_values):
"""Test that db_url is not overwritten when db_url is defined. """Test that db_url is not overwritten when db_url is defined.
@ -92,3 +118,18 @@ def test_db_url_from_db_config(config_no_db_url_values, sqlite_db_config_values)
config_no_db_url_values["db_config"] = db_config config_no_db_url_values["db_config"] = db_config
config = pc.Config(**config_no_db_url_values) config = pc.Config(**config_no_db_url_values)
assert config.db_url == db_config.get_url() assert config.db_url == db_config.get_url()
@pytest.mark.parametrize(
"key, value, expected_value_type_in_config",
(
("TIMEOUT", "1", int),
("CORS_ALLOWED_ORIGINS", "[1, 2, 3]", list),
("DB_NAME", "dbname", str),
),
)
def test_get_value(monkeypatch, key, value, expected_value_type_in_config):
monkeypatch.setenv(key, value)
casted_value = get_value(key, type_=expected_value_type_in_config)
assert isinstance(casted_value, expected_value_type_in_config)