瓶404页面不呈现模板
问题描述:
我想弄清楚为什么我的404页面模板不能正确呈现。我能够得到它返回文本,但不是模板。这是我的错误处理功能不起作用:瓶404页面不呈现模板
@app.errorhandler(404)
def page_not_found(error):
return render_template('error.html'), 404
它的工作原理,如果我做这样的事情,而不是:
@app.errorhandler(404)
def page_not_found(error):
return '<h2>Page Not Found.</h2><a href="/">Click here</a> to return home.', 404
我使用的是蓝图,路线我的网址的其余部分。这里是我的更多的urls.py:
main = Blueprint('main', __name__, url_prefix='/language/<lang_code>/')
app.config.from_object(__name__)
babel = Babel(app)
def render(template_name, data):
template_data = {
}
template_data.update(data)
return render_template(template_name, **template_data)
@app.url_defaults
def set_language_code(endpoint, values):
if 'lang_code' in values or not session['lang_code']:
return
if app.url_map.is_endpoint_expecting(endpoint, 'lang_code'):
values['lang_code'] = session['lang_code']
@app.url_value_preprocessor
def get_lang_code(endpoint, values):
if values is not None:
session['lang_code'] = values.pop('lang_code', None)
@app.before_request
def ensure_lang_support():
lang_code = session['lang_code']
if lang_code and lang_code not in app.config['SUPPORTED_LANGUAGES'].keys():
return abort(404)
@babel.localeselector
def get_locale():
if session.get('lang_code') is None:
session['lang_code']=request.accept_languages.best_match(app.config['SUPPORTED_LANGUAGES'].keys())
return session['lang_code']
@app.route('/')
def root():
return redirect(url_for('main.index_en', lang_code='en'))
@main.route('accueil', endpoint="index_fr")
@main.route('home', endpoint="index_en")
def index():
return render('index.html', {})
app.register_blueprint(main)
这里是我得到的错误:
File "lib/python2.7/site-packages/flask/helpers.py", line 296, in url_for appctx.app.inject_url_defaults(endpoint, values)
File "lib/python2.7/site-packages/flask/app.py", line 1623, in inject_url_defaults func(endpoint, values)
File "app/urls.py", line 35, in set_language_code if app.url_map.is_endpoint_expecting(endpoint, 'lang_code'):
File "lib/python2.7/site-packages/werkzeug/routing.py", line 1173, in is_endpoint_expecting for rule in self._rules_by_endpoint[endpoint]:
KeyError: u'None'
任何想法,为什么这可能是这样吗?
答
我想通了!问题不在于我路由我的网址的方式,而在于我的网站上的语言切换方式。
我一直在使用这样的:
{% if session['lang_code']=='en' %}
{% set new_lang_code='fr' %}
{% else %}
{% set new_lang_code='en' %}
{% endif %}
<li><a href="{{ url_for(request.endpoint|replace("_"+session['lang_code'], "_"+new_lang_code))|replace("/"+session['lang_code']+"/", "/"+new_lang_code+"/") }}">{{ _('Fr') }}</a></li>
因为的ErrorHandler功能没有终点,它抛出一个错误。我可以通过在开关周围添加if语句来得到它的工作方式,如下所示:
{% if request.endpoint != None %}
<li><a href="{{ url_for(request.endpoint|replace("_"+session['lang_code'], "_"+new_lang_code))|replace("/"+session['lang_code']+"/", "/"+new_lang_code+"/") }}">{{ _('Fr') }}</a></li>
{% endif %}