2

以前にフラスコを使用したことがあり、フォームの検証が機能していましたが、何らかの理由で新しいアプリでは機能しません。フォームの基本的なコードは次のとおりです。

from flask.ext.wtf import Form, TextField, TextAreaField, SubmitField, validators,ValidationError

class subReddit(Form):
    subreddit = TextField('subreddit', [validators.Required('enter valid subreddit')])
    next = SubmitField('next')
    change = SubmitField('change')
    user = TextField('user', [validators.Required('enter valid user')])
    fetch = SubmitField('fetch comments')

検証フィールドとしてsubredditを持っているので、空の場合はエラーをスローしてページをリロードしたい.

HTML:

<form class='sub' action="{{ url_for('sr') }}" method='post'>
  {{ form.hidden_tag() }}                    
  <p>
    if you want to enter more than one subreddit, use the + symbol, like this:
    funny+pics+cringepics
  <p>
    <br/>
    {% for error in form.subreddit.errors %}
  <p>{{error}}</p>
  {% endfor %}
  {{form.subreddit.label}}
  {{form.subreddit}}
  {{form.change}}                    
</form>

routes.py にも CSRF_ENABLED=True があります。私は何が欠けていますか?subredditfield を空のままにして [変更] をクリックすると、ページがリロードされるだけで、エラーは発生しません。フィールドにあるものは何でもデータベースに記録され、空にすることはできないため、これは問題です。

編集

@app.route('/index',methods=['GET','POST'])
@app.route('/',methods=['GET','POST'])
def index():
form = subReddit()     
rand = random.randint(0,99)
sr = g.db.execute('select sr from subreddit')       
srr = sr.fetchone()[0]
r = requests.get('http://www.reddit.com/r/{subreddit}.json?limit=100'.format(subreddit=srr))
j = json.loads(r.content)     
pic = j['data']['children'][rand]['data']['url'] 
title = None
if form.validate_on_submit():
    g.db.execute("UPDATE subreddit SET sr=(?)", [form.subreddit.data])          
    print 'validate ' 
    if j['data']['children'][rand]['data']['url']:   
        print 'pic real'                
        sr = g.db.execute('select sr from subreddit')       
        srr = sr.fetchone()[0]  
        r = requests.get('http://www.reddit.com/r/{subreddit}.json?limit=100'.format(subreddit=srr))
        pic = j['data']['children'][rand]['data']['url']
        title = str(j['data']['children'][rand]['data']['title']).decode('utf-8')   
        return render_template('index.html',form=form,srr=srr,pic=pic,title=title)
    else:
        print 'not valid pic'
        return render_template('index.html',form=form,srr=srr,pic=pic)
else:
    print 'not valid submit'
    return render_template('index.html',form=form,srr=srr,pic=pic)           
return render_template('index.html',form=form,srr=srr,pic=pic)
4

2 に答える 2

2

Flask-WTF は、 というフォームに新しいメソッドを追加しますvalidate_on_submit()。これは WTFormsvalidate()メソッドに似ていますが、Flask フレームワークにフックして投稿データにアクセスします。Flask サイトにある例は次のとおりです。

form = MyForm()
if form.validate_on_submit():
    flash("Success")
    return redirect(url_for("index"))
return render_template("index.html", form=form)

validate() を使用しているだけなので、フォームはデータなしで検証しようとしています (もちろん失敗します)。次に、リダイレクトしています。validate_on_submit()上記のように使用してみてください。

于 2013-07-18T18:04:47.130 に答える