Создать ссылку с идентификатором: href = "{{url_for ('users /% s'% user [0])}}" / pb с конечной точкой и построить URL (jinja / python / flask) - PullRequest
0 голосов
/ 03 мая 2020

Я работаю над проектом с 2 приложениями (собран с python / flask). Первое приложение. py - это сервер. Второй client.py - это клиентская сторона.

Сейчас я создаю ссылку для доступа пользователей / 8 от пользователей, но она не работает

здесь, под пользователями. html / client.py @route / eror сообщение от jinja

пользователей. html:

{%block body%}   

        <div class="users">
                <div class="list-group">
                        {% for user in users %}

                        <a href ="{{ url_for('users/%s'%user[0]) }}" class="list-group-item list-group-item-action">
                                <div class="d-flex w-100 justify-content-between">
                                        <h5 class="mb-1">{{user[1]}}</h5>
                                        <small>{{user[0]}}</small>
                                </div>
                                <p class="mb-1">{{user[2]}}</p>
                                <small>Know more...</small>
                        </a>

                        {% endfor %}
                </div>


        </div>

{%endblock%}

client.py:

  @client.route('/users/<id>')#ok works 
 def user(id=None):
     if 'logged_in' in session:
         r = actualUser.get(id)
         user=json.loads(r.text)
         return render_template('user.html', user=user)
     else:
         return redirect(url_for('login'))

сообщение об ошибке:

 File "/home/elodieb/Rendu/Python/Flask/flask_d02/ex_03/Client/templates/users.html", line 1, in top-level template code
    {%extends "base.html" %}
    File "/home/elodieb/Rendu/Python/Flask/flask_d02/ex_03/Client/templates/base.html", line 44, in top-level template code
    {%block body%}
    File "/home/elodieb/Rendu/Python/Flask/flask_d02/ex_03/Client/templates/users.html", line 12, in block "body"
    <a href ="{{ url_for('users/%s'%user[0]) }}" class="list-group-item list-group-item-action">    
    werkzeug.routing.BuildError: Could not build url for endpoint 'users/7'. Did you mean 'users' instead?

Ответы [ 2 ]

0 голосов
/ 04 мая 2020

Сообщение об ошибке здесь довольно явное. Проблема заключается в неправильном использовании функции url_for в шаблоне users.html. Вы написали это

url_for('users/%s'%user[0])

Но url_for ожидает аргумент «конечной точки» ( т.е. имя соответствующего маршрута, здесь это 'users' ) и переменные для передачи в качестве аргументов ключевых слов. Больше информации и примеров использования здесь: https://flask.palletsprojects.com/en/1.1.x/quickstart/#url -building

Следовательно, то, что вы должны заменить эту шаблонную инструкцию, это:

url_for('users', id=user[0])

You ' Возможно, после исправления этой ошибки у вас возникнут другие ошибки, потому что вы передаете в шаблон одну переменную user=user, в то время как вы хотите l oop по коллекции users.

0 голосов
/ 03 мая 2020

Похоже, users.html ищет список users (см. {% for user in users %}), и вы передаете один экземпляр user (render_template('user.html', user=user)).

Либо вы можете изменить шаблон и не использовать for in l oop, либо обновить вызов до render_template, например render_template('user.html', users=[user])

...