Конфликт маршрутов веб — контроллера Odoo-как решить этот случай? Одувер.12, 13, 14, 15

#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, всегда есть шанс, что кто-то делал это раньше. Тем временем я работаю над текущим решением.