Python 从Sanic应用程序中的蓝图检索配置

Python 从Sanic应用程序中的蓝图检索配置,python,python-3.x,flask,sanic,Python,Python 3.x,Flask,Sanic,我有一个Sanic应用程序,希望从blueprint中检索app.config,因为它保存着MONGO_URL,我将从blueprint中将其传递给存储库类 但是,我找不到如何在蓝图中获取app.config。我也检查了烧瓶溶液,但它们不适用于Sanic 我的app.py: from sanic import Sanic from routes.authentication import auth_route from routes.user import user_route app = S

我有一个Sanic应用程序,希望从blueprint中检索
app.config
,因为它保存着
MONGO_URL
,我将从blueprint中将其传递给存储库类

但是,我找不到如何在蓝图中获取
app.config
。我也检查了烧瓶溶液,但它们不适用于Sanic

我的
app.py

from sanic import Sanic
from routes.authentication import auth_route
from routes.user import user_route

app = Sanic(__name__)
app.blueprint(auth_route, url_prefix="/auth")
app.blueprint(user_route, url_prefix="/user")

app.config.from_envvar('TWEETBOX_CONFIG')
app.run(host='127.0.0.1', port=8000, debug=True)
import settings

...
auth_route = Blueprint('authentication')
mongo_url = settings.MONGO_URL
user_repository = UserRepository(mongo_url)
... 
我的
验证蓝图

import jwt
from sanic import Blueprint
from sanic.response import json, redirect
from domain.user import User
from repository.user_repository import UserRepository
...

auth_route = Blueprint('authentication')
mongo_url = ?????
user_repository = UserRepository(mongo_url)
...

@auth_route.route('/signin')
async def redirect_user(request):
    ...

烧瓶中有一个名为current_app的变量。您可以使用
current\u app.config[“MONGO\u URL”]


但是我不熟悉Sanic。

我认为您可以创建一个config.py来保存您的配置,就像

config.py

config = {
    'MONGO_URL':'127.0.0.1:27017'
}
from config import config

mongo_url = config['MONGO_URL']
并在app.py中使用它

config = {
    'MONGO_URL':'127.0.0.1:27017'
}
from config import config

mongo_url = config['MONGO_URL']

我会建议一个稍微不同的方法,基于(非常有趣的阅读,其中提供了一个关于如何保护和隔离您的敏感信息的很好的指南)

一般的想法是将敏感变量和配置变量放在一个文件中,该文件将被忽略,因此只能在本地使用

我将尝试介绍我倾向于使用的方法,以便尽可能接近12因素指南:

  • 创建一个
    .env
    文件,其中包含项目变量:

    MONGO_URL=http://no_peeking_this_is_secret:port/
    SENSITIVE_PASSWORD=for_your_eyes_only
    CONFIG_OPTION_1=config_this
    DEBUG=True
    ...
    
  • 重要)
    .gitignore
    文件中添加
    .env
    .env.
    ,从而保护您的敏感信息不被上传到GitHub

  • 创建一个
    env.example
    (注意不要在开头用
    命名,因为它会被忽略)
    在该文件中,您可以放置一个预期配置的示例,以便通过简单的
    复制、粘贴、重命名为.env
    来重现

  • 在名为
    settings.py
    的文件中,用于将配置文件读入变量:

    from decouple import config
    
    
    MONGO_URL = config('MONGO_URL')
    CONFIG_OPTION_1 = config('CONFIG_OPTION_1', default='')
    DEBUG = config('DEBUG', cast=bool, default=True)
    ...
    
  • 现在,您可以在实现所需的任何地方使用这些变量:

    myblueprint.py

    from sanic import Sanic
    from routes.authentication import auth_route
    from routes.user import user_route
    
    app = Sanic(__name__)
    app.blueprint(auth_route, url_prefix="/auth")
    app.blueprint(user_route, url_prefix="/user")
    
    app.config.from_envvar('TWEETBOX_CONFIG')
    app.run(host='127.0.0.1', port=8000, debug=True)
    
    import settings
    
    ...
    auth_route = Blueprint('authentication')
    mongo_url = settings.MONGO_URL
    user_repository = UserRepository(mongo_url)
    ... 
    

  • 作为一名收尾者,我想指出的是,这种方法是框架(甚至语言)不可知的,因此您可以在Sanic以及Flask以及任何需要它的地方使用它

    Sanic的方式

    在视图方法中,您可以从
    请求
    对象访问
    应用程序
    实例。因此,请访问您的配置

    @auth_route.route('/signin')
    async def redirect_user(request):
        configuration = request.app.config
    

    我看到有一个名为
    request
    的参数,它是Sanic的请求对象。还有一个名为
    app
    的属性,它是对处理此请求的Sanic应用程序对象的引用。感谢您的回复,但是,我不想把我的关键信息放入python代码中,因为密码和其他信息应该分开,并放在类似.config的文件中,以实现持续集成和安全性,它有点忽略了这个问题,回避了Danica在这个问题上的实际植入。@酿酒师这基本上是正确的(我不是直接解决眼前的问题),但这将解决这个问题,可能还会解决其他一些配置过程中的问题。它将允许OP以一种不会最终将安全信息上传到git的方式存储他/她的
    MONGO_URL
    。这是访问基本配置的一种好方法,但不应在其他地方使用;我会像这样设置配置,但随后使用下面@TheBrewmaster描述的方法从蓝图中访问该配置。@ElYobo如本答案末尾所述,这是一种框架无关的方法,遵循12factor应用程序的指导原则(例如,即使在烧瓶/Sanic/Falcon/Django等应用程序中,也可以使用相同的方法,并得到相同的结果)。因此,我并不是说酿酒师的答案是错误的(远远不是,它的工作原理应该是正确的,我已经对它进行了投票),我只是添加了一种通用的方法,在撰写此答案时这样做:)是的,这是有道理的,您需要注意的是,步骤5中的最后一个示例是特定于框架的,它显示了使用Sanic(直接在蓝图中访问配置)不应该使用的方式。也许您可以更新特定于框架的部分,以显示如何将其分配给主应用程序配置?