Как перенаправить на URL из HTML-формы?

Програмно создан словарь словарей :
from flask import Flask, jsonify,abort,render_template,request,redirect,url_for

app = Flask(__name__)

tasks = [
    {
        'id': 1,
        'title': 'Buy groceries',
        'description': 'Milk, ,Pizza,,Cheese,Fruit, Tylenol',
        'done': False
    },
    {
        'id': 2,
        'title': 'Learn Python',
        'description': 'Need to find a good Python tutorial on the web',
        'done': False
    }
]

у каждого элемента есть id ,по этому id на другой штмл странице создается поиск:
<html>
    <head>
        <title>Search page</title>
    </head>
    <body>
        <div id="container">
            <div class="title">
                <h1>GET request with Flask</h1>
            </div>

            <form method="GET" action="{{ url_for('get_task',task_id=TaskID) }}">
                <label for="TaskID">Please enter Task ID:</label>
            <input type="text" name="TaskID"  value="0"/><br />
                <input type="submit">
            </form>
            </div>
        </div>
    </body>
</html>
тоесть в зависимости от введенного Id , перенаправить на страницу с заданием
@app.route('/tasks/<int:task_id>', methods=['GET'])
def get_task(task_id=None):
    if(task_id!=None):
        task_id=int(task_id)
        task = filter(lambda t: t['id'] == task_id, tasks)
        if len(task) == 0:
            abort(404)
        return jsonify({'task': task[0]})
    else:return jsonify({'tasks': tasks})

Ну и как бы проблема в передаче в action="{{ url_for('get_task',task_id=TaskID) }}"
параметра TaskID.
При попытке загрузить страницу
href="127.0.0.1:5000/search_page">

Получаю ошибку
jinja2.exceptions.UndefinedError
UndefinedError: 'TaskID' is undefined


После изменения формы следующим образом ошибка поменялась
<form action="{{ url_for('get_task') }}">
                <label for="TaskID">Please enter Task ID:</label>
            <input type="text" name="task_id"/><br />
                <input type="submit">
            </form>

При сборке проекта получаю следующую ошибку
werkzeug.routing.BuildError
BuildError: ('get_task', {}, None)
  • Вопрос задан
  • 1159 просмотров
Решения вопроса 1
@pcdesign
А может стоит использовать метод POST просто на '/tasks/'?

А иначе получается палка о двух концах. Вы заранее не знаете какой будет TaskID, но пытаетесь сформировать для него url.

POST метод делается так.
В html коде:
<form action="{{ url_for('get_task') }}"   method="POST">


В python коде:

@app.route('/tasks/', methods=['POST'])
def get_task():
    task_id = request.form['task_id']
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Creamov
@Creamov
Senior Fullstack Software Engineer
'TaskID' is undefined

Откуда ему взять TaskID? Вы же ее нигде не объявили?

Оставьте в action только {{ url_for('get_task') }}, а у элемента input измените атрибут name на name="task_id". Форма будет отправлять этот параметр (input: name => value) по адресу указанному в action.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы