Flask 中的搜索(“/search”)应用程序路径不起作用 - CS50 最终项目

Search (“/search”) app route in Flask not working- CS50 final project

我目前正在处理我的 cs50 期末项目。我使用第 9 周源代码中的节目搜索功能作为参考来创建我自己的搜索功能。在 layout.html 中使用导航栏中的表单调用搜索功能。搜索功能没有在终端中给出任何错误消息,而是在 Web 应用程序上显示错误页面,在终端上一切似乎都很好。搜索功能类似于索引功能,索引功能起作用。我检查了 sql 查询,它给出了适当的结果。有人可以识别代码中的错误吗?

参考: https://cdn.cs50.net/2020/fall/lectures/9/src9.pdf- shows0/application.py

application.py

app = Flask(__name__)


@app.errorhandler(Exception)
def handle_exc(e):
    if not isinstance(e, HTTPException):
        e = InternalServerError()
    return render_template("error.html", message=e.name, code=e.code)
        

db = SQL("sqlite:///ideahub.db")


@app.route("/")
def index():
    ideas = db.execute("SELECT ideas.id AS id, username, user_id, idea_name, idea_body, post_date FROM ideas INNER JOIN users ON users.id = ideas.user_id WHERE posted = 1 ORDER BY post_date DESC")
    for idea in ideas:
        if idea["id"] in [row["idea_id"] for row in db.execute("SELECT idea_id FROM likes WHERE user_id = ?", session.get("user_id", 0))]:
            idea["liked"] = True
    return render_template("index.html", ideas=ideas)


@app.route("/search")
def search():
    query = request.args.get("q")
    ideas = db.execute("SELECT ideas.id AS id, username, user_id, idea_name, idea_body, post_date FROM ideas INNER JOIN users ON users.id = ideas.user_id WHERE posted = 1 AND idea_name LIKE '%?%' ORDER BY post_date DESC", query)
    for idea in ideas:
        if idea["id"] in [row["idea_id"] for row in db.execute("SELECT idea_id FROM likes WHERE user_id = ?", session.get("user_id", 0))]:
            idea["liked"] = True
    return render_template("search.html", ideas=ideas)

search.html

{% extends "layout.html" %}

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

{% block main %}
    {% for i in range(ideas|length) %}
        <div class="card bg-white col-10 mx-auto mb-2">
            <div class="card-body">
                <h5 class="card-title font-weight-bold" role="button" data-toggle="collapse" data-target="#idea-content-{{ i }}" aria-expanded="false">
                        {{ ideas[i].idea_name }} <i class="fas fa-angle-down fa-lg float-right"></i>
                </h5>
                <div class="collapse" id="idea-content-{{ i }}">
                    <p class="fw-600 card-text mb-2">Posted:- {{ ideas[i].post_date|date_format }}</p>
                    <p class="fw-600 card-text mb-2">Created By:- <a class="text-dark hover-link" href="/profile/{{ ideas[i].user_id }}">{{ ideas[i].username }}</a></p>
                    <p class="card-text">{{ ideas[i].idea_body }}</p>
                    {% if session.user_id != ideas[i].user_id %}
                        <form action="/like">
                            {% if ideas[i].liked %}
                                <button class="btn btn-primary mr-2" disabled>Liked!</button>
                            {% else %}
                                <button type="submit" class="btn btn-primary mr-2" name="id" value="{{ ideas[i].id }}">Like &#128155;</button>
                            {% endif %}
                        </form>
                    {% endif %}
                </div>
            </div>
        </div>
    {% endfor %}
{% endblock %}

layout.html

<ul class="navbar-nav ml-auto mt-2">
    <li class="nav-item">
        <form class="search-bar bg-dark p-2 mr-2 d-flex justify-content-center align-items-center" action="/search">
            <input class="search-input text-white border-0 bg-transparent" autocomplete="off" type="search" name="q" placeholder="Search...">
            <button class="text-white deco-none float-right border-0 bg-transparent" type="submit"><i class="fas fa-search"></i></button>
        </form>
    </li>
</ul>

index.html

{% extends "layout.html" %}

{% block title %}
    Homepage
{% endblock %}

{% block main %}
    <h3 class="text-white offset-1 mb-3">Homepage</h3>
    {% for i in range(ideas|length) %}
        <div class="card bg-white col-10 mx-auto mb-2">
            <div class="card-body">
                <h5 class="card-title font-weight-bold" role="button" data-toggle="collapse" data-target="#idea-content-{{ i }}" aria-expanded="false">
                        {{ ideas[i].idea_name }} <i class="fas fa-angle-down fa-lg float-right"></i>
                </h5>
                <div class="collapse" id="idea-content-{{ i }}">
                    <p class="fw-600 card-text mb-2">Posted:- {{ ideas[i].post_date|date_format }}</p>
                    <p class="fw-600 card-text mb-2">Created By:- <a class="text-dark hover-link" href="/profile/{{ ideas[i].user_id }}">{{ ideas[i].username }}</a></p>
                    <p class="card-text">{{ ideas[i].idea_body }}</p>
                    {% if session.user_id != ideas[i].user_id %}
                        <form action="/like">
                            {% if ideas[i].liked %}
                                <button class="btn btn-primary mr-2" disabled>Liked!</button>
                            {% else %}
                                <button type="submit" class="btn btn-primary mr-2" name="id" value="{{ ideas[i].id }}">Like &#128155;</button>
                            {% endif %}
                        </form>
                    {% endif %}
                </div>
            </div>
        </div>
    {% endfor %}
{% endblock %}

这个sql报错,大意是参数多于占位符:

SELECT ideas.id AS id, username, user_id, idea_name, idea_body, post_date 
FROM ideas  
INNER JOIN users ON users.id = ideas.user_id 
WHERE posted = 1 AND idea_name LIKE '%?%' 
ORDER BY post_date DESC

这个%?%是一个字符串文字。从引号中断开 ? 或使用命名参数(也不会在引号中)。我不知道为什么你在烧瓶日志中看不到这个错误。表面上这就是我在 repro 上找到它的方式。