我正在尝试摆脱OpenID,并使用标准用户名/密码登录,但在尝试转到我的索引/登录页面时,一直收到以下OpenID错误。
在Flask中发现错误
UndefinedError: 'app.forms.RegistrationForm object' has no attribute 'openid'来自jinja的调试器出错
jinja2.exceptions.UndefinedError
UndefinedError: 'app.forms.RegistrationForm object' has no attribute 'openid'
Traceback (most recent call last)
File "/home/jsnyder10/Documents/45/flask/lib/python2.7/site-packages/flask/app.py", line 1997, in __call__
return self.wsgi_app(environ, start_response)
File "/home/jsnyder10/Documents/45/flask/lib/python2.7/site-packages/flask/app.py", line 1985, in wsgi_app
response = self.handle_exception(e)
File "/home/jsnyder10/Documents/45/flask/lib/python2.7/site-packages/flask/app.py", line 1540, in handle_exception
reraise(exc_type, exc_value, tb)
File "/home/jsnyder10/Documents/45/flask/lib/python2.7/site-packages/flask/app.py", line 1982, in wsgi_app
response = self.full_dispatch_request()
File "/home/jsnyder10/Documents/45/flask/lib/python2.7/site-packages/flask/app.py", line 1614, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/home/jsnyder10/Documents/45/flask/lib/python2.7/site-packages/flask/app.py", line 1517, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/home/jsnyder10/Documents/45/flask/lib/python2.7/site-packages/flask/app.py", line 1612, in full_dispatch_request
rv = self.dispatch_request()
File "/home/jsnyder10/Documents/45/flask/lib/python2.7/site-packages/flask/app.py", line 1598, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/home/jsnyder10/Documents/45/flask/lib/python2.7/site-packages/flask_openid.py", line 500, in decorated
return f(*args, **kwargs)
File "/home/jsnyder10/Documents/45/app/views.py", line 104, in login
form=form)
File "/home/jsnyder10/Documents/45/flask/lib/python2.7/site-packages/flask/templating.py", line 134, in render_template
context, ctx.app)
File "/home/jsnyder10/Documents/45/flask/lib/python2.7/site-packages/flask/templating.py", line 116, in _render
rv = template.render(context)
File "/home/jsnyder10/Documents/45/flask/lib/python2.7/site-packages/jinja2/environment.py", line 1008, in render
return self.environment.handle_exception(exc_info, True)
File "/home/jsnyder10/Documents/45/flask/lib/python2.7/site-packages/jinja2/environment.py", line 780, in handle_exception
reraise(exc_type, exc_value, tb)
File "/home/jsnyder10/Documents/45/app/templates/login.html", line 2, in top-level template code
{% extends "base.html" %}
File "/home/jsnyder10/Documents/45/app/templates/base.html", line 66, in top-level template code
{% block content %}{% endblock %}
File "/home/jsnyder10/Documents/45/app/templates/login.html", line 39, in block "content"
File "/home/jsnyder10/Documents/45/flask/lib/python2.7/site-packages/jinja2/environment.py", line 430, in getattr
return getattr(obj, attribute)
UndefinedError: 'app.forms.RegistrationForm object' has no attribute 'openid'调试器在您的WSGI应用程序中捕获到异常。现在,您可以查看导致错误的回溯。
以下是login.html的代码
<!-- extend base layout -->
{% extends "base.html" %}
{% include 'flash.html' %}
<div class="well">
<h3>{{ _('Please Sign In') }}</h3>
<form class="form" action="" method="post" name="login">
{{ form.hidden_tag() }}
<label class="control-label">{{ _('Enter your UserID here:') }}</label>
<div class="controls">
{{ form.username(size=80, class="span4") }}
{% for error in form.username.errors %}
<span class="help-inline">[{{ error }}]</span><br>
{% endfor %}
</div>
</div>
{% endblock %}index.html的代码
<!-- extend base layout -->
{% extends "base.html" %}
{% block content %}
<h1>{{ _('Hi, %(nickname)s!', nickname=g.user.nickname) }}</h1>
{% include 'flash.html' %}
<div class="well">
<form class="form-horizontal" action="" method="post" name="post">
{{ form.hidden_tag() }}
<div class="control-group{% if form.post.errors %} error{% endif %}">
<label class="control-label" for="post">{{ _('Say something:') }}</label>
<div class="controls">
{{ form.post(size=30, maxlength=140) }}
{% for error in form.post.errors %}
<span class="help-inline">[{{ error }}]</span><br>
{% endfor %}
</div>
</div>
<div class="control-group">
<div class="controls">
<input class="btn btn-primary" type="submit" value="{{ _('Post!') }}">
</div>
</div>
</form>
</div>
{% for post in posts.items %}
{% include 'post.html' %}
{% endfor %}
<ul class="pager">
{% if posts.has_prev %}
<li class="previous"><a href="{{ url_for('index', page=posts.prev_num) }}">{{ _('Newer posts') }}</a></li>
{% else %}
<li class="previous disabled"><a href="#">{{ _('Newer posts') }}</a></li>
{% endif %}
{% if posts.has_next %}
<li class="next"><a href="{{ url_for('index', page=posts.next_num) }}">{{ _('Older posts') }}</a></li>
{% else %}
<li class="next disabled"><a href="#">{{ _('Older posts') }}</a></li>
{% endif %}
</ul>
{% endblock %}views.py的代码
from flask import render_template, flash, redirect, session, url_for, request, \
g, jsonify
from flask_login import login_user, logout_user, current_user, login_required
from flask_sqlalchemy import get_debug_queries
from flask_babel import gettext
from datetime import datetime
from guess_language import guessLanguage
from app import app, db, lm, oid, babel
from .forms import LoginForm, EditForm, PostForm, SearchForm, RegistrationForm
from .models import User, Post
from .emails import follower_notification
from .translate import microsoft_translate
from config import POSTS_PER_PAGE, MAX_SEARCH_RESULTS, LANGUAGES, \
DATABASE_QUERY_TIMEOUT
@app.route('/', methods=['GET', 'POST'])
@app.route('/index', methods=['GET', 'POST'])
@app.route('/index/<int:page>', methods=['GET', 'POST'])
@login_required
def index(page=1):
form = PostForm()
if form.validate_on_submit():
language = guessLanguage(form.post.data)
if language == 'UNKNOWN' or len(language) > 5:
language = ''
post = Post(body=form.post.data, timestamp=datetime.utcnow(),
author=g.user, language=language)
db.session.add(post)
db.session.commit()
flash(gettext('Your post is now live!'))
return redirect(url_for('index'))
posts = g.user.followed_posts().paginate(page, POSTS_PER_PAGE, False)
return render_template('index.html',
title='Home',
form=form,
posts=posts)
@app.route('/login', methods=['GET', 'POST'])
@oid.loginhandler
def login():
if g.user is not None and g.user.is_authenticated:
return redirect(url_for('index'))
form = RegistrationForm()
if form.validate_on_submit():
session['remember_me'] = form.remember_me.data
return render_template('login.html',
title='Sign In',
form=form)有人能解释一下app.forms.RegistrationForm到底在做什么吗?它不在我的代码中,即使我在python中运行我的代码,我也不能让app.forms做任何事情。
发布于 2017-05-18 04:55:37
我想通了。在我的login.html模板中,它有引用它的代码,即使在html中使用括号禁用了它,Flask仍然继续读取它,并抛出了一个错误。
给自己的教训是,Flask不会忽略代码,即使去掉了括号,如果忽略的html代码中有错误,Flask也会崩溃。
https://stackoverflow.com/questions/44033320
复制相似问题