#routes #controller #odoo #werkzeug #odoo-14
Вопрос:
У меня есть вопросы к опытным разработчикам:
Я пытаюсь создать новый пользовательский маршрут веб — контроллера. Но я действительно нахожу здесь некоторые проблемы. Позвольте мне привести пример. Представьте себе эту ситуацию:
пользовательский контроллер:
@http.route(['/lt;path:custom_pathgt;/'], type='http', auth='public', website=True) def render_new_template(self, **post):
конфликтует с базовым контроллером:
@http.route('/', type='http', auth="public", website=True, sitemap=True) def index(self, **kw):
Эффект приведенного выше кода заключается в:
- когда я попрошу website.com/custom_path/ URL — он отлично работает и отображает мой пользовательский шаблон
- когда я запрашиваю основную страницу website.com/page URL — адрес-он начинает отображать его с помощью моего нового пользовательского шаблона, а это не тот эффект, который я хочу
Как поступить с маршрутизацией в такой ситуации? Я действительно хочу иметь те же короткие URL-адреса без дополнительного пути, как показано ниже:
/additional_path/lt;path:custom_pathgt;/
или даже короткий:
/c/lt;path:custom_pathgt;/
Я провел некоторое исследование, поскольку маршрутизация веб-контроллера odoo основана на werkzeug, поэтому я нашел несколько рекомендаций, но ни одна из них не была достаточно точной для Odoo.
Были упомянуты следующие решения:
- сделайте это с помощью пользовательского конвертера
- сделайте это с помощью импорта werkzeug.routing, создания собственной реализации карты, изменения werkzeug.routing.Карта для собственной реализации
- используйте «url_for» (вероятно, только в случае колбы), который позволяет указать на
app.py:
app.route('/lt;path:pattern1gt;') app.route('/lt;path:pattern1gt;/lt;path:pattern2gt;') def catch_all(pattern1, pattern2=None): return render_template('template.html', p1=pattern1, p2=pattern2) app.route('/test') def test_routing: args = {'pattern1': 'Posts', 'pattern2': 'create'} return render_template('test.html', args=args)
test.html:
lt;a href="{{url_for('catch_all', **args)}}"gt;click herelt;/agt;
Я знаю, что в odoo есть функция url_for, но она делает не совсем то же самое — она указывает на путь, а не на метод этого маршрута
Я буду очень благодарен за помощь и пожертвую любого парня, который поможет, объяснит и предложит мудрое и красивое решение для моего случая.
Комментарии:
1. Во-первых: хороший ответ, требуется некоторое форматирование, вот и все. Кстати, добро пожаловать в StackOverflow. Во-вторых: да, я знаю, что вам не нужны длинные URL-адреса, но что делать с такими короткими
/c/custom_path
? Он короткий и не будет мешать контроллеру по умолчанию.2. Большое спасибо вам за редактирование.. Да, действительно, я здесь довольно новичок 🙂 пришло время начать задавать вопросы и отвечать на вопросы других. Я также не знал, что проверка орфографии здесь настолько строгая, отныне я буду заботиться о каждом отправлении 😉 Что касается /c/custom_path — если бы этого было достаточно, я бы не стал публиковать свой вопрос. К сожалению, требование состоит в том, чтобы сохранить его в точности таким, как указано выше. /custom_path/ — это обязательно, хотя я надеюсь, что кто-нибудь поможет в этом конкретном случае. Если я найду его, а поделится им здесь для других.
3. Еще не редактировал его 😉 Ладно, меня тоже интересует ответ. Всегда есть чему поучиться 😀
4. Правильно, @CZoellner, всегда есть шанс, что кто-то делал это раньше. Тем временем я работаю над текущим решением.