簡體   English   中英

燒瓶中的動態render_template()

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM