简体   繁体   中英

FastAPI - Use TestClient - Loading app fails to missing ENV Variables

I have the following main.py:

...
app = FastAPI(docs_url="/jopapi/documentation", redoc_url=None)

password_encryptor = PasswordEncryptor(
    os.environ.get("JUPYTERHUB_COOKIE_SECRET"), fernet=Fernet
)
...

I already tried to use a custom fixture like this:

@mock.patch.dict(os.environ, {"JUPYTERHUB_COOKIE_SECRET": "471bAcmHjbIdu3KLWphYpgXSW1HNC8q7"}, clear=True)
@pytest.fixture(name="client")
def client_fixture():
    client = TestClient(app)
    yield client

But the following test:

def test_generic(client: TestClient):
        response  = client.get("/jobapi/generic")
        assert response.status_code == 200

still fails, since the environment variable seems not to get set, which results in None

    from src.app.main import app
src\app\main.py:38: in <module>
    password_encryptor = PasswordEncryptor(
src\app\auth.py:33: in __init__
    self.fernet = fernet(self._generate_fernet_key(self.secret))
src\app\auth.py:36: in _generate_fernet_key
    bytestring = secret.encode()
E   AttributeError: 'NoneType' object has no attribute 'encode'

When I set the env variable in the main.py file per hand, it works. How can I fix this?

I think you need to create a .env at the root of your project and then read that file using python's dotenv , so finally you can easily use it with os.environ.get() later in your main.py file,

.env

JUPYTERHUB_COOKIE_SECRET=471bAcmHjbIdu3KLWphYpgXSW1HNC8q7

main.py

import os
basedir = path.abspath(path.dirname(__file__))
load_dotenv(path.join(basedir, ".env"))
app = FastAPI(docs_url="/jopapi/documentation", redoc_url=None)

password_encryptor = PasswordEncryptor(
    os.environ.get("JUPYTERHUB_COOKIE_SECRET"), fernet=Fernet
)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM