Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 烧瓶中的动态渲染模板()_Python_Flask - Fatal编程技术网

Python 烧瓶中的动态渲染模板()

Python 烧瓶中的动态渲染模板(),python,flask,Python,Flask,我的flask应用程序中有几个视图。每个视图都有自己的子视图,每个子视图都有自己的小模板。可视化演示和url结构如下所示: |-settings ___________ [@app.route(/manage)] |--menu_settings _____ [@app.route(/manage?current=menu_settings)] |--main_settings _____ [@app.route(/manage?current=main_settings)] |--additi

我的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)]
我想做的是使用if或switch条件。例如:

@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/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') )
这种方法更具可扩展性/可维护性

如果您真的想这样做,您可能会将所有这些都打包到一个decorator或基于类的视图中(如果flask支持这些视图的话)

编辑

我主要是在皮拉米德工作,而不是烧瓶(老实说,你可能想考虑交换,因为它是相似的,但总体上更强大)。 在金字塔中,我会使用一个基于类的视图,看起来像这样

@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)
e、 g


不,我认为你做得不对

为什么不创建多个视图呢

@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') )
这种方法更具可扩展性/可维护性

如果您真的想这样做,您可能会将所有这些都打包到一个decorator或基于类的视图中(如果flask支持这些视图的话)

编辑

我主要是在皮拉米德工作,而不是烧瓶(老实说,你可能想考虑交换,因为它是相似的,但总体上更强大)。 在金字塔中,我会使用一个基于类的视图,看起来像这样

@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)
e、 g


看起来你把事情弄得太复杂了。那么:

@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')
@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)

注意:请注意,此代码未经测试,请注意错误和/或打字错误。

感谢您的回复。我不想使用多视图的原因是我想以某种方式构造视图并保持视图的组织。因为我有50多个视图,还有更多的sub_视图。你能告诉我如何使用装饰器吗?谢谢你的回复。我不想使用多视图的原因是我想以某种方式构造视图并保持视图的组织。因为我有50多个视图,还有更多的sub_视图。你能告诉我如何使用装饰器吗?谢谢你,安德烈先生。我不了解其他人,但我最喜欢你的elif解决方案。如前所述,我希望保持views.py稍微干净一点。由于有50多个视图,因此很难对furete Edits进行编辑。您可以将views.py拆分为多个文件,每种类型的文件各一个。我通常的工作方式是使用views/\uuu init\uuuu.py、views/admin.py、views/general.py、views/api.py等。然后views/\uuu init\uuuuuu.py导入其他文件。这有助于你保持清洁吗?谢谢你,安德烈先生。我不了解其他人,但我最喜欢你的elif解决方案。如前所述,我希望保持views.py稍微干净一点。由于有50多个视图,因此很难对furete Edits进行编辑。您可以将views.py拆分为多个文件,每种类型的文件各一个。我通常的工作方式是使用views/\uuu init\uuuu.py、views/admin.py、views/general.py、views/api.py等。然后views/\uuu init\uuuuuu.py导入其他文件。这有助于保持你的东西干净吗?