From 22deb9eb1bb34072a6cacfc63a491ad491018aa1 Mon Sep 17 00:00:00 2001 From: pysqz Date: Sun, 1 Jan 2023 01:41:48 +0800 Subject: [PATCH] Add option to specify port (#192) --- pynecone/config.py | 3 +++ pynecone/constants.py | 4 +++- pynecone/utils.py | 28 ++++++++++++++++++++++++++-- 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/pynecone/config.py b/pynecone/config.py index 203e13f9c..db5fa4c89 100644 --- a/pynecone/config.py +++ b/pynecone/config.py @@ -15,6 +15,9 @@ class Config(Base): # The username. username: Optional[str] = None + # The frontend port. + port: str = constants.FRONTEND_PORT + # The backend API url. api_url: str = constants.API_URL diff --git a/pynecone/constants.py b/pynecone/constants.py index b8e723937..24b7b8be0 100644 --- a/pynecone/constants.py +++ b/pynecone/constants.py @@ -57,6 +57,8 @@ PCVERSION_APP_FILE = os.path.join(WEB_DIR, "pcversion.txt") # Commands to run the app. +# The frontend default port. +FRONTEND_PORT = "3000" # The backend api url. API_URL = "http://localhost:8000" # The default path where bun is installed. @@ -68,7 +70,7 @@ BACKEND_HOST = "0.0.0.0" # The default timeout when launching the gunicorn server. TIMEOUT = 120 # The command to run the backend in production mode. -RUN_BACKEND_PROD = f"gunicorn --worker-class uvicorn.workers.UvicornH11Worker --bind 0.0.0.0:8000 --preload --timeout {TIMEOUT} --log-level critical".split() +RUN_BACKEND_PROD = f"gunicorn --worker-class uvicorn.workers.UvicornH11Worker --preload --timeout {TIMEOUT} --log-level critical".split() # Compiler variables. # The extension for compiled Javascript files. diff --git a/pynecone/utils.py b/pynecone/utils.py index 433ede80b..3f858fb2c 100644 --- a/pynecone/utils.py +++ b/pynecone/utils.py @@ -14,6 +14,7 @@ import string import subprocess import sys import uvicorn +from urllib.parse import urlparse from collections import defaultdict from subprocess import PIPE from types import ModuleType @@ -500,7 +501,10 @@ def run_frontend(app: App): # Run the frontend in development mode. console.rule("[bold green]App Running") - subprocess.Popen([get_package_manager(), "run", "dev"], cwd=constants.WEB_DIR) + os.environ["PORT"] = get_config().port + subprocess.Popen( + [get_package_manager(), "run", "dev"], cwd=constants.WEB_DIR, env=os.environ + ) def run_frontend_prod(app: App): @@ -515,8 +519,12 @@ def run_frontend_prod(app: App): # Export the app. export_app(app) + os.environ["PORT"] = get_config().port + # Run the frontend in production mode. - subprocess.Popen([get_package_manager(), "run", "prod"], cwd=constants.WEB_DIR) + subprocess.Popen( + [get_package_manager(), "run", "prod"], cwd=constants.WEB_DIR, env=os.environ + ) def get_num_workers() -> int: @@ -533,6 +541,19 @@ def get_num_workers() -> int: return (os.cpu_count() or 1) * 2 + 1 +def get_api_port() -> int: + """Get the API port. + + Returns: + The API port. + """ + port = urlparse(get_config().api_url).port + if port is None: + port = urlparse(constants.API_URL).port + assert port is not None + return port + + def run_backend(app_name: str, loglevel: constants.LogLevel = constants.LogLevel.ERROR): """Run the backend. @@ -543,6 +564,7 @@ def run_backend(app_name: str, loglevel: constants.LogLevel = constants.LogLevel uvicorn.run( f"{app_name}:{constants.APP_VAR}.{constants.API_VAR}", host=constants.BACKEND_HOST, + port=get_api_port(), log_level=loglevel, reload=True, ) @@ -559,6 +581,8 @@ def run_backend_prod( """ num_workers = get_num_workers() command = constants.RUN_BACKEND_PROD + [ + "--bind", + f"0.0.0.0:{get_api_port()}", "--workers", str(num_workers), "--threads",