[英]dynamic render_template() in flask
我的燒瓶應用程序中有多個視圖。 每個視圖都有其自己的子視圖,每個子視圖不斷具有其小模板。 視覺演示和url結構如下:
|-settings ___________ [@app.route(/manage)]
|--menu_settings _____ [@app.route(/manage?current=menu_settings)]
|--main_settings _____ [@app.route(/manage?current=main_settings)]
|--additional_settings [@app.route(/manage?current=additional_settings)]
|-online_store [@app.route(/online_store)]
|--delivery __ [@app.route(/online_store?current=delivery)]
|--payment ___ [@app.route(/online_store?current=payment)]
|--store _____ [@app.route(/online_store?current=store)]
我想做的是使用條件或切換條件。 例如:
@admin.route('/manage', methods = ['GET', 'POST'])
@login_required
def manage(current = ''):
current = request.args.get('current')
if current == 'menu_settings':
return render_template('admin/manage/site_figuration.html',
title = 'Site figuration',
current = current)
elif current == 'internet_market':
return render_template('admin/manage/internet_market.html',
title = 'Internet market',
current = current)
else:
return '404 - Template not found'
我的問題是我做對了嗎? 還是有其他更簡單的方法來克服這個問題? 使用此方法是否合理,或者我必須使用JQuery load()方法?
看來您使事情變得太復雜了。 怎么樣:
@admin.route('/manage')
@admin.route('/manage/<current>')
@login_required
def manage(current = None):
if current == 'menu_settings':
template = 'admin/manage/site_configuration.html'
title = 'Site configuration'
elif current == 'internet_market':
template = 'admin/manage/internet_market.html'
title = 'Internet market'
elif current is None:
template = 'admin/manage/default.html'
title = 'Default page for manage'
else:
flask.abort(404)
return render_template(template, title=title, current=current)
但我也發現有多種路線是更正確的方法。 為什么要重新發明輪子?
@admin.route('/manage')
@login_required
def manage():
return render_template('admin/manage/default.html',
title='Default page for manage',
current=None)
@admin.route('/manage/menu_settings')
@login_required
def manage_menu_settings():
return render_template('admin/manage/site_configuration.html',
title='Site configuration',
current='menu_settings')
@admin.route('/manage/internet_market')
@login_required
def manage_internet_market():
return render_template('admin/manage/internet_market.html',
title='Internet market',
current='internet_market')
注意:請注意,此代碼未經測試,請注意錯誤和/或錯別字。
不,我認為您做對了。
為什么不創建多個視圖呢?
@admin.route('/manage/menu', methods = ['GET', 'POST'])
@login_required
def manage_menu():
return render_template('admin/manage/site_figuration.html',
title = 'Site figuration',
current = request.args.get('current') )
@admin.route('/manage/internet_market', methods = ['GET', 'POST'])
@login_required
def manage_market():
return render_template('admin/manage/internet_market.html',
title = 'Internet market',
current = request.args.get('current') )
這種方法更具可伸縮性/可維護性。
如果您真的想要,可以將所有這些包裝到裝飾器或基於類的視圖中(如果flask支持這些視圖)。
編輯
我主要在金字塔而不是Flask中工作(老實說,您可能要考慮切換,因為它類似但總體上更強大)。
在Pyramid中,我將使用基於類的視圖,看起來像這樣。
@view_defaults(permission='admin')
class admin_views:
def __init__(self, request):
self.request = request
# Assign anything else you want to precalculate
# for all views to a self variable
@view("manage_menu", renderer='manage_menu.jinja2')
def menu(self):
return {'title':'Manage Menu'} #These are your template variables
@view("internet_market", renderer='internet_market.jinja2')
def market(self):
return {'title': 'Internet Market"}
然后您的路線設置將類似於:
config.add_route('manage_menu', '/manage/menu')
config.add_route('internet_market', '/manage/market')
它真正強大的地方是當您開始使用參數時
# Now the request.params dict will have a key of 'product'
# with whatever that path segment is.
config.add_route('product_view','/products/{product}')
您還可以輕松生成與
route_path('view_name', request_obj, #any variables here)
例如
# That'll generate a proper link.
# If the client is using SSL it'll be an https link, etc.
route_path('product_view', self.request, product=5).
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.