2 маршрута с разными функциями просмотра, но с одинаковым шаблоном URL (с параметром), но Flask / Jinja2 решили пренебречь одной из функций просмотра - PullRequest
1 голос
/ 24 апреля 2020

У меня есть 2 маршрута, и они имеют одинаковый шаблон URL - @app.route('/<var1>/') и @app.route('/<var2>/').

И у них разные функции просмотра - view_fcn_1 и view_fcn_2 соответственно.


Однако, когда я вызвал их в своем шаблоне my-template.html по

<a href="{{url_for('view_fcn_1', var1='I-am-var1') }}">First View Function</a>
<a href="{{url_for('view_fcn_2', var1='I-am-var2') }}">Second View Function</a>

На самом деле я вошел в view_fcn_1, когда нажимал на ссылку для функции второго просмотра

Я знаю, что могу вроде решить проблему, сделав шаблон URL отличается, например, @app.route('/<var1>/1') и @app.route('/<var2>/2').

Но мне интересно, является ли это ожидаемым поведением или я что-то упустил, поэтому я в конечном итоге получаю такое забавное поведение моего кода?

Большое вам спасибо за продвинутый уровень!


Ниже показано, что я действительно вошел в view_fcn_1, когда я предположительно звонил view_fcn_2

 * Running on http://0.0.0.0:5020/ (Press CTRL+C to quit)
127.0.0.1 - - [25/Apr/2020 02:28:48] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [25/Apr/2020 02:28:48] "GET /favicon.ico HTTP/1.1" 308 -
first
127.0.0.1 - - [25/Apr/2020 02:28:48] "GET /favicon.ico/ HTTP/1.1" 200 -
127.0.0.1 - - [25/Apr/2020 02:28:49] "GET /I-am-var1/ HTTP/1.1first
" 200 -
127.0.0.1 - - [25/Apr/2020 02:28:50] "first
GET /favicon.ico/ HTTP/1.1" 200 -
first
127.0.0.1 - - [25/Apr/2020 02:28:51] "GET /favicon.ico/ HTTP/1.1" 200 -
first
127.0.0.1 - - [25/Apr/2020 02:28:52] "GET /I-am-var2/ HTTP/1.1" 200 -
first
127.0.0.1 - - [25/Apr/2020 02:28:52] "GET /favicon.ico/ HTTP/1.1" 200 -

Мое приложение:

from flask import Flask, render_template
app = Flask(__name__)

@app.route('/<var1>/')
def view_fcn_1(var1):
    print('first')
    return('generated by first view function' + var1)

@app.route('/<var2>/')
def view_fcn_2(var2):
    print('second')
    return('generated by second view function' + var2)

@app.route('/')
def index():
    return render_template('/my-template.html')

if __name__ == '__main__':
    app.run("0.0.0.0", "5000")

my-template. html

<html>
<body>
    <a href="{{url_for('view_fcn_1', var1='I-am-var1') }}">First View Function</a>
    <a href="{{url_for('view_fcn_2', var2='I-am-var2') }}">Second View Function</a>

</body>
</html>

1 Ответ

1 голос
/ 24 апреля 2020

И @app.route('/<var1>/'), и @app.route('/<var2>/') имеют одинаковый шаблон, поэтому будет называться любое совпадение.

Вы можете создать пользовательский конвертер , который соответствует вашим потребностям в зависимости от что такое var1 и var2, но на самом деле не должно быть никаких причин, по которым вы не можете просто определить явные маршруты.

Что именно вы пытаетесь выполнить sh?

...