- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是使用 Flask 的新手,所以我正在进行大量研究,以找出构建我的应用程序的最佳方法。我一直在关注应用程序工厂并使用蓝图,但我无法弄清楚如何使用应用程序范围的库并保留应用程序上下文。例如,这是我的应用程序结构:
├── app
│ ├── acuity
│ │ ├── handlers.py
│ │ ├── __init__.py
│ │ └── routes.py
│ ├── config.py
│ ├── __init__.py
│ ├── logs
│ ├── main
│ │ ├── __init__.py
│ │ └── routes.py
│ ├── slackapi.py
│ └── templates
│ └── acuity
│ └── acuity_slack.j2
├── gunicorn_config.py
├── slackbot.py
├── README.md
└── requirements.txt
Main 和 Acuity 是蓝图。 Main 不执行任何操作,唯一的端点是敏锐度。在 acuity.handlers 中,我在 app.slackapi 中导入,但无论我如何切片都无法使用 current_app 。我需要使用应用程序上下文才能访问日志记录和配置变量。
将 slackapi 和我制作的任何其他常用实用函数或常用库放入全局 Flask 上下文中以便我可以在任何蓝图中使用它们的最佳方法是什么?
编辑:这就是我从 acuity.handlers 导入的方式
import dateutil.parser, datetime, os, json, requests
from jinja2 import Environment, FileSystemLoader
import app.slackapi as slack
from flask import current_app
如果我尝试在 app.slackapi 中 fromflask import current_app
,它不会出错。但是如果我尝试像这样使用和引用 current_app :
import time
from slackclient import SlackClient
from flask import current_app
# instantiate Slack client
slack_client = SlackClient(current_app['SLACK_API_TOKEN'])
出现这个错误
Traceback (most recent call last):
File "/usr/local/lib/python3.5/dist-packages/gunicorn/arbiter.py", line 583, in spawn_worker
worker.init_process()
File "/usr/local/lib/python3.5/dist-packages/gunicorn/workers/base.py", line 129, in init_process
self.load_wsgi()
File "/usr/local/lib/python3.5/dist-packages/gunicorn/workers/base.py", line 138, in load_wsgi
self.wsgi = self.app.wsgi()
File "/usr/local/lib/python3.5/dist-packages/gunicorn/app/base.py", line 67, in wsgi
self.callable = self.load()
File "/usr/local/lib/python3.5/dist-packages/gunicorn/app/wsgiapp.py", line 52, in load
return self.load_wsgiapp()
File "/usr/local/lib/python3.5/dist-packages/gunicorn/app/wsgiapp.py", line 41, in load_wsgiapp
return util.import_app(self.app_uri)
File "/usr/local/lib/python3.5/dist-packages/gunicorn/util.py", line 350, in import_app
__import__(module)
File "/opt/slackbot/slackbot/slackbot.py", line 3, in <module>
app = create_app()
File "/opt/slackbot/slackbot/app/__init__.py", line 22, in create_app
from app.acuity import bp as acuity_bp
File "/opt/slackbot/slackbot/app/acuity/__init__.py", line 5, in <module>
from app.acuity import routes
File "/opt/slackbot/slackbot/app/acuity/routes.py", line 4, in <module>
from app.acuity import handlers
File "/opt/slackbot/slackbot/app/acuity/handlers.py", line 3, in <module>
import app.slackapi as slack
File "/opt/slackbot/slackbot/app/slackapi.py", line 10, in <module>
slack_client = SlackClient(current_app['SLACK_API_TOKEN'])
File "/usr/local/lib/python3.5/dist-packages/werkzeug/local.py", line 377, in <lambda>
__getitem__ = lambda x, i: x._get_current_object()[i]
File "/usr/local/lib/python3.5/dist-packages/werkzeug/local.py", line 306, in _get_current_object
return self.__local()
File "/usr/local/lib/python3.5/dist-packages/flask/globals.py", line 51, in _find_app
raise RuntimeError(_app_ctx_err_msg)
RuntimeError: Working outside of application context.
编辑二:app/__init__.py
import logging
from logging.handlers import RotatingFileHandler
import os
from flask import Flask, request, current_app
from config import Config
def create_app(config_class=Config):
app = Flask(__name__)
app.config.from_object(config_class)
from app.main import bp as main_bp
app.register_blueprint(main_bp)
from app.acuity import bp as acuity_bp
app.register_blueprint(acuity_bp)
if not app.debug and not app.testing:
if app.config['LOG_TO_STDOUT'] == "True":
stream_handler = logging.StreamHandler()
stream_handler.setLevel(logging.INFO)
app.logger.addHandler(stream_handler)
else:
if not os.path.exists(os.path.dirname(__file__) + '/logs'):
os.mkdir(os.path.dirname(__file__) + '/logs')
file_handler = RotatingFileHandler(os.path.dirname(__file__) + '/logs/slackbot.log',
maxBytes=10240, backupCount=10)
file_handler.setFormatter(logging.Formatter(
'%(asctime)s %(levelname)s: %(message)s '
'[in %(pathname)s:%(lineno)d]'))
file_handler.setLevel(logging.INFO)
app.logger.addHandler(file_handler)
app.logger.setLevel(logging.INFO)
app.logger.info('Slackbot startup')
return app
app/acuity/__init__.py
from flask import Blueprint
bp = Blueprint('acuity', __name__)
from app.acuity import routes
最佳答案
为什么不能在应用程序包的 __init__.py
文件中添加 create_app()
函数并在此函数中注册您的蓝图?然后,您只需在所需的蓝图中导入 current_app
变量,并根据需要引用 current_app
变量即可。大致如下:
__init__.py:
# .... other package initialization code
def create_app(config_class=Config):
app = Flask(__name__)
app.config.from_object(Config)
# initialization of important app components
# database, login_manager, mail, etc....
db.init_app(app)
# register blueprints
from app.acuity.routes import <acuity_blueprint_variable>
from app.main.routes import blueprint
app.register_blueprint(<acuity_blueprint_variable>)
app.register_blueprint(blueprint)
return app
main/routes.py:
# import your flask dependencies then just reference current_app where necessary
from flask import request, redirect, url_for, render_template, current_app, Response
blueprint = flask.Blueprint('main', __name__)
@blueprint.route("/api", methods=["GET"])
def list_routes():
result = []
for rt in current_app.url_map.iter_rules():
result.append({
"methods": list(rt.methods),
"route": str(rt)
})
return flask.jsonify({"routes": result, "total": len(result)})
在上面的示例中,我展示了在 main
蓝图 list_routes
端点中使用 current_app
,它仅显示为您的应用程序定义的路由。请注意,在您的 create_app
函数中,我导入了在 main.routes
中创建的名为“blueprint”的蓝图变量,并将此蓝图注册到应用程序,以便引用 current_app
变量可以在此蓝图的路由内创建。
希望这是有道理的!
关于python - Flask蓝图架构问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54858978/
这个问题在这里已经有了答案: 关闭 11 年前。
我正在尝试让 Flask 蓝图在 Docker 中运行,但在正确注册蓝图时遇到问题。 我有以下结构: ├── docker-compose.yml ├── nginx │ ├── Dockerfi
目录 1、蓝图的定义 1.1使用蓝图 前言: 我们的应用经常会有很多小模块,比如用户模块、后台管理模块等,虽然这些模块都在同一个应用
我有两个问题类似于之前提出的关于使用 Blueprint CSS(交替行)的表格颜色的问题: 我能够通过将第 th、td、标题更改为与 tbody tr:nth child(even) 相同的颜色来覆
我在美国东部时间今天早上 8 点左右开始使用 Blueprint CSS,我发现自己有以下问题: 什么时候使用容器类? 我应该如何从概念上考虑容器? 容器类是否需要跨度类?为什么或为什么不? 容器类需
我不知道该怎么做。 蓝图api: # coding: utf-8 from flask import Blueprint, render_template from ..models import U
我是虚幻新手我在从 Hud_Blueprint 到 Level_Blueprint 的通信时遇到问题。 我想在 Hud 中添加一个 slider 来控制关卡中立方体的旋转。 在 Hud_Bluepri
在为 rest-service 编写 API-Deocumentation 时,我遇到了一个问题,我想列出所有可能的值,这些值可以作为响应返回。 在下面的例子中,它是“状态”字段,它可以包含枚举的任何
所以调查Blueprint ,默认宽度为 950px 并使用 24 列。我的问题是为什么将列更改为更低或更高?我们最终还是得到了 950px 的总数。 人们这样做是为了更好地控制列吗? 谢谢。 最佳答
我有以下 div。 Lorem ipsum dolor sit amet, consectetur adipiscing elit.
我正在为我的网站元素调整蓝图 CSS 框架,但我注意到蓝图没有遵循它自己的一些规则。我浏览了他们网站上的教程并尝试使用谷歌搜索解决方案,但没有任何效果。 我正在尝试设置这样的页面布局: -------
我目前正在测试 Blueprint为站点创建布局。到目前为止一切顺利,但现在我遇到了一个问题,我想知道是否有任何优雅的解决方案。 我使用的是默认的 24 列布局,在这种情况下我想做类似的事情: ..
刚开始使用 Blueprint CSS,现在开始使用网格,但有一个简单的问题。我在页面顶部创建了一个导航栏,每个链接有 2 列宽(使用 span-2)。在不破坏 css 的情况下将这些链接居中放置在网
在 Flask 网站中,我想创建一个名为 gallery 的蓝图,它是一个灯箱/艺术画廊应用程序,但有多个实例。例如, app.register_blueprint(gallery,url_prefi
我在尝试访问 Flask 蓝图中定义的路由时收到 404,但我不明白为什么。有没有人看到我做错了什么(一般来说我是 Flask 和 Python 的新手,所以它可能是一些基本的东西)? 我的蓝图(te
我正在阅读 this有人回答的问题建议使用这种方法: public static void Method(Func del) { var t = del(42); } 应该这样使用:Method(
我正在尝试将 before_first_request 功能添加到我的 Flask 应用程序的特定 Blueprint 中。您可以在下面看到我有两个蓝图:public 和 admin。 我已经尝试过,
我有一堆单元测试,用于测试蓝图中的某些路由/驼峰实现。这些测试在 95% 的时间里运行得非常好,但是每隔一段时间(大约二十分之一)我就会遇到 Camel 运行时异常: 我正在使用 Camel 2.12
我有兴趣了解 Python 3.3 中将发生哪些语言更改(无需订阅 developer mailing list 并监视消息流)。 我找到了 this page在 python.org 上,但我想知道
我正在尝试从蓝图(我将在模板中使用的函数)在 Jinja 环境中添加一个函数。 主.py app = Flask(__name__) app.register_blueprint(heysyni) M
我是一名优秀的程序员,十分优秀!