问题描述
我还是Flask的新手,所以可能有一个明显的方法可以实现这一点,但是我从文档中还没有找到它。我的应用程序分为几个主要不同的部分,它们共享诸如用户/会话/安全性和基本模板以及所有内容,但大多数情况不是很大的交互,并且应该在不同的路径下路由,如 / part1 / ...
。我认为这几乎是蓝图。但是,如果我需要在蓝图下进一步分组路线和逻辑怎么办? 例如,我有 blueprint1
url_prefix ='/ blueprint1'
,也许根据这一点,我想收集一些视图,围绕一个用户分享照片和其他用户评论他们。我不能想到一个更好的方式:
#app / blueprints / blueprint1 / __ init__.py
blueprint1 =蓝图('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('照片',methods = ['POST'])
def photos_post():
...
这里的问题是与 blueprint1
的照片部分相关的所有视图都位于顶级,右侧可能是视频的蓝图,音频或其他(名为 videos_index()
...)。有没有办法以更分层次的方式分组,就像模板在'blueprint1 / photos'
子目录下的方式如何?当然,我可以将所有的照片视图放在自己的模块中,以便将它们分开组织,但是如果我想要将父节点'blueprint1 / photos'
路径更改为其他?我相信我可以发明一个在相同根路径下组合相关路由的功能或装饰器,但是我仍然必须使用照片_
前缀和引用命名所有功能他们喜欢 url_for('blueprint1.photos_show')
当Flask应用程序变大时,似乎蓝图是答案,您需要将类似的部件组合在一起,并且不能当蓝图本身变大时,请执行相同的操作。
在Laravel中,您可以在控制器
class,其中的视图是方法。控制器可以驻留在诸如 app \Http\Controllers\Blueprint1\Photocontroller
的分层命名空间中,路由可以分组在一起,如
Route :: group(['prefix'=>'blueprint1'],function(){
Route :: group前缀'=>'照片'],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中的当前功能。你必须手动执行。你可能编写一些适合你特定情况的东西,但是一般的解决方案还没有添加到Flask中。有关问题跟踪器的一些讨论:
I'm still new to Flask, so there may be an obvious way to accomplish this, but I haven't been able to figure it out so far from the documentation. My app is divided into several mostly disparate parts that share things like users/sessions/security and base template and everything but mostly do not interact much, and should be routed under different paths like /part1/...
. I think this is pretty much exactly what blueprints are for. But what if I need to group routes and logic further under a blueprint?
For example, I have blueprint1
with url_prefix='/blueprint1'
and maybe under that I want to have a collection of views revolving around a user sharing photos and other users commenting on them. I can't think of a better way of doing it than:
# 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():
...
The problem here is that all the views related to the photos section of blueprint1
are located at the "top level," right with maybe blueprints for videos or audio or whatever (named videos_index()
...). Is there any way to group them in a more hierarchical manner, like how the templates go under the 'blueprint1/photos'
sub-directory? Of course I can put all the photo views in their own module to keep them organized separately, but what if I want to change the parent 'blueprint1/photos'
path to something else? I'm sure I can invent a function or decorator that groups related routes under the same root path, but then I still have to name all the functions with the photos_
prefix and reference them like url_for('blueprint1.photos_show')
It seems like blueprints are the answer when a Flask app gets large and you need to group and compartmentalize similar parts together, but you cannot do the same thing when the blueprints themselves get large.
For reference, in Laravel you can group related "views" under a Controller
class where the views are methods. Controllers can reside in hierarchical namespaces like app\Http\Controllers\Blueprint1\Photocontroller
, routes can be grouped together like
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]+');
});
});
and routes can be gotten like action('Blueprint1\PhotoController@index')
.
If only I could make a photos blueprint, then just do blueprint1.register_blueprint(photos_blueprint, url_prefix='/photos')
or the like, these problems would pretty much be solved. Unfortunately Flask does not seem to support nesting blueprints like this. Is there an alternative way to handle this problem?
Unfortunately, nested blueprints are not a current feature in Flask. You'll have to do it manually. You could probably code something that works for your specific case, but a general solution has not been added to Flask. There has been some discussion on the issue tracker:
这篇关于嵌套蓝图在Flask?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!