Pyramid Framework - Помощь с созданием функции просмотра - PullRequest
2 голосов
/ 12 марта 2011

У меня есть следующий код для просмотра:

def pages_view(request):
    path = request.path.split('/')[1]
    dbsession = DBSession()
    page = dbsession.query(PagesTable).from_statement(
    'SELECT * FROM pages WHERE path=:page_path').params(page_path=path).first()
    pages_dir = os.getcwd() + '/myblog/templates/pages/'
    if page:
        if path == '':
            return render_to_response('myblog:templates/pages/home.mak',
            {'page':page}, request=request)
        elif os.path.isfile(pages_dir + path + '.mak'):
            return render_to_response('myblog:templates/pages/%s.mak'%path,
            {'page':page}, request=request)
        else:
            return render_to_response('myblog:templates/pages/index.mak',
            {'page':page}, request=request)
    raise NotFound()

По сути, он проверяет, существует ли страница в таблице. Если это делает отображает шаблон в соответствии с именем пути или, если шаблон это просто отображает шаблон по умолчанию.

Следующая часть, которую я хочу сделать, это создать отдельную функцию просмотра для моего Страница блога с некоторой логикой для этой страницы.

Я пробовал следующий пример, но он выдает неопределенную ошибку когда при загрузке страницы:

@view_config(renderer='myblog:templates/pages/my-blog.mak')
def blog_view(request):
    one = 'Hello World'
    return {'one':one}

Я прошу прощения за такие основные вопросы. Любое понимание будет дано с благодарностью.

Вот трассировка:

URL: http://127.0.0.1:6543/my-blog/
    File '/Users/Awais/virtualenv/lib/python2.6/site-packages/WebError-0.10.3-py2.6.egg/weberror/evalexception.py', line 431 in respond
  app_iter = self.application(environ, detect_start_response)
File '/Users/Awais/virtualenv/lib/python2.6/site-packages/repoze.tm2-1.0b1-py2.6.egg/repoze/tm/__init__.py', line 23 in __call__
  result = self.application(environ, save_status_and_headers)
File '/Users/Awais/virtualenv/lib/python2.6/site-packages/pyramid-1.0-py2.6.egg/pyramid/router.py', line 158 in __call__
  response = view_callable(context, request)
File '/Users/Awais/virtualenv/lib/python2.6/site-packages/pyramid-1.0-py2.6.egg/pyramid/config.py', line 2916 in _requestonly_view
  response = view(request)
File '/Users/Awais/virtualenv/MyBlog/myblog/views.py', line 25 in pages_view
  {'page':page}, request=request)
File '/Users/Awais/virtualenv/lib/python2.6/site-packages/pyramid-1.0-py2.6.egg/pyramid/renderers.py', line 111 in render_to_response
  return helper.render_to_response(value, None, request=request)
File '/Users/Awais/virtualenv/lib/python2.6/site-packages/pyramid-1.0-py2.6.egg/pyramid/renderers.py', line 322 in render_to_response
  result = self.render(value, system_values, request=request)
File '/Users/Awais/virtualenv/lib/python2.6/site-packages/pyramid-1.0-py2.6.egg/pyramid/renderers.py', line 318 in render
  result = renderer(value, system_values)
File '/Users/Awais/virtualenv/lib/python2.6/site-packages/pyramid-1.0-py2.6.egg/pyramid/mako_templating.py', line 131 in __call__
  result = template.render_unicode(**system)
File '/Users/Awais/virtualenv/lib/python2.6/site-packages/Mako-0.3.6-py2.6.egg/mako/template.py', line 292 in render_unicode
  as_unicode=True)
File '/Users/Awais/virtualenv/lib/python2.6/site-packages/Mako-0.3.6-py2.6.egg/mako/runtime.py', line 575 in _render
  **_kwargs_for_callable(callable_, data))
File '/Users/Awais/virtualenv/lib/python2.6/site-packages/Mako-0.3.6-py2.6.egg/mako/runtime.py', line 607 in _render_context
  _exec_template(inherit, lclcontext, args=args, kwargs=kwargs)
File '/Users/Awais/virtualenv/lib/python2.6/site-packages/Mako-0.3.6-py2.6.egg/mako/runtime.py', line 633 in _exec_template
  callable_(context, *args, **kwargs)
File 'myblog_templates_pages____base_mak', line 27 in render_body
File 'myblog_templates_pages_my_blog_mak', line 34 in render_body
File '/Users/Awais/virtualenv/lib/python2.6/site-packages/Mako-0.3.6-py2.6.egg/mako/runtime.py', line 181 in __str__
  raise NameError("Undefined")
NameError: Undefined

Ответы [ 4 ]

1 голос
/ 13 марта 2011

Тебе было бы лучше ответить на этот вопрос, а не задавать другой.Основываясь на информации здесь и в комментарии , который вы предоставили в другом вопросе , происходит следующее:

Просмотр:


def view1(request)
    args1 = 'a string'
    return render_to_response('page.mak',{'args1':args1}, request=request)

def view2(request)
    args2 = 'a string 2'
    return render_to_response('page.mak',{'args2':args2}, request=request)

У вас есть следующее в вашемФайл шаблона 'page.mak' ...

${args2}

Когда вызывается view1, render_to_response пытается отобразить шаблон page.mak.Словарь {'args1'=args1} используется в качестве контекста.Когда Мако видит ${args2}, он ищет args2 в контекстном словаре.Контекстный словарь, созданный в view1, не имеет args2 в контекстном словаре, поэтому он вызовет ошибку.Отрисовка этой же страницы в view2 работает нормально, потому что view2 правильно передает ожидаемое значение с ключом args2.

Итак, ошибка, которую вы получаете, связана с попыткой отобразить переменную в вашем шаблоне, котораяВы никогда не помещались в контекстный словарь шаблона.

0 голосов
/ 13 марта 2011

Вынимая первую часть кода, исправляет ошибку.

Возможно, потому что render_to_response для my-blog.mak встречается дважды?

В первой части кода у вас есть

return render_to_response('myblog:templates/pages/%s.mak'%path, 

Что делает my-blog.mak, если он существует,

Во второй раз я делаю:

def blog_view(request):
variable = 'hello world'
return render_to_respomse('myblog:templates/pages/my-blog.mak', {'variable':variable}, request=request) 

Дело в том, что мне нужно, чтобы что-то сначала отображало шаблоны, если они существуют или находятся в таблице базы данных.

Вторая часть создает отдельную логику для этого конкретного шаблона.

0 голосов
/ 13 марта 2011

Как сказал Марк Хилдрет в комментариях к исходному вопросу, похоже, что ошибка возникает во время рендеринга вашего шаблона.Вы, вероятно, пытаетесь что-то сделать с переменной, которая не существует / не установлена ​​в вашей функции просмотра.

В первом примере вы всегда устанавливаете переменную page, возможно, это та, которой не хватает.

0 голосов
/ 12 марта 2011

Похоже, у вас проблемы с конфигурацией в вашей системе маршрутизации, попробуйте изменить действие на это, если оно работает, может быть, проблема с разрешением, может опубликовать трассировку стека, что ошибка вызывает?

def blog_view(request):
    one = 'Hello World'

    return render_to_response('myblog:templates/pages/my-blog.mak',
        {'one':one}, request=request)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...