视图函数未返回有效响应

时间:2019-09-07 17:22:47

标签: flask-login

我正在尝试按照Miguel出色的教程来写这封信(https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-v-user-logins),复制并粘贴所需的文本以尝试消除错误。我已经到达“在模板中显示已登录的用户”部分,但是当我尝试运行该应用程序时,它可以正常运行,但浏览器显示错误,并且CMD会话中有诊断信息(我使用的是Windows)。进一步提供。

我是Python / Flask的新手,但我猜一个被调用的例程没有返回值,但是在阅读完app.py代码后,我真的找不到我犯了什么错误。如果有人能指出正确的方向,我将继续本教程。

routes.py文件具有登录代码:

@app.route('/login', methods=['GET', 'POST'])
def login():
    if current_user.is_authenticated:
        return redirect(url_for('index'))
    form = LoginForm()
    if form.validate_on_submit():
        user = User.query.filter_by(username=form.username.data).first()
        if user is None or not user.check_password(form.password.data):
            flash('Invalid username or password')
            return redirect(url_for('login'))
        login_user(user, remember=form.remember_me.data)
        next_page = request.args.get('next')
        if not next_page or url_parse(next_page).netloc != '':
            next_page = url_for('index')
        return redirect(next_page)

是发生问题的..if form.validate_on_submit()..

我希望在127.0.0.1:5000上获得登录屏幕,但浏览器显示:-

  

内部服务器错误
  服务器遇到内部错误,无法完成您的请求。服务器过载或应用程序错误。

被调用的URL是“ http://127.0.0.1:5000/login?next=%2F

CMD窗口显示以下错误消息:-

  

[2019-09-07 18:13:47,941]应用程序错误:/ login [GET]异常
  追溯(最近一次通话):
   wsgi_app中的文件“ c:\ users \ tribl \ venv \ lib \ site-packages \ flask \ app.py”,行2446
   响应= self.full_dispatch_request()
   1952行中的文件“ c:\ users \ tribl \ venv \ lib \ site-packages \ flask \ app.py”,格式为full_dispatch_request
      返回self.finalize_request(rv)
   在finalize_request中的文件“ c:\ users \ tribl \ venv \ lib \ site-packages \ flask \ app.py”(1967年)
   响应= self.make_response(rv)
   在make_response中的文件“ c:\ users \ tribl \ venv \ lib \ site-packages \ flask \ app.py”,行2097
   “视图函数未返回有效的响应。”
  TypeError:视图函数未返回有效响应。该函数返回None或在没有return语句的情况下结束。
  127.0.0.1--[2019年9月7日18:13:47]“ GET / login?next =%2F HTTP / 1.1” 500-

1 个答案:

答案 0 :(得分:0)

该错误表明该函数未完成,因为它错过了返回指令。任何视图函数都必须返回某些内容。在您的情况下,您忘记了该行,该行用于指示模板文件在何处,尤其是用于呈现表单。您的代码应如下所示:

@app.route('/login', methods=['GET', 'POST'])
def login():
    if current_user.is_authenticated:
        return redirect(url_for('index'))
    form = LoginForm()
    if form.validate_on_submit():
        user = User.query.filter_by(username=form.username.data).first()
        if user is None or not user.check_password(form.password.data):
            flash('Invalid username or password')
            return redirect(url_for('login'))
        login_user(user, remember=form.remember_me.data)
        next_page = request.args.get('next')
        if not next_page or url_parse(next_page).netloc != '':
            next_page = url_for('index')
        return redirect(next_page)
    return render_template('login.html', form=form)

将以下行标记为:return render_template('login.html', form=form)