2017-12-02 11 views
0

私はまだPythonの文字列を別の関数に渡すのに苦労しています。Python Flaskがクッキーを返さない/ ValueError:View関数が応答を返しませんでした

私はここに挙げた例に従うことをしようとしています

https://www.tutorialspoint.com/flask/flask_cookies.htm

私は自分のコードの中に、これを実装しようとしましたが、私は今、次のトレースバックを取得しています:

そのIを意味します
Traceback (most recent call last): 
    File "/Users/marcel/tensorflow/lib/python3.6/site-packages/flask/app.py", line 1982, in wsgi_app 
    response = self.full_dispatch_request() 
    File "/Users/marcel/tensorflow/lib/python3.6/site-packages/flask/app.py", line 1615, in full_dispatch_request 
    return self.finalize_request(rv) 
    File "/Users/marcel/tensorflow/lib/python3.6/site-packages/flask/app.py", line 1630, in finalize_request 
    response = self.make_response(rv) 
    File "/Users/marcel/tensorflow/lib/python3.6/site-packages/flask/app.py", line 1725, in make_response 
    raise ValueError('View function did not return a response') 
ValueError: View function did not return a response 

何も返されていないのですが、どこが間違っているのか分かりません。ここではかなり失われています。

私の完全なコードは次のようになります。私はちょうどプリンタ機能に私のサンプル関数からクッキーを送信しようとしたが、それは同じエラーを返す前

from __future__ import print_function 
import tensorflow as tf 
import argparse 
import os 
from six.moves import cPickle 
from model import Model 
from six import text_type 
import flask 
from flask import jsonify, render_template, request, make_response 

app = flask.Flask(__name__) 


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

@app.route('/test') 
def tester(): 
    return "This is a test" 

@app.route('/', methods = ['POST', 'GET']) 
def main(): 
    if request.method == 'POST': 
     parser = argparse.ArgumentParser(
          formatter_class=argparse.ArgumentDefaultsHelpFormatter) 
     parser.add_argument('--save_dir', type=str, default='save', 
          help='model directory to store checkpointed models') 
     parser.add_argument('-n', type=int, default=500, 
          help='number of characters to sample') 
     parser.add_argument('--prime', type=text_type, default=u' ', 
          help='prime text') 
     parser.add_argument('--sample', type=int, default=1, 
          help='0 to use max at each timestep, 1 to sample at ' 
           'each timestep, 2 to sample on spaces') 

     args = parser.parse_args() 

     resp = make_response(render_template('sample.html')) 
     resp.set_cookie('args', args) 

     return resp 


@app.route('/sampler', methods = ['POST', 'GET']) 
def sample(): 
    args = request.cookies.get('args') 
    with open(os.path.join(args.save_dir, 'config.pkl'), 'rb') as f: 
     saved_args = cPickle.load(f) 
    with open(os.path.join(args.save_dir, 'chars_vocab.pkl'), 'rb') as f: 
     chars, vocab = cPickle.load(f) 
    model = Model(saved_args, training=False) 
    with tf.Session() as sess: 
     tf.global_variables_initializer().run() 
     saver = tf.train.Saver(tf.global_variables()) 
     ckpt = tf.train.get_checkpoint_state(args.save_dir) 
     if ckpt and ckpt.model_checkpoint_path: 
      saver.restore(sess, ckpt.model_checkpoint_path) 
      if request.method == 'POST': 
       text = model.sample(sess, chars, vocab, args.n, args.prime, 
            args.sample).encode('utf-8') 
       resp = make_response(render_template('text.html')) 
       resp.set_cookie('verse', text) 
       return resp 


@app.route('/text') 
def printer():  
    verse = request.cookies.get('verse') 
    return verse 


@app.errorhandler(404) 
def page_not_found(error): 
    return render_template('404.html'), 404 

if __name__ == '__main__': 
    main() 

前に私のコード:

@app.route('/', methods = ['POST', 'GET']) 
def main(): 
    if request.method == 'POST': 
     parser = argparse.ArgumentParser(
     ....#statements follow    
     args = parser.parse_args() 

     resp = make_response(render_template('sample.html')) 
     resp.set_cookie('args', args) 

     return resp 
    return render_template('home.html') #need to return something here 
+0

エラーメッセージの代わりに、完全なトレースバックを投稿してください。また、どのエンドポイントやどのような要求を出すのか、このエラーはいつ発生しますか?ありがとう。 – alecxe

+0

完全なトレースバックを編集しました。 http://127.0.0.1:5000/textを開こうとすると発生します。私は上記の内部サーバーエラーとトレースバックを取得します。 – Marcel

+0

View関数はすべての場合に有効な応答値を返す必要があります。表示されたコード内の複数のビューには、「なし」を返すパスがあります。 – davidism

答えて

0

verseクッキー値は、の値を提示されていません。

def sample(args): 
    with open(os.path.join(args.save_dir, 'config.pkl'), 'rb') as f: 
     saved_args = cPickle.load(f) 
    with open(os.path.join(args.save_dir, 'chars_vocab.pkl'), 'rb') as f: 
     chars, vocab = cPickle.load(f) 
    model = Model(saved_args, training=False) 
    with tf.Session() as sess: 
     tf.global_variables_initializer().run() 
     saver = tf.train.Saver(tf.global_variables()) 
     ckpt = tf.train.get_checkpoint_state(args.save_dir) 
     if ckpt and ckpt.model_checkpoint_path: 
      saver.restore(sess, ckpt.model_checkpoint_path) 
      text = model.sample(sess, chars, vocab, args.n, args.prime, 
           args.sample).encode('utf-8') 
      resp = make_response(render_template('text.html')) 
      resp.set_cookie('verse', text) 
      return resp 


@app.route('/text') 
def printer():  
    verse = request.cookies.get('verse') 
    return verse 
0

mainでは、あなたがリクエストパラメータのチェック範囲外の値を返す必要があります。 verse変数はNoneになります。つまり、textビューではNoneが返されますが、Flaskでは「ビュー関数から応答が返されませんでした」とは理解できません。

あなたが適切にこのケースを処理する必要があるかもしれません - 例えば、単に空の文字列を返すこと(もちろん、これは違いを実証するための唯一のサンプル簡単な修正です)問題を解決します:

@app.route('/text') 
def printer():  
    return request.cookies.get('verse', '') 

sample()ビュー内のすべてのコードパスが有効な応答を返すわけではありません(たとえば、sample()ビューへのGETリクエストの結果は、同じ "View関数が応答を返しませんでした"というエラーになります) 。

関連する問題