5

簡単な登録フォームを作成するために、Flask と Flask-SQLAlchemy 拡張機能をいじっています。私の User クラスでは、属性 "email" を nullable=False に設定していますが、サイトでフォームを電子メールを含めずにテストすると、期待どおりに例外をスローする代わりに、新しいユーザーがデータベースに保存されます。なぜそれが起こっているのですか?ご覧いただきありがとうございます。

コードは次のとおりです。

from flask import Flask, url_for, render_template, request, redirect
from flaskext.sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/kloubi.db'
db = SQLAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    email = db.Column(db.String(80), unique=True, nullable=False)
    fname = db.Column(db.String(80))
    lname = db.Column(db.String(80))

    def __init__(self, username, email, fname, lname):
        self.username = username
        self.email = email
        self.fname = fname
        self.lname = lname

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/register/', methods=['GET', 'POST'])
def register():
    if request.method == 'POST':
        new_user = User(fname = request.form['name'], 
                        lname = request.form['surname'],
                        email = request.form['email'],
                        username = request.form['username'])
        db.session.add(new_user)
        db.session.commit()
        return redirect(url_for('index'))
    return render_template('register.html')

if __name__ == '__main__':
    app.debug = True
    app.run(host='0.0.0.0')
4

4 に答える 4

15

問題は、電子メールを入力せずに Web フォームを送信すると、空文字列 "" .. なし... が含まれ、空文字列は同じ als null ではなく、フィールドに保存しても問題ないことです。

wtforms のようなものを使用して、ユーザーの入力を検証することをお勧めします。

于 2012-03-23T19:59:54.770 に答える
1

判定を追加できますif email != ''

于 2013-05-29T11:50:39.367 に答える
1

オプション 1: HTML で自分でフォームを定義している場合

input HTML タグで required 属性を使用するだけで、フォームを送信する前に入力フィールドに入力する必要があることをユーザーに促します。

<form action="#">
  <input type="email" name="email" required>
  <input type="submit">
</form>

オプション 2: WTforms を使用してフォームを定義している場合

次に、フォームクラスを定義するときに validators.required() を使用すると、同じ結果を得ることができます

class MyForm(Form):
    email = EmailField(u'Email', [validators.required()])
于 2020-01-03T07:11:07.447 に答える
-1

html5 属性 email を html で直接使用できます。これを参照してください。

于 2014-08-05T18:28:47.737 に答える