Как передать переменную на другой маршрут во FLASK - PullRequest
0 голосов
/ 27 декабря 2018

Я пытаюсь передать переменную из одного маршрута в другой, но не могу.Кто-нибудь может направить меня на это?Я получаю сообщение об ошибке в последней строке.

@app.route("/search", methods=['GET', 'POST'])
def search():

    if request.method == 'GET':

        return render_template('search.html', navbar=True)

    else:

        query = request.form.get('query').lower()
        query_like = '%' + query + '%'

        books = db.execute('SELECT * FROM books WHERE (LOWER(isbn) LIKE :query) OR (LOWER(title) LIKE :query) '
                           'OR (LOWER(author) LIKE :query)',
                           {'query': query_like}).fetchall()

        if not books:
            return render_template('error.html', message='No Books were Found!', navbar=True)

        return render_template('books.html', query=query, books=books, navbar=True)

@app.route("/books", methods=['GET', 'POST'])
def books():

    return render_template('books.html', query=query, books=books)

1 Ответ

0 голосов
/ 27 декабря 2018

Проблема в том, как организован ваш код.Переменные в функции ограничены внутри функции, поэтому books недоступно для второго маршрута.В дополнение к этому у вас есть конфликт имен , где books=books ссылается на саму функцию (которая определена в области видимости модуля).

Если вы хотите совместно использовать код между маршрутами, поместите его в отдельную функцию:

def get_books(query, show_nav_bar=False):
    query = query.lower()
    query_like = '%' + query + '%'
    books = db.execute('SELECT * FROM books WHERE (LOWER(isbn) LIKE :query) OR (LOWER(title) LIKE :query) '
                    'OR (LOWER(author) LIKE :query)', {'query': query_like}).fetchall()

    if not books:
        return render_template('error.html', message='No Books were Found!', navbar=True)

    return render_template('books.html', query=query, books=books, navbar=show_nav_bar)


@app.route("/search", methods=['GET', 'POST'])
def search():
    if request.method == 'GET':
        return render_template('search.html', navbar=True)

    else:
        return get_books(request.form.get('query'), show_nav_bar=True)


@app.route("/books", methods=['GET', 'POST'])
def books():
    return get_books(request.form.get('query'))
...