В пирамиде, как я могу вернуть необработанный HTML из представления? - PullRequest
2 голосов
/ 28 октября 2011

Я действительно новичок в Pyramid (и довольно плохо знаком с веб-фреймворками в целом).

Я пытаюсь дойти до стадии, когда я могу вернуть необработанный HTML из представления, чтобы я могДанные разметки, возвращаемые из моего хранилища mongoDB.

Мой __init__.py в моем проекте пирамиды стандартен:

def main(global_config, **settings):
""" This function returns a Pyramid WSGI application.
"""
config = Configurator(root_factory = Root, settings = settings)
config.add_view('hermesweb.views.my_view',
                context = 'hermesweb:resources.Root',
                renderer = 'hermesweb:templates/mytemplate.pt')
config.add_static_view('static', 'hermesweb:static', cache_max_age = 3600)
views.myDB = connect() # connect to my mongoDB

Мой templates/mytemplate.pt выглядит следующим образом:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" xmlns:tal="http://xml.zope.org/namespaces/tal">
<head><title>My test title. . . </title></head>
<body>
    <div>
        <h2>Perform a search</h2>
        <form method="GET" action="">
            <div>
                <input type="text" name="id"/>
            </div>
            <input type="submit" value="Submit"/>
        </form>
        <h2>Results</h2>
        ${results}
    </div>
</body
<html>

Наконец, мой views.py выглядит следующим образом:

myDB = "" # ref to the database is assigned on startup.
def my_view(request):
    key = request.GET.get('id', None)
    results = ""
    if key:
        db_res = myDB.call_some_find_function(key)
        for data in db_res:
            results = "%s <li> %s </li>" % (results, data)
        results = "<ul> %s </ul>" % results

    return {'results': results}

Когда я вставляю термин в форму и вызывается функция my_view, запрашивается база данных, и, однако, получаются правильные результаты,вместо того, чтобы возвращаемая строка превращалась в html на веб-странице, вместо этого она печатается как строка на веб-странице.

Я подозреваю, что это как-то связано с типом содержимого?Но я пока не очень хорошо понимаю Пирамиду.Может кто-нибудь объяснить, как заставить это возвращать html, который интерпретируется браузером как html, а не просто строка?

Дополнительный вопрос - должен ли я даже использовать views.py для этого типа вызова базы данных?Я все еще запутался, когда весь объект Root входит в него.Я использую MongoDB в качестве базы данных.,.

Ответы [ 2 ]

6 голосов
/ 28 октября 2011

Чтобы предотвратить выход хамелеона из переменной ${result}, вам необходимо использовать ${structure: result} согласно документации: http://chameleon.readthedocs.org/en/latest/reference.html#structure

0 голосов
/ 28 октября 2011

Строка экранируется, что является значением по умолчанию для строк, вставляемых в шаблоны, чтобы предотвратить введение непослушного кода на ваш сайт. Чтобы пометить строку как безопасную, нужно пометить ее как литерал, чтобы она не экранировалась. Я считаю, что пирамида (как и пилоны) поставляется с модулем webhelpers, поэтому вы можете импортировать буквальную функцию:

from webhelpers.html import literal

затем замените окончательное назначение результатов на:

results = literal("<ul> %s </ul>" %results)

Если литерал не поставляется с пирамидой, как я подозреваю, см. Этот пост: Язык шаблонов Python Pyramid & Chameleon избегает html

edit: обратите внимание, что вам, вероятно, следует экранировать данные из базы данных, прежде чем вводить их в html для безопасности. Вы можете использовать cgi.escape для этого.

...