2017-05-29 11 views
1

私はPythonの世界では新規で、Googleのアップルエンジンで外部APIを使用しようとしていますが、selectFieldでApiのjsonレスポンスでフォームの検証を行いたいと思います。Python - Flask Validate SelectField

これは私のコード

class CommentForm(FlaskForm): 
    name = StringField('Nome', [required()]) 
    nazionalita = SelectField('Nazionalita',[required()]) 
    eta = IntegerField('Eta', [required()]) 
    Comment = TextAreaField('Commento', [required()]) 
    Data = DateTimeField('Data',[required()],format='%d/%m/%Y',) 
    submit = SubmitField('Inserisci', [required()]) 

    def validate_nazionalita(form): 
     if not form.nazionalita.data == None: 
      raise ValidationError('Nazionalita non selezionata') 

@app.route('/insert', methods=['GET']) 
def insert(): 
    form = CommentForm() 
    url = 'https://ajayakv-rest-countries-v1.p.mashape.com/rest/v1/all' 
    req = urllib2.Request(url) 
    req.add_header('X-Mashape-Key', MASHAPE_KEY) 
    req.add_header('Accept', 'application/json') 
    urlresponse = urllib2.urlopen(req) 
    content = urlresponse.read() 

    responde = make_response(content) 

    responde.headers['content-type']='application/json' 
    data = json.loads(responde.data) 
    nation = list(data) 
    scelte =[] 
    scelte = ([(s['callingCodes'] , s['name'])for s in nation]) 
    form.nazionalita.choices= scelte 
    return render_template('insert.html', form=form) 


@app.route('/insert', methods=['POST']) 
def submit(): 
    form = CommentForm(request.form) 
    if not form.validation(): 
     return render_template('insert.html', form=form), 400 
    return redirect('/') 

であり、これはHTMLページです:

<form method="post" action="/insert"> 
     {{ form.csrf_token }} 
     <div> {{form.name.label}}: {{form.name}} </div> 

     {% if form.name.errors %} 
      <ul class=errors> 
       {% for error in form.name.errors %} 
        <li>{{ error }}</li> 
       {% endfor %} 
      </ul> 
     {% endif %} 


     <div> {{form.nazionalita.label}}: {{form.nazionalita}} </div> 

     {% if form.nazionalita.errors %} 
      <ul class=errors> 
       {% for error in form.nazionalita.errors %} 
        <li>{{ error }}</li> 
       {% endfor %} 
      </ul> 
     {% endif %} 

     <div> {{form.eta.label}}: {{form.eta}} </div> 

     {% if form.eta.errors %} 
      <ul class=errors> 
       {% for error in form.eta.errors %} 
        <li>{{ error }}</li> 
       {% endfor %} 
      </ul> 
     {% endif %} 

     <div> {{form.Data.label}}: {{form.Data}} </div> 

     {% if form.Data.errors %} 
      <ul class=errors> 
       {% for error in form.Data.errors %} 
        <li>{{ error }}</li> 
       {% endfor %} 
      </ul> 
     {% endif %} 

     <div> {{form.Comment.label}}: {{form.Comment}} </div> 

     {% if form.Comment.errors %} 
      <ul class=errors> 
       {% for error in form.Comment.errors %} 
        <li>{{ error }}</li> 
       {% endfor %} 
      </ul> 
     {% endif %} 

     <div> {{form.submit}} </div> 
    </form> 

私はselectFieldを削除し、すべてうまく動作しますが、それに誤りがある場合:

`Traceback (most recent call last): 
    File "/home/roberto/Scrivania/google-cloud-sdk/platform/google_appengine/google/appengine/runtime/wsgi.py", line 267, in Handle 
    result = handler(dict(self._environ), self._StartResponse) 
    File "/home/roberto/Scrivania/simulazione/lib/flask/app.py", line 1994, in __call__ 
    return self.wsgi_app(environ, start_response) 
    File "/home/roberto/Scrivania/simulazione/lib/flask/app.py", line 1985, in wsgi_app 
    response = self.handle_exception(e) 
    File "/home/roberto/Scrivania/simulazione/lib/flask/app.py", line 1540, in handle_exception 
    reraise(exc_type, exc_value, tb) 
    File "/home/roberto/Scrivania/simulazione/lib/flask/app.py", line 1982, in wsgi_app 
    response = self.full_dispatch_request() 
    File "/home/roberto/Scrivania/simulazione/lib/flask/app.py", line 1614, in full_dispatch_request 
    rv = self.handle_user_exception(e) 
    File "/home/roberto/Scrivania/simulazione/lib/flask/app.py", line 1517, in handle_user_exception 
    reraise(exc_type, exc_value, tb) 
    File "/home/roberto/Scrivania/simulazione/lib/flask/app.py", line 1612, in full_dispatch_request 
    rv = self.dispatch_request() 
    File "/home/roberto/Scrivania/simulazione/lib/flask/app.py", line 1598, in dispatch_request 
    return self.view_functions[rule.endpoint](**req.view_args) 
    File "/home/roberto/Scrivania/simulazione/app/handlers/insert.py", line 46, in submit 
    if not form.validate(): 
    File "/home/roberto/Scrivania/simulazione/lib/wtforms/form.py", line 310, in validate 
    return super(Form, self).validate(extra) 
    File "/home/roberto/Scrivania/simulazione/lib/wtforms/form.py", line 152, in validate 
    if not field.validate(self, extra): 
    File "/home/roberto/Scrivania/simulazione/lib/wtforms/fields/core.py", line 193, in validate 
    self.pre_validate(form) 
    File "/home/roberto/Scrivania/simulazione/lib/wtforms/fields/core.py", line 468, in pre_validate 
    for v, _ in self.choices: 
    TypeError: 'NoneType' object is not iterable` 

と私はなぜこれを解決したeを理解していない。
ありがとうございます。

+1

こんにちはRoberto、ようこそ、Stackoverflow。迅速で有益な回答を得るためには、[最小限で完全で検証可能なサンプルを作成する方法](https://stackoverflow.com/help/mcve)を参照し、コードを絞り込んで多くのオーバーヘッドはありません。 – MrLeeh

+0

mrleehありがとう、私はあなたのアドバイスを受け取ります –

+0

'scelte'を印刷できますか? –

答えて

1

私はついにあなたのエラーを再現することができました.GETメソッドのビュー機能で選択肢を作成しています。しかし、あなたはPOSTメソッドのビュー関数にそれらを追加していません。あなたのポスト機能にも選択肢を追加し、あなたがそれらを検証することができ

@app.route('/insert', methods=['POST']) 
def submit(): 
    form = CommentForm(request.form) 
    scelte = [(s['callingCodes'] , s['name'])for s in nation] 
    form.nazionalita.choices= scelte 

    if not form.validate(): 
     return render_template('insert.html', form=form), 400 
    return redirect('/') 

この方法:少しあなたのsubmit()機能を変更することによって、これを修正してください。でもクリーンなアプローチは、同じ機能でGETとPOSTハンドラを配置するようになります:

注:form.validate()機能を使用すると、form.nazionalita.choicesリストを反復処理して、有効な選択をしたかどうかを確認しようとするあなたの元のバージョンで 。 Formクラスに何も選択していないので、Noneです。 Noneを反復しようとすると、あなたが持っている例外が発生します。

+0

あなたの時間のためにありがとう@ Mrleehあなたは、グローバルvarとして私は国をsholud意味ですか?ところで私のフォームは検証されていないようです() "AttributeError: 'CommentForm'オブジェクトに属性 '検証'がありません" –

+0

http://flask-wtf.readthedocs.io/en/stable/quickstart.html#バリデーションフォーム。このパターンと一致するようにコードを修正してください。 – MrLeeh

関連する問題