Почему эта ссылка может не работать …?

#python #flask #jinja2

#python #flask #jinja2

Вопрос:

Я отображаю кучу сообщений на странице, где пользователь может просматривать списки, нажимать на один из них и отправляться на «страницу знакомств» для получения дополнительной информации о любом продукте, на который они нажали. Этот метод работает для каждой ссылки, КРОМЕ первой.

Каждый раз, когда я нажимаю на самую первую ссылку страницы, я получаю сообщение Не найдено: запрошенный URL-адрес не найден на сервере. Если вы ввели URL вручную, пожалуйста, проверьте правильность написания и повторите попытку.ошибка.

Логика, которую я использую для HMTL / jinja, такова (все закрыто должным образом, я сокращаю ненужный код для краткости):

 {% set i = 0 %}
   {% for row in data %}
      {% set i = i   1 %}

                       <a href="/iLike/{{ i }}">
                                <li>content</li>
                       </a>
  

и мой код на python:

 @app.route('/iLike/<int:num>', methods=['GET','POST'])
def single2(num):
  try:
    loc = session.get('loc')
    transType = session.get('transType')
    data = singlesQuery()


    return render_template('single.html', loc=loc,transType=transType,data=data[num-1])
except Exception as e:
    return (str(e))
  

Комментарии:

1. loop.index В jinja2 уже есть, вам это не нужно set i .

2. Что показывает URL-адрес при наведении курсора мыши на ссылку?

3. использование локального хоста, а затем URL-адрес показывает /iLike/1/ @Soviut

4. Похоже /iLike/1/ , что в конце есть дополнительная косая черта. Это тот, который работает /iLike/2 ?

5. Вы делаете data[num-1] , почему бы просто не отправить 0 сквозной URL-адрес? loop.index сделал бы это.

Ответ №1:

Нет необходимости создавать URL-адреса вручную. Лучший способ использовать встроенную функцию flask url_for :

 {{url_for('single2', num=i)}}
  

Также нет необходимости вычислять i вручную, потому что есть встроенный loop.index и loop.index0 :

 {% for row in data %}
    <a href="{{url_for('single2', num=loop.index)}}">
  

Я считаю, что это всегда должно создавать действительный URL.

Комментарии:

1. Все еще получаю ошибку по самой первой ссылке. хм. @zvone Я перешел ко второму предложению..

2. @user3344239 Я предложил конечную косую черту в комментариях 😉 в любом случае, у вас все еще есть конечная косая черта с этим кодом здесь?

3. Я не предлагал завершающую косую черту. Это правильный ответ. Вы должны использовать url_for() , поскольку он будет правильно форматировать ваши URL-адреса без завершающей косой черты.

4. Я хотел разрешить завершающую косую черту, поэтому я добавил ее в @app.route . Я также переформатировал код, используя ваши предложения. Спасибо вам обоим.