Что здесь не сделано? - PullRequest
0 голосов
/ 11 июля 2020

Я бродил здесь неделями, пробовал все, что мог, на все, но результат не ожидался. Я хочу отображать сведения о книге, когда пользователь выполняет поиск и щелкает ссылку на книгу. У меня маршрут поиска работает правильно, но маршрут книги, который должен отображать сведения о книге, выдает ошибку 404 Not Found. с этим; Запрошенный URL-адрес не найден на сервере. Если вы ввели URL-адрес вручную, проверьте правописание и попробуйте еще раз.

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

Вот код.

@app.route("/book/<isbn>", methods=["GET", "POST"])
@loggedin_required
def book(isbn):
    """ Takes and renders user review on the book page."""

    if request.method == "POST":

        # Keep track of individual user per session
        active_user = session["user_id"]
        
        # Fetch data from form
        rating = request.form.get("rating")
        comment = request.form.get("comment")
        
        # Get book_id by ISBN
        row = db.execute("SELECT id FROM books WHERE isbn = :isbn",
                        {"isbn": isbn})

        # Saving id into variable
        _id = row.fetchone() # (id,)
        _Id = _id[0]

        # Check to ensure that its ONLY 1 review/user per book)
        row_check = db.execute("SELECT * FROM reviews WHERE user_id = :user_id AND book_id = :book_id",
                    {"user_id": active_user,
                     "book_id": _id})

        if row_check.rowcount > 0:
            
            flash('You have left a review for this book already.')
            return redirect("/book/" + isbn)

        # Convert to save into DB
        rating_result = int(rating_result)

        db.execute("INSERT INTO reviews (user_id, book_id, comments, rating_result) VALUES \
                    (:user_id, :book_id, :comments, :rating_result)",
                    {"user_id": active_user, 
                    "book_id": _id, 
                    "comments": comment, 
                    "rating_result": rating})

       
        db.commit()

        flash('Review recieved. Thank you!')

        return redirect("/book/" + isbn)
    
    # Take the book ISBN and redirect to his page (GET)
    else:

        row = db.execute("SELECT isbn, title, author, year FROM books WHERE \
                        isbn = :isbn",
                        {"isbn": isbn})

        book_details = row.fetchall()
        
        return render_template("/book.html", isbn=isbn, book_details=book_details)        

Это метод поиска:

@app.route("/search")
@loggedin_required
def search():
    
    """ check if book id is supply"""
    if not request.args.get("book"):
        return render_template("error.html", message="Sorry! you didn't supply a book")
    
    query = "%" + request.args.get("book") + "%"
    
    query = query.title()
    rows = db.execute("SELECT isbn, title, author FROM books WHERE \
                        isbn LIKE :query OR \
                        title LIKE :query OR \
                        author LIKE :query LIMIT 20", 
                        {"query":query})
    
    if rows.rowcount == 0:
        return render_template("error.html", message="No book matches your search")
    
    books = rows.fetchall()
    
    return render_template("search.html", books=books)

И это страница html, которая обрабатывается и отображается функцией поиска :

{% extends "layout.html" %}
{% block title %}
search
{% endblock %}
{% block content %}

<div>
    
        {% for book in books %}
        <a href="{{url_for('book', isbn=isbn)}}" class="card-link">
                 {{book.title}} by {{book.author}} 
                </a>
                
        {% endfor %}
            
</div>

Ссылка herf должна обрабатываться маршрутом книги, но при нажатии на ссылку после поиска выдается ошибка 404 Not Found.

1 Ответ

1 голос
/ 11 июля 2020

в вашем шаблоне, я думаю, вы должны передать book.isbn в качестве параметра для book url, а не isbn, потому что вы зацикливаетесь на books, и он не определен в другом месте, поэтому он будет передан как None и таким образом вы получите 404 Not Found.

[..]
        {% for book in books %}
        <a href="{{ url_for('book', isbn=book.isbn) }}" class="card-link">
          {{book.title}} by {{book.author}} 
        </a>
        {% endfor %}
[..]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...