【问题标题】:Python Flask not returning cookie / ValueError: View function did not return a response [duplicate]Python Flask没有返回cookie / ValueError:查看函数没有返回响应[重复]
【发布时间】:2018-05-16 13:54:46
【问题描述】:

我仍在努力将 Python 中的字符串传递给另一个函数。

我正在尝试遵循此处给出的示例:https://www.tutorialspoint.com/flask/flask_cookies.htm

我试图在我的代码中实现这一点,但我现在得到了以下 Traceback:

  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()

在我尝试将 cookie 从示例函数发送到打印机函数之前,但它返回了相同的错误。

我之前的代码:

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

【问题讨论】:

  • 请发布完整的回溯,而不仅仅是错误消息。此外,此错误何时发生 - 您正在发出什么端点和什么样的请求?谢谢。
  • 刚刚编辑了完整的 Traceback。当我尝试打开127.0.0.1:5000/text 时会发生这种情况。我收到内部服务器错误和上面的 Traceback。

标签: python cookies flask return


【解决方案1】:

verse cookie 值不存在时,verse 变量的值将变为None。这意味着您的 text 视图将返回 NoneFlask 不喜欢并理解为“视图函数没有返回响应”。

您可能需要正确处理这种情况 - 例如,只需返回一个空字符串即可解决问题(当然,这只是一个简单的修复示例,以展示差异):

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

此外,并非sample() 视图中的所有代码路径都返回有效响应 - 确保也解决它(例如,向 sample() 视图发出 GET 请求将导致相同的“视图函数没有返回响应”错误)。

【讨论】:

    【解决方案2】:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-01
      • 2018-01-14
      • 1970-01-01
      • 2015-09-26
      • 2015-01-07
      • 1970-01-01
      • 2015-11-09
      相关资源
      最近更新 更多