6

我有一个 Sanic 应用程序,想app.config从蓝图中检索它MONGO_URL,我会将它从蓝图中传递给存储库类。

但是,我找不到如何进入app.config蓝图。我还检查了 Flask 解决方案,但它们不适用于 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)

我的auth blueprint

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):
    ...
4

4 回答 4

11

萨尼奇的方式...

在视图方法中,您可以apprequest对象访问实例。因此,访问您的配置。

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

2021-10-10 更新

有两种更新的方法可以获取配置值(或者,也许更准确地获取可以从中获取配置的应用程序实例)。第一个版本可能更准确地回答了如何从蓝图获取配置的问题。但是,第二种选择可能是首选方法,因为它正是针对这种用途而设计的。

替代#1

从 v21.3开始,蓝图可以访问它们所附加的 Sanic 应用程序。

因此,如果您有一个蓝图对象,您可以将其追溯到应用程序实例,因此也可以追溯到配置值。

app = Sanic("MyApp")
bp = Blueprint("MyBlueprint")

app.blueprint(bp)

assert bp.apps[0] is app

Blueprint.apps属性是set因为可以将单个蓝图附加到多个应用程序。

替代#2

从 v20.12开始, Sanic 有一个用于从全局范围检索应用程序实例的内置方法。这意味着一旦应用程序被实例化,您就可以使用: 检索它Sanic.get_app()

app = Sanic("MyApp")

assert Sanic.get_app() is app

此方法仅在有一个Sanic可用实例时才有效。如果您有多个应用程序实例,则需要使用可选name参数:

app1 = Sanic("MyApp")
app2 = Sanic("MyOtherApp")

assert Sanic.get_app("MyApp") is app1
于 2018-01-24T01:39:24.533 回答
2

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

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

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

  1. 创建一个.env包含项目变量的文件:

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

  3. 创建一个env.example(注意不要.在开头用 a 命名,因为它会被忽略)。
    在该文件中,您可以放置​​一个预期配置的示例,以便通过简单的copy, paste, rename to .env.

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

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

    myblueprint.py

    import settings
    
    ...
    auth_route = Blueprint('authentication')
    mongo_url = settings.MONGO_URL
    user_repository = UserRepository(mongo_url)
    ... 
    

作为终结者,我想指出,此方法与框架(甚至语言)无关,因此您可以在需要它的任何地方以及任何地方使用SanicFlask

于 2018-01-19T10:38:11.463 回答
0

Flask 中有一个名为 current_app 的变量。您可以使用current_app.config["MONGO_URL"].
但我对 Sanic 并不熟悉。

于 2017-04-11T23:46:33.340 回答
0

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

配置文件

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

并在app.py中使用

from config import config

mongo_url = config['MONGO_URL']
于 2017-04-14T02:15:43.637 回答