Ошибка Web2Py: неверный функциональный блог/спасибо

Я создаю простой блог, используя Web2Py в Debian Linux. У меня есть контроллер с именем blog.py, к которому я добавил следующую функцию вместе с блоком if:

def display_form():
    form = SQLFORM(db.blog)
    if form.process().accepted:
        session.flash = 'form accepted'
        redirect(URL('thanks'))
    elif form.errors:
        response.flash = 'form has errors'
    else:
        response.flash = 'please fill out the form'
    return locals()

Я продолжил добавлять html-файл «представления» с именем blog/display_form.html с базовым шаблоном, как показано ниже:

{{extend 'layout.html'}}
<h1>Display Form</h1>
{{=form}}

Я нормально загружаю страницу блога "display_form", и она успешно принимает все входные данные, но не перенаправляет на страницу спасибо. Вместо этого браузер выдает ошибку "invalid function blog/thanks".

Я попытался удалить скомпилированное приложение через интерфейс администратора Web2Py и все перекомпилировал. Все еще не работает. Я добавил "представление" для страницы "Спасибо", но это ничего не меняет. Я перезапустил фреймворк Web2Py и веб-сервер, но все равно не работает. Некоторые веб-сайты ссылаются на возможную проблему с route.py, но я не понимаю, почему это вообще может быть уместно.

Пожалуйста, помогите, я натыкаюсь на кирпичную стену.


person Cain    schedule 10.12.2015    source источник


Ответы (2)


Когда вы передаете только один аргумент помощнику URL(), он предполагает, что аргумент — это имя функции, а контроллер — текущий контроллер. Поскольку текущим контроллером является blog, URL('thanks') сгенерирует следующий URL-адрес: /yourapp/blog/thanks.

Предположительно, ваша функция thanks находится в другом контроллере (возможно, default.py), и в этом случае запрос указанного выше URL-адреса вызовет наблюдаемую вами ошибку. Просто измените URL-адрес на URL('default', 'thanks').

person Anthony    schedule 10.12.2015
comment
Спасибо за ваш ответ. У меня нет функции спасибо ни в одном из контроллеров. В default.py его нет. Нужно ли мне его определять? Если да, то есть идеи, как это сделать? Спасибо еще раз. - person Cain; 10.12.2015
comment
Кажется, я где-то читал, что контроллер blog.py должен содержать функцию thanks. blog.py в настоящее время содержит только функции display_form, index, post и view . Я также определил tables blog внутри db.py, но я не уверен, как определить функцию thanks . - person Cain; 10.12.2015
comment
Это что-то вроде: def redirectme(): redirect(URL('Thanks')), или нужны другие аргументы? - person Cain; 10.12.2015
comment
Если вы хотите перенаправить на страницу благодарности, конечно, вы должны создать такую ​​страницу. Способ сделать это в web2py — создать функцию в контроллере и связанное представление. Я не знаю, почему вы ожидаете, что ваш контроллер blog.py будет содержать функцию thanks, если вы на самом деле не создали такую ​​функцию - в конце концов, вы тот, кто создал контроллер blog.py. - person Anthony; 11.12.2015
comment
Это потому, что я полный нуб в том, что касается Python (или любого типа кодирования, если на то пошло). И я только вчера начал использовать Web2Py. Отсюда крик о помощи. ;) Я все равно принял ваш ответ как правильный. Спасибо еще раз. - person Cain; 11.12.2015
comment
Извините, это просто сбило с толку, потому что вы сказали, что я где-то читал, что контроллер blog.py должен содержать функцию благодарности. Было неясно, что это означало, если вы были создателем контроллера blog.py. - person Anthony; 11.12.2015
comment
Не волнуйтесь. Я должен был уточнить. Я следую пошаговому руководству, и на одном из шагов фактически появилась функция thanks в контроллере blog.py. Однако в учебнике иногда пропускаются шаги и/или инструкции, и в итоге я застреваю. Например, в их примере также не было страницы просмотра thanks, но она по-прежнему успешно отображала перенаправление. Так что многие из этих вещей я выясняю самостоятельно или через SO, Google и т. Д. Хотя Stackoverflow довольно крут. Ребята, вы меня много раз выручали по разным вопросам. - person Cain; 11.12.2015

Итак, после настройки ряда вещей, удаления всех скомпилированных файлов и повторного запуска с нуля решение оказалось намного проще, чем я пытался его сделать. Я просто определил функцию с именем thanks в вышеупомянутом контроллере blog.py и вернул локальные переменные, например:

def thanks():
    return locals()

Затем я добавил файл blog/thanks view с основным html-заголовком, в котором указано:

Thank you for submitting the form!

И, наконец, он перенаправил страницу блога display_form на страницу спасибо, тем самым показывая сообщение форма принята (как и ожидалось).

Спасибо за помощь, Антон! Ваше здоровье.

person Cain    schedule 10.12.2015