Flask中类似的路线/页面 - 如何删除重复

时间:2018-03-21 17:36:26

标签: python flask

我有一些看起来很相似的子页面: 它们几乎相同,但每种都呈现不同的货币:

@app.route('/', methods=['POST', 'GET'])
@app.route('/dollar', methods=['POST', 'GET'])
def dollar_page():
    form = MyTextForm()
    if form.validate_on_submit():
        values = app.process(request.form["values"])
    labels = get_data()
    return render_template('currency.html', currency="dollar", labels=labels, values=values)


@app.route('/euro', methods=['POST', 'GET'])
def euro_page():
    form = MyTextForm()
    sentiment = ""
    if form.validate_on_submit():
        values = app.process(request.form["values"])
    labels = get_data()
    return render_template('currency.html', currency="euro", labels=labels, values=values)

 @app.route('/pound', methods=['POST', 'GET'])
 def pound_page():
 ... etc ...

在Flask应用程序中摆脱这种重复的最佳方法是什么?有什么模式吗?谢谢!

1 个答案:

答案 0 :(得分:2)

在路线中创建一个变量以接收货币类型。 route变量作为参数传递给view函数。 /路由没有变量,因此在这种情况下提供默认值。

import functools
def verify_currency(f):
  @functools.wraps(f)
  def wrapper(currency_type):
     if currency_type not in ['dollars', 'euros']: #can add more currencies to list later
         return flask.render_template("error.html") #or redirect
      return f(currency_type)
  return wrapper

@app.route('/', methods=['POST', 'GET'], defaults={'currency': 'euro'})
@app.route('/currency/<currency>', methods=['POST', 'GET'])
@verify_currency
def dollar_page(currency):
    form = MyTextForm()
    values = labels = None

    if form.validate_on_submit():
        values = app.process(request.form["values"])
        labels = get_data()

  return render_template('currency.html', currency=currency, labels=labels, values=values)