3

クラスでエラーをキャッチし、エラー メッセージをクラスからビューに「バブルアップ」させ、最終的にテンプレートに表示する適切な方法は何ですか?

私が今抱えている問題は、モデルとビュー コントローラーの両方で、同じエラーを 2 回キャッチしてしまうことです。これは気分が悪い。

次に例を示します。

モデル/user.py

class User(object):
   errors = []

  def __init__(self, string=None):
    """ Initialize the user object
    """

    #See if the input string is an e-mail address
    try:
      string_is_email = string.index('@')
    except ValueError:
      self.errors.append('Invalid e-mail address')
      raise ValueError

ビュー/login.py

@app.route('/login', methods=['POST', 'GET'])
def login():
  if request.method == 'POST':

    email = request.form['email']
    password = request.form['password']

    #Catch invalid e-mails
    try:
      u = User(email)
    except ValueError:
      errors = u.errors

  #In case the user hasn't POSTED
  try:
    errors = u.errors
  except:
    errors = None

  return render_template('login.html', error=errors)

テンプレート/login.html

    {% if error %}
    <div class="error">
      <ul>
        {% for message in error %}
        <li>{{ message }}</li>
        {% endfor %}
      </ul>
    </div>

これを行うためのよりクリーンな方法はありますか?

4

1 に答える 1

4

そのエラー ハックの代わりに、 flashを使用してメッセージをテンプレートに直接送信できます。さらに、少し変更します。

class User(object):
  def __init__(self, string):
    """ Initialize the user object
    """

    #See if the input string is an e-mail address
    try:
      string_is_email = string.index('@')
    except ValueError:
      raise ValueError('Invalid e-mail address')

@app.route('/login', methods=['POST', 'GET'])
def login():
  if request.method == 'POST':

    email = request.form['email']
    password = request.form['password']

    #Catch invalid e-mails
    try:
      u = User(email)
    except ValueError, e:
      flash(e.message)

の使用方法については、http: //flask.pocoo.org/docs/patterns/flashing/flashのドキュメントを参照してください。

于 2012-09-04T21:00:02.483 に答える