- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我对 Flask 还是个新手,所以可能有一个明显的方法可以实现这一点,但到目前为止我还无法从文档中弄清楚。我的应用程序分为几个几乎完全不同的部分,它们共享诸如用户/ session /安全和基本模板之类的东西,但大部分都没有太多交互,并且应该在不同的路径下路由,例如 /part1/...
。我认为这几乎正是蓝图的用途。但是,如果我需要在蓝图下进一步分组路由和逻辑怎么办?
例如,我有 blueprint1
和 url_prefix='/blueprint1'
并且可能在其下我想要围绕用户共享照片和其他内容的 View 集合用户评论他们。我想不出比以下更好的方法了:
# app/blueprints/blueprint1/__init__.py
blueprint1 = Blueprint('blueprint1', __name__, template_folder='blueprint1')
@blueprint1.route('/photos')
def photos_index():
return render_template('photos/index.html')
@blueprint.route('/photos/<int:photo_id>')
def photos_show(photo_id):
photo = get_a_photo_object(photo_id)
return render_template('photos/show.html', photo=photo)
@blueprint.route('/photos', methods=['POST'])
def photos_post():
...
这里的问题是,所有与 blueprint1
的照片部分相关的 View 都位于“顶层”,可能还有视频或音频或其他内容的蓝图(名为 videos_index ()
...)。有没有什么方法可以以更分层的方式对它们进行分组,例如模板如何位于 'blueprint1/photos'
子目录下?当然,我可以将所有照片 View 放在它们自己的模块中,以便将它们分开组织,但是如果我想将父 'blueprint1/photos'
路径更改为其他路径怎么办?我确定我可以发明一个函数或装饰器,将相关路由分组在同一根路径下,但我仍然必须使用 photos_
前缀命名所有函数并像 url_for 一样引用它们('blueprint1.photos_show')
当 Flask 应用变大并且您需要将相似的部分分组和划分在一起时,蓝图似乎是答案,但是当蓝图本身变大时您不能做同样的事情。
作为引用,在 Laravel 中,您可以将相关的“ View ”分组到 Controller
类中,其中 View 是方法。 Controller 可以驻留在分层命名空间中,例如 app\Http\Controllers\Blueprint1\Photocontroller
,路由可以像这样分组在一起
Route::group(['prefix' => 'blueprint1'], function() {
Route::group(['prefix' => 'photos'], function() {
Route::get('/', ['as' => 'blueprint.photos.index', 'uses' => 'ModelApiController@index']);
Route::post('/', ['as' => 'blueprint.photos.store', 'uses' => 'ModelApiController@store']);
Route::get('/{id}', ['as' => 'blueprint.photos.get', 'uses' => 'ModelApiController@get'])
->where('id', '[0-9]+');
});
});
路由可以像 action('Blueprint1\PhotoController@index')
一样获取。
如果我能制作照片蓝图,那么只需执行 blueprint1.register_blueprint(photos_blueprint, url_prefix='/photos')
之类的操作,这些问题就迎刃而解了。不幸的是,Flask 似乎不支持这样的嵌套蓝图。有没有其他方法可以解决这个问题?
最佳答案
Flask 2 发布时支持嵌套蓝图。
[开始:来自文档的部分]
嵌套蓝图
可以在另一个蓝图上注册一个蓝图。
parent = Blueprint('parent', __name__, url_prefix='/parent')
child = Blueprint('child', __name__, url_prefix='/child')
parent.register_blueprint(child)
app.register_blueprint(parent)
子蓝图将获得父名称作为其名称的前缀,子 URL 将以父 URL 前缀为前缀。
url_for('parent.child.create')
/parent/child/create
特定于蓝图的请求函数等在父项中注册后会为子项触发。如果子级没有可以处理给定异常的错误处理程序,则将尝试父级的。
[ END:来自文档的部分 ]
来源:https://flask.palletsprojects.com/en/2.0.x/blueprints/#nesting-blueprints
我的 hacky work around 是我创建了一个名为 ParentBP 的类,它具有以下代码
from typing import List
from flask import Blueprint
class ParentBP(object):
name: str
url_prefix: str
subdomain: str
blueprints: List[Blueprint]
def __init__(self, name="", url_prefix="", subdomain="") -> None:
self.name = name
self.url_prefix = url_prefix
self.subdomain = subdomain
self.blueprints = []
def register_blueprint(self, bp: Blueprint) -> None:
bp.name = self.name + "-" + bp.name
bp.url_prefix = self.url_prefix + (bp.url_prefix or "")
if self.subdomain:
bp.subdomain = self.subdomain
self.blueprints.append(bp)
所以你可以像下面的蓝图那样调用它
blueprint1 = Blueprint("blueprint1", __name__)
blueprint2 = Blueprint("blueprint2", __name__, url_prefix="/bp2")
api_v1 = ParentBP("api-v1", url_prefix="/api/v1")
api_v1.register_blueprint(blueprint1)
api_v1.register_blueprint(blueprint)
为了使界面类似于将蓝图正常注册到 Flask 应用程序,我扩展了 Flask 类,如下所示
class ExtendedFlask(Flask):
def register_blueprint(self, blueprint: Union[Blueprint, ParentBP], **options: Any) -> None:
if isinstance(blueprint, ParentBP):
for bp in blueprint.blueprints:
super().register_blueprint(bp, **options)
else:
return super().register_blueprint(blueprint, **options)
现在您可以正常进行以下操作了
app = ExtendedFlask(__name__)
app.register_blueprint(api_v1)
关于python - Flask 中的嵌套蓝图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33003178/
我想做的是让 JTextPane 在 JPanel 中占用尽可能多的空间。对于我使用的 UpdateInfoPanel: public class UpdateInfoPanel extends JP
我在 JPanel 中有一个 JTextArea,我想将其与 JScrollPane 一起使用。我正在使用 GridBagLayout。当我运行它时,框架似乎为 JScrollPane 腾出了空间,但
我想在 xcode 中实现以下功能。 我有一个 View Controller 。在这个 UIViewController 中,我有一个 UITabBar。它们下面是一个 UIView。将 UITab
有谁知道Firebird 2.5有没有类似于SQL中“STUFF”函数的功能? 我有一个包含父用户记录的表,另一个表包含与父相关的子用户记录。我希望能够提取用户拥有的“ROLES”的逗号分隔字符串,而
我想使用 JSON 作为 mirth channel 的输入和输出,例如详细信息保存在数据库中或创建 HL7 消息。 简而言之,输入为 JSON 解析它并输出为任何格式。 最佳答案 var objec
通常我会使用 R 并执行 merge.by,但这个文件似乎太大了,部门中的任何一台计算机都无法处理它! (任何从事遗传学工作的人的附加信息)本质上,插补似乎删除了 snp ID 的 rs 数字,我只剩
我有一个以前可能被问过的问题,但我很难找到正确的描述。我希望有人能帮助我。 在下面的代码中,我设置了varprice,我想添加javascript变量accu_id以通过rails在我的数据库中查找记
我有一个简单的 SVG 文件,在 Firefox 中可以正常查看 - 它的一些包装文本使用 foreignObject 包含一些 HTML - 文本包装在 div 中:
所以我正在为学校编写一个 Ruby 程序,如果某个值是 1 或 3,则将 bool 值更改为 true,如果是 0 或 2,则更改为 false。由于我有 Java 背景,所以我认为这段代码应该有效:
我做了什么: 我在这些账户之间创建了 VPC 对等连接 互联网网关也连接到每个 VPC 还配置了路由表(以允许来自双方的流量) 情况1: 当这两个 VPC 在同一个账户中时,我成功测试了从另一个 La
我有一个名为 contacts 的表: user_id contact_id 10294 10295 10294 10293 10293 10294 102
我正在使用 Magento 中的新模板。为避免重复代码,我想为每个产品预览使用相同的子模板。 特别是我做了这样一个展示: $products = Mage::getModel('catalog/pro
“for”是否总是检查协议(protocol)中定义的每个函数中第一个参数的类型? 编辑(改写): 当协议(protocol)方法只有一个参数时,根据该单个参数的类型(直接或任意)找到实现。当协议(p
我想从我的 PHP 代码中调用 JavaScript 函数。我通过使用以下方法实现了这一点: echo ' drawChart($id); '; 这工作正常,但我想从我的 PHP 代码中获取数据,我使
这个问题已经有答案了: Event binding on dynamically created elements? (23 个回答) 已关闭 5 年前。 我有一个动态表单,我想在其中附加一些其他 h
我正在尝试找到一种解决方案,以在 componentDidMount 中的映射项上使用 setState。 我正在使用 GraphQL连同 Gatsby返回许多 data 项目,但要求在特定的 pat
我在 ScrollView 中有一个 View 。只要用户按住该 View ,我想每 80 毫秒调用一次方法。这是我已经实现的: final Runnable vibrate = new Runnab
我用 jni 开发了一个 android 应用程序。我在 GetStringUTFChars 的 dvmDecodeIndirectRef 中得到了一个 dvmabort。我只中止了一次。 为什么会这
当我到达我的 Activity 时,我调用 FragmentPagerAdapter 来处理我的不同选项卡。在我的一个选项卡中,我想显示一个 RecyclerView,但他从未出现过,有了断点,我看到
当我按下 Activity 中的按钮时,会弹出一个 DialogFragment。在对话框 fragment 中,有一个看起来像普通 ListView 的 RecyclerView。 我想要的行为是当
我是一名优秀的程序员,十分优秀!