【问题标题】:Can not configure a Starlette .env file无法配置 Starlette .env 文件
【发布时间】:2021-03-21 12:45:57
【问题描述】:

我正在尝试为我的项目设置 .env 文件。但这似乎不正确。

我将 .env 文件存储在与 config.py 文件相同的文件夹中,如下所示。

|__run.py
|___|myproject
    |__config.py
    |__.env

我的 config.py 文件中的代码:

from starlette.config import Config
from starlette.datastructures import Secret, CommaSeparatedStrings
config = Config(".env")
BACKHUG_JWT_AES_KEY = config('BACKHUG_JWT_AES_KEY', default=None)

print(type(BACKHUG_JWT_AES_KEY))
print(BACKHUG_JWT_AES_KEY)

.env 文件中的数据:

BACKHUG_JWT_AES_KEY="SAMPLE_AES_KEY"

但我得到的结果是:

<class 'NoneType'>
None

我不知道为什么它得到了 None 对象。我该如何解决?

我从 run.py 文件运行我的项目。

run.py 文件中的代码:

import uvicorn

if __name__ == "__main__":
    uvicorn.run("myproject.main:app", host="0.0.0.0", port=8888, reload=True)

【问题讨论】:

  • 如果将print(open(".env").read()) 放在config.py 的顶部会得到什么?
  • 你好@ArakkalAbu,当我运行 config.py 文件时,我可以从 .env 文件中获取数据。但是当我使用 run.py 文件运行服务器时。我无法获取数据。

标签: python fastapi starlette


【解决方案1】:

去掉值中的双引号,再试一次:

环境文件:

BACKHUG_JWT_AES_KEY=SAMPLE_AES_KEY

【讨论】:

  • 我以前试过。但是还是不行。
  • 当你print(config)时你会得到什么
  • 当我运行 config.py 文件时,我可以从 .env 文件中获取数据。但是当我使用 run.py 文件运行服务器时。我无法获取数据。
【解决方案2】:

我很确定这是current working directory 的问题。我可以建议两种方法。

  • .env 文件移动到包含run.py 文件的目录中

或者

  • 更改路径config = Config("myproject/.env")

【讨论】:

    【解决方案3】:

    还有更好的办法!

    为此使用 FastAPIPydantic。 Pydantic 提供了一个很棒的 BaseSettings 类。此外,我们为settings and environment variables 提供了很好的文档。

    通过继承 PydanticBaseSettings 来创建一个 Settings 类:

    from pydantic import BaseSettings
    
    class Settings(BaseSettings):
        backhug_jwt_access_key: str
    
        class Config:
            env_file = "myproject/.env"
    

    这个Settings 类自动从.env 文件中读取变量。然后从你的主文件中你可以像这样使用它:

    from . import config
    from functools import lru_cache
    
    from fastapi import Depends, FastAPI
    
    app = FastAPI()
    
    @lru_cache()
    def get_settings():
        return config.Settings()
    
    
    @app.get("/info")
    async def info(settings: config.Settings = Depends(get_settings)):
        return {"jwt_key": settings.backhug_jwt_access_key}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-03
      • 1970-01-01
      • 2019-06-19
      • 2019-01-31
      • 1970-01-01
      • 2020-07-17
      • 1970-01-01
      • 2022-11-03
      相关资源
      最近更新 更多