《Flask Web开发》学习笔记之bug--(9)【jinja2.exceptions.TemplateSyntaxError: unexpected '%'】

/app/main/views.py

from flask import render_template, session, redirect, url_for, current_app
from .. import db
from ..models import User
from ..email import send_email
from . import main
from .forms import NameForm


@main.route('/', methods=['GET', 'POST'])
def index():
	form = NameForm()
	if form.validate_on_submit():
		user = User.query.filter_by(username=form.name.data).first()
		if user is None:
			user = User(username=form.name.data)
			db.session.add(user)
			session['known'] = False
			if current_app.config['FLASKY_ADMIN']:
				send_mail(current_app.config['FLASKY_ADMIN'], \
					'New User', 'mail//new_user', user=user)
		else:
			session['known'] = True
		session['name'] = form.name.data
		return redirect(url_for('.index'))
	return render_template('index.html', form=form, name=session.get('name'), known=session.get('known', False))

/app/templates/base.html

{% extends "bootstrap/base.html" %}

{% block title %}Flasky{% endblock %}

{% block head %}
{{ super() }}


{% endblock %}

{% block navbar %}

{% endblock %}

{% block content %}
{% for message in get_flashed_messages() %}
{{ message }}
{{% endfor %}} {% block page_content %}{% endblock %}
{% endblock %} {% block scripts %} {{ super() }} {{ moment.include_moment() }} {% endblock %}

报错信息:

$ python3 manage.py runserver --host 0.0.0.0
/home/henry/.local/lib/python3.5/site-packages/flask_sqlalchemy/__init__.py:800: UserWarning: SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future.  Set it to True to suppress this warning.
  warnings.warn('SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future.  Set it to True to suppress this warning.')
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
 * Restarting with stat
/home/henry/.local/lib/python3.5/site-packages/flask_sqlalchemy/__init__.py:800: UserWarning: SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future.  Set it to True to suppress this warning.
  warnings.warn('SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future.  Set it to True to suppress this warning.')
 * Debugger is active!
 * Debugger PIN: 187-944-274
127.0.0.1 - - [17/Jul/2017 17:26:10] "GET / HTTP/1.1" 500 -
Traceback (most recent call last):
  File "/home/henry/.local/lib/python3.5/site-packages/flask/app.py", line 1997, in __call__
    return self.wsgi_app(environ, start_response)
  File "/home/henry/.local/lib/python3.5/site-packages/flask/app.py", line 1985, in wsgi_app
    response = self.handle_exception(e)
  File "/home/henry/.local/lib/python3.5/site-packages/flask/app.py", line 1540, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/home/henry/.local/lib/python3.5/site-packages/flask/_compat.py", line 33, in reraise
    raise value
  File "/home/henry/.local/lib/python3.5/site-packages/flask/app.py", line 1982, in wsgi_app
    response = self.full_dispatch_request()
  File "/home/henry/.local/lib/python3.5/site-packages/flask/app.py", line 1614, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/home/henry/.local/lib/python3.5/site-packages/flask/app.py", line 1517, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/home/henry/.local/lib/python3.5/site-packages/flask/_compat.py", line 33, in reraise
    raise value
  File "/home/henry/.local/lib/python3.5/site-packages/flask/app.py", line 1612, in full_dispatch_request
    rv = self.dispatch_request()
  File "/home/henry/.local/lib/python3.5/site-packages/flask/app.py", line 1598, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/henry/dev/Flask_Web_Python_Henry/flask_henry/app/main/views.py", line 25, in index
    return render_template('index.html', form=form, name=session.get('name'), known=session.get('known', False))
  File "/home/henry/.local/lib/python3.5/site-packages/flask/templating.py", line 134, in render_template
    context, ctx.app)
  File "/home/henry/.local/lib/python3.5/site-packages/flask/templating.py", line 116, in _render
    rv = template.render(context)
  File "/home/henry/.local/lib/python3.5/site-packages/jinja2/environment.py", line 1008, in render
    return self.environment.handle_exception(exc_info, True)
  File "/home/henry/.local/lib/python3.5/site-packages/jinja2/environment.py", line 780, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/home/henry/.local/lib/python3.5/site-packages/jinja2/_compat.py", line 37, in reraise
    raise value.with_traceback(tb)
  File "/home/henry/dev/Flask_Web_Python_Henry/flask_henry/app/templates/base.html", line 43, in template
    {{% endfor %}}
  File "/home/henry/.local/lib/python3.5/site-packages/jinja2/environment.py", line 1005, in render
    return concat(self.root_render_func(self.new_context(vars)))
  File "/home/henry/dev/Flask_Web_Python_Henry/flask_henry/app/templates/index.html", line 1, in top-level template code
    {% extends "base.html" %}
  File "/home/henry/.local/lib/python3.5/site-packages/jinja2/environment.py", line 780, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/home/henry/.local/lib/python3.5/site-packages/jinja2/_compat.py", line 37, in reraise
    raise value.with_traceback(tb)
  File "/home/henry/dev/Flask_Web_Python_Henry/flask_henry/app/templates/base.html", line 43, in template
    {{% endfor %}}
  File "/home/henry/.local/lib/python3.5/site-packages/jinja2/environment.py", line 497, in _parse
    return Parser(self, source, name, encode_filename(filename)).parse()
  File "/home/henry/.local/lib/python3.5/site-packages/jinja2/parser.py", line 896, in parse
    result = nodes.Template(self.subparse(), lineno=1)
  File "/home/henry/.local/lib/python3.5/site-packages/jinja2/parser.py", line 878, in subparse
    rv = self.parse_statement()
  File "/home/henry/.local/lib/python3.5/site-packages/jinja2/parser.py", line 130, in parse_statement
    return getattr(self, 'parse_' + self.stream.current.value)()
  File "/home/henry/.local/lib/python3.5/site-packages/jinja2/parser.py", line 268, in parse_block
    node.body = self.parse_statements(('name:endblock',), drop_needle=True)
  File "/home/henry/.local/lib/python3.5/site-packages/jinja2/parser.py", line 165, in parse_statements
    result = self.subparse(end_tokens)
  File "/home/henry/.local/lib/python3.5/site-packages/jinja2/parser.py", line 878, in subparse
    rv = self.parse_statement()
  File "/home/henry/.local/lib/python3.5/site-packages/jinja2/parser.py", line 130, in parse_statement
    return getattr(self, 'parse_' + self.stream.current.value)()
  File "/home/henry/.local/lib/python3.5/site-packages/jinja2/parser.py", line 198, in parse_for
    body = self.parse_statements(('name:endfor', 'name:else'))
  File "/home/henry/.local/lib/python3.5/site-packages/jinja2/parser.py", line 165, in parse_statements
    result = self.subparse(end_tokens)
  File "/home/henry/.local/lib/python3.5/site-packages/jinja2/parser.py", line 870, in subparse
    add_data(self.parse_tuple(with_condexpr=True))
  File "/home/henry/.local/lib/python3.5/site-packages/jinja2/parser.py", line 615, in parse_tuple
    args.append(parse())
  File "/home/henry/.local/lib/python3.5/site-packages/jinja2/parser.py", line 427, in parse_expression
    return self.parse_condexpr()
  File "/home/henry/.local/lib/python3.5/site-packages/jinja2/parser.py", line 432, in parse_condexpr
    expr1 = self.parse_or()
  File "/home/henry/.local/lib/python3.5/site-packages/jinja2/parser.py", line 445, in parse_or
    left = self.parse_and()
  File "/home/henry/.local/lib/python3.5/site-packages/jinja2/parser.py", line 454, in parse_and
    left = self.parse_not()
  File "/home/henry/.local/lib/python3.5/site-packages/jinja2/parser.py", line 465, in parse_not
    return self.parse_compare()
  File "/home/henry/.local/lib/python3.5/site-packages/jinja2/parser.py", line 469, in parse_compare
    expr = self.parse_math1()
  File "/home/henry/.local/lib/python3.5/site-packages/jinja2/parser.py", line 491, in parse_math1
    left = self.parse_concat()
  File "/home/henry/.local/lib/python3.5/site-packages/jinja2/parser.py", line 502, in parse_concat
    args = [self.parse_math2()]
  File "/home/henry/.local/lib/python3.5/site-packages/jinja2/parser.py", line 512, in parse_math2
    left = self.parse_pow()
  File "/home/henry/.local/lib/python3.5/site-packages/jinja2/parser.py", line 523, in parse_pow
    left = self.parse_unary()
  File "/home/henry/.local/lib/python3.5/site-packages/jinja2/parser.py", line 541, in parse_unary
    node = self.parse_primary()
  File "/home/henry/.local/lib/python3.5/site-packages/jinja2/parser.py", line 578, in parse_primary
    self.fail("unexpected '%s'" % describe_token(token), token.lineno)
  File "/home/henry/.local/lib/python3.5/site-packages/jinja2/parser.py", line 59, in fail
    raise exc(msg, lineno, self.name, self.filename)
jinja2.exceptions.TemplateSyntaxError: unexpected '%'
127.0.0.1 - - [17/Jul/2017 17:26:10] "GET /?__debugger__=yes&cmd=resource&f=style.css HTTP/1.1" 200 -
127.0.0.1 - - [17/Jul/2017 17:26:10] "GET /?__debugger__=yes&cmd=resource&f=jquery.js HTTP/1.1" 200 -
127.0.0.1 - - [17/Jul/2017 17:26:10] "GET /?__debugger__=yes&cmd=resource&f=debugger.js HTTP/1.1" 200 -
127.0.0.1 - - [17/Jul/2017 17:26:11] "GET /?__debugger__=yes&cmd=resource&f=console.png HTTP/1.1" 200 -

浏览器里面的报错信息:

http://localhost:5000/

jinja2.exceptions.TemplateSyntaxError
jinja2.exceptions.TemplateSyntaxError: unexpected '%'

Traceback (most recent call last)
File "/home/henry/.local/lib/python3.5/site-packages/flask/app.py", line 1997, in __call__
return self.wsgi_app(environ, start_response)
File "/home/henry/.local/lib/python3.5/site-packages/flask/app.py", line 1985, in wsgi_app
response = self.handle_exception(e)
File "/home/henry/.local/lib/python3.5/site-packages/flask/app.py", line 1540, in handle_exception
reraise(exc_type, exc_value, tb)
File "/home/henry/.local/lib/python3.5/site-packages/flask/_compat.py", line 33, in reraise
raise value
File "/home/henry/.local/lib/python3.5/site-packages/flask/app.py", line 1982, in wsgi_app
response = self.full_dispatch_request()
File "/home/henry/.local/lib/python3.5/site-packages/flask/app.py", line 1614, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/home/henry/.local/lib/python3.5/site-packages/flask/app.py", line 1517, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/home/henry/.local/lib/python3.5/site-packages/flask/_compat.py", line 33, in reraise
raise value
File "/home/henry/.local/lib/python3.5/site-packages/flask/app.py", line 1612, in full_dispatch_request
rv = self.dispatch_request()
File "/home/henry/.local/lib/python3.5/site-packages/flask/app.py", line 1598, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/home/henry/dev/Flask_Web_Python_Henry/flask_henry/app/main/views.py", line 25, in index
return render_template('index.html', form=form, name=session.get('name'), known=session.get('known', False))
File "/home/henry/.local/lib/python3.5/site-packages/flask/templating.py", line 134, in render_template
context, ctx.app)
File "/home/henry/.local/lib/python3.5/site-packages/flask/templating.py", line 116, in _render
rv = template.render(context)
File "/home/henry/.local/lib/python3.5/site-packages/jinja2/environment.py", line 1008, in render
return self.environment.handle_exception(exc_info, True)
File "/home/henry/.local/lib/python3.5/site-packages/jinja2/environment.py", line 780, in handle_exception
reraise(exc_type, exc_value, tb)
File "/home/henry/.local/lib/python3.5/site-packages/jinja2/_compat.py", line 37, in reraise
raise value.with_traceback(tb)
File "/home/henry/dev/Flask_Web_Python_Henry/flask_henry/app/templates/base.html", line 43, in template
{{% endfor %}}
File "/home/henry/.local/lib/python3.5/site-packages/jinja2/environment.py", line 1005, in render
return concat(self.root_render_func(self.new_context(vars)))
File "/home/henry/dev/Flask_Web_Python_Henry/flask_henry/app/templates/index.html", line 1, in top-level template code
{% extends "base.html" %}
File "/home/henry/.local/lib/python3.5/site-packages/jinja2/environment.py", line 780, in handle_exception
reraise(exc_type, exc_value, tb)
File "/home/henry/.local/lib/python3.5/site-packages/jinja2/_compat.py", line 37, in reraise
raise value.with_traceback(tb)
File "/home/henry/dev/Flask_Web_Python_Henry/flask_henry/app/templates/base.html", line 43, in template
{{% endfor %}}
File "/home/henry/.local/lib/python3.5/site-packages/jinja2/environment.py", line 497, in _parse
return Parser(self, source, name, encode_filename(filename)).parse()
File "/home/henry/.local/lib/python3.5/site-packages/jinja2/parser.py", line 896, in parse
result = nodes.Template(self.subparse(), lineno=1)
File "/home/henry/.local/lib/python3.5/site-packages/jinja2/parser.py", line 878, in subparse
rv = self.parse_statement()
File "/home/henry/.local/lib/python3.5/site-packages/jinja2/parser.py", line 130, in parse_statement
return getattr(self, 'parse_' + self.stream.current.value)()
File "/home/henry/.local/lib/python3.5/site-packages/jinja2/parser.py", line 268, in parse_block
node.body = self.parse_statements(('name:endblock',), drop_needle=True)
File "/home/henry/.local/lib/python3.5/site-packages/jinja2/parser.py", line 165, in parse_statements
result = self.subparse(end_tokens)
File "/home/henry/.local/lib/python3.5/site-packages/jinja2/parser.py", line 878, in subparse
rv = self.parse_statement()
File "/home/henry/.local/lib/python3.5/site-packages/jinja2/parser.py", line 130, in parse_statement
return getattr(self, 'parse_' + self.stream.current.value)()
File "/home/henry/.local/lib/python3.5/site-packages/jinja2/parser.py", line 198, in parse_for
body = self.parse_statements(('name:endfor', 'name:else'))
File "/home/henry/.local/lib/python3.5/site-packages/jinja2/parser.py", line 165, in parse_statements
result = self.subparse(end_tokens)
File "/home/henry/.local/lib/python3.5/site-packages/jinja2/parser.py", line 870, in subparse
add_data(self.parse_tuple(with_condexpr=True))
File "/home/henry/.local/lib/python3.5/site-packages/jinja2/parser.py", line 615, in parse_tuple
args.append(parse())
File "/home/henry/.local/lib/python3.5/site-packages/jinja2/parser.py", line 427, in parse_expression
return self.parse_condexpr()
File "/home/henry/.local/lib/python3.5/site-packages/jinja2/parser.py", line 432, in parse_condexpr
expr1 = self.parse_or()
File "/home/henry/.local/lib/python3.5/site-packages/jinja2/parser.py", line 445, in parse_or
left = self.parse_and()
File "/home/henry/.local/lib/python3.5/site-packages/jinja2/parser.py", line 454, in parse_and
left = self.parse_not()
File "/home/henry/.local/lib/python3.5/site-packages/jinja2/parser.py", line 465, in parse_not
return self.parse_compare()
File "/home/henry/.local/lib/python3.5/site-packages/jinja2/parser.py", line 469, in parse_compare
expr = self.parse_math1()
File "/home/henry/.local/lib/python3.5/site-packages/jinja2/parser.py", line 491, in parse_math1
left = self.parse_concat()
File "/home/henry/.local/lib/python3.5/site-packages/jinja2/parser.py", line 502, in parse_concat
args = [self.parse_math2()]
File "/home/henry/.local/lib/python3.5/site-packages/jinja2/parser.py", line 512, in parse_math2
left = self.parse_pow()
File "/home/henry/.local/lib/python3.5/site-packages/jinja2/parser.py", line 523, in parse_pow
left = self.parse_unary()
File "/home/henry/.local/lib/python3.5/site-packages/jinja2/parser.py", line 541, in parse_unary
node = self.parse_primary()
File "/home/henry/.local/lib/python3.5/site-packages/jinja2/parser.py", line 578, in parse_primary
self.fail("unexpected '%s'" % describe_token(token), token.lineno)
File "/home/henry/.local/lib/python3.5/site-packages/jinja2/parser.py", line 59, in fail
raise exc(msg, lineno, self.name, self.filename)
jinja2.exceptions.TemplateSyntaxError: unexpected '%'
The debugger caught an exception in your WSGI application. You can now look at the traceback which led to the error.
To switch between the interactive traceback and the plaintext one, you can click on the "Traceback" headline. From the text traceback you can also create a paste of it. For code execution mouse-over the frame you want to debug and click on the console icon on the right side.

You can execute arbitrary Python code in the stack frames and there are some extra helpers available for introspection:

dump() shows all variables in the frame
dump(obj) dumps all that's known about the object
Brought to you by DON'T PANIC, your friendly Werkzeug powered traceback interpreter.


找到问题的原因了,这一行前后多了【{ }】















你可能感兴趣的:(Python,bug,Python的坑,debug,Flask)