Генши для петли не работает...?
У меня проблемы с использованием Genshi py:for
приписывать. Что я сделал не так? Код выписан ниже; запустить, сделать virtualenv с Python 2, сделать pip install genshi flask
скопируйте файлы, перечисленные в изолированном каталоге, и запустите python hello.py
Код
Содержание hello.py
:
import os.path
import traceback
import flask
import genshi.template
app = flask.Flask(__name__)
template_dir = os.path.join(os.path.dirname(__file__), 'templates')
loader = genshi.template.TemplateLoader(template_dir, auto_reload=True)
MESSAGES = [
"Hello",
"World",
"Sup?",
]
@app.route("/", defaults={"name": ""})
@app.route("/<path:name>")
def show(name):
template_name = name + ".html"
try:
template = loader.load(template_name)
stream = template.generate(
messages=MESSAGES,
)
rendered = stream.render('html', doctype='html')
except Exception as e:
tb = traceback.format_exc()
return "Cannot load /{}: {} <pre>\n{}</pre>".format(name, e, tb)
return rendered
if __name__ == '__main__':
app.run()
Содержание templates/debug.html
:
<!DOCTYPE html>
<html
xmlns="http://www.w3.org/1999/xhtml"
xmlns:py="http://geshi.edgewall.org/"
>
<body>
<p>Messages is a ${str(type(messages))} of length ${len(messages)}</p>
<p>Messages:</p>
<pre>
${'\n'.join(m + "!" for m in messages)}
</pre>
</body>
</html>
Содержание templates/hello.html
:
<!DOCTYPE html>
<html
xmlns="http://www.w3.org/1999/xhtml"
xmlns:py="http://geshi.edgewall.org/"
>
<body>
<h1>Messages</h1>
<ul>
<li py:for="msg in messages">
$msg
</li>
</ul>
</body>
</html>
Эта проблема
Когда я посещаю http://localhost:5000/debug
кажется, все работает, как ожидалось, но когда я бегу http://localhost:5000/hello
Я получаю "Не могу сделать / привет: 'msg' не определено"
1 ответ
Вам не хватает "n" в определении пространства имен. В настоящее время он читает "xmlns:py="http://geshi.edgewall.org/"", но должен читать "xmlns:py="http://genshi.edgewall.org/"'. Это приводит к тому, что Genshi не распознает атрибут "py: for", а затем с радостью пытается вычислить "$msg" без "msg in messages", чтобы определить переменную.