Динамическая вставка переменной в url_ Flask для использования шаблонов Jinja - PullRequest
0 голосов
/ 05 мая 2020

Я пытаюсь выполнить задание, которое связывает Python, Flask и SQL. У меня есть база данных книг с информацией о названии, авторе, году и ISBN. Когда выполняется поисковый запрос, создается список подходящих результатов с гиперссылками на каждый из заголовков. Я хочу создать URL-адрес Dynami c, который зависит от заголовка, по которому щелкнули. ISBN названия книги, по которой был выполнен щелчок, должен быть частью URL-адреса. Однако я действительно не знаю, как этого добиться. Я пробовал следующее, но застрял и был бы признателен за помощь.

Вот application.py

import os

from flask import Flask, redirect, render_template, request, session, url_for
from flask_session import Session
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker
from helpers import login_required
import requests

app = Flask(__name__)
# Check for environment variable
if not os.getenv("DATABASE_URL"):
    raise RuntimeError("DATABASE_URL is not set")

# Configure session to use filesystem
app.config["SESSION_PERMANENT"] = False
app.config["SESSION_TYPE"] = "filesystem"
Session(app)

# Set up database
engine = create_engine(os.getenv("DATABASE_URL"))
db = scoped_session(sessionmaker(bind=engine))


@app.route("/", methods=["GET", "POST"])
@login_required
def index():
    """Search for books"""

    # User reached route via POST (as by submitting a form via POST)
    if request.method == "POST":

        # Ensure username was submitted
        if not request.form.get("search_term"):
            return render_template("error.html", message="Enter a book title, author, or ISBN.")

        # Search by ISBN, book title or book author
        search_term=request.form.get("search_term")
        rows = db.execute("SELECT author, title, isbn, year FROM books WHERE (author iLIKE '%"+search_term+"%' OR title iLIKE '%"+search_term+"%' OR isbn iLIKE '%"+search_term+"%')").fetchall()

        if not len(rows) >= 1:
            return render_template("error.html", message="Sorry, no results match your entry.")

        # populate results one dictionary at a time
        dict, results = {}, []
        for row in rows:
            # row.items() returns an array like [(key0, value0), (key1, value1)]
            for column, value in row.items():
                # join up the dict from the previous iteration (**dict) with the new key-value pair **{column: value}
                dict = {**dict, **{column: value}}
            results.append(dict)

        # Redirect user to results page
        return render_template("results.html", results=results)

    # User reached route via GET (as by clicking a link or via redirect)
    else:
        return render_template("index.html")

@app.route("/api/<string:isbn>", methods=["GET"])
@login_required
def books(isbn):
    """Show book details"""

    # Make sure book exists
    return render_template("book.html")
    #TODO


@app.route("/results", methods=["POST"])
def results():
    """Print results to screen"""

    return render_template("results.html")

И вот результаты. html

{% extends "layout.html" %}

{% block title %}
    Results
{% endblock %}

{% block main %}

<script>
  book=document.getElementsByClassName(book)
</script>

    <table style="margin-left: 5%" class="table table-responsive-sm table-sm table-borderless">

        <thead>
            <tr align="left">
                <th>Author</th>
                <th>Title</th>
                <th>Year</th>
                <th>ISBN</th>
            </tr>
        </thead>
        <tbody>
            {% for result in results %}
                {% if results != None %}
                    <tr align="left">
                        <td>{{ result['author'] }}</td>
                        <td class="book"><a href="{{url_for('books', result['isbn'])}}" style="color: black;">{{ result['title'] }}</a></td>
                        <td>{{ result['year'] }}</td>
                        <td>{{ result['isbn'] }}</td>
                    </tr>
                {% endif %}
            {% endfor %}
        </tbody>
    </table>

{% endblock %}

Я знаю, что синтаксис для включения номера isbn неверен ( {{url_for ('books', result ['isbn']}} ), но я подумал, что кто-то может видеть более четко что я пытаюсь сделать, если все покажу.

1 Ответ

1 голос
/ 05 мая 2020

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

...