使用带有 Python Flask 的 HTML 表单搜索 MongoDB 集合

Posted

技术标签:

【中文标题】使用带有 Python Flask 的 HTML 表单搜索 MongoDB 集合【英文标题】:Using an HTML form with Python Flask search a MongoDB collection 【发布时间】:2020-11-13 06:23:10 【问题描述】:

我希望用户在书名的搜索表单中进行随机搜索,如果书在数据库中,则查找获取结果。下面是代码块的一部分。 我在使用搜索字段和搜索字符串在我的 mongodb 中搜索单个文档时遇到了一些问题。下面是代码。我正在尝试通过 find_book 路线获取搜索结果。 上面带有 /find_book/ 的代码返回错误。 下面是我在 app.py 文件和搜索表单中的部分代码。 我收到以下错误。 werkzeug.routing.BuildError werkzeug.routing.BuildError:无法为端点“find_book”构建 url。您是否忘记指定值 ['book_title']? 追溯(最近一次通话)

  # create an instance of py_mongo with app as argument
mongo = PyMongo(app)


    @app.route('/')
    def home():
        return render_template('home.html')
    
    
    # define the various menu options
    @app.route('/get_books')
    def get_books():
        return render_template('books.html', books=mongo.db.books.find())
    
    
    # Add a book
    @app.route('/add_book')
    def add_book():
        return render_template('add_book.html',
                               faculties=mongo.db.faculties.find())
    
    
    # Add submit button for Books
    @app.route('/insert_book', methods=['POST'])
    def insert_book():
        book = mongo.db.books
        book.insert_one(request.form.to_dict())
        return redirect(url_for('get_books'))
    
    
    # wire the edit button
    @app.route('/edit_book/<book_id>')
    # description task, name, due date, is urgent fields will be
    # pre-populated based on the information returned in the task.
    def edit_book(book_id):
        a_book = mongo.db.books.find_one("_id": ObjectId(book_id))
        # category names will be prepolulated based on the collection
        # # of categories returned in the categories cursor
        all_faculties = mongo.db.faculties.find()
        return render_template('edit_book.html',
                               book=a_book, faculties=all_faculties)
    
    
    @app.route('/update_book/<book_id>', methods=['POST'])
    def update_book(book_id):
        # access the database collection
        book = mongo.db.books
        # call the update function, specify an id
        book.update('_id': ObjectId(book_id),
        
            'faculty_name': request.form.get('faculty_name'),
            'subject_name': request.form.get('subject_name'),
            'book_title': request.form.get('book_title'),
            'book_author': request.form.get('book_author'),
            'book_description': request.form.get('task_description'),
            'lender_name': request.form.get('lender_name'),
            'due_date': request.form.get('due_date'),
            'is_available': request.form.get('is_urgent')
        )
        return redirect(url_for('get_books'))
    # specify the form fields to match the keys on the task collection
    
    
    # delete a book
    @app.route('/delete_book/<book_id>')
    def delete_book(book_id):
        mongo.db.books.remove('_id': ObjectId(book_id))
        return redirect(url_for('get_books'))
    
    
    # find a book by text search
    @app.route('/find_book/<book_title>', methods=['GET'])
    def find_book(book_title):
        book_title = mongo.db.books
        book_title.find_one(
        
            'book_title': request.form.get('book_title'),
        )
        return render_template('find.html', book_title=book_title)
    
    
    # categories function
    @app.route('/get_faculties')
    def get_faculties():
        return render_template('faculties.html',
                               faculties=mongo.db.faculties.find())
    
    
    if __name__ == '__main__':
        app.run(host=os.environ.get('IP'),
                port=int(os.environ.get('PORT')),
                debug=True)



<form action=" url_for('find_book') " method="GET">
  <input type="text" placeholder="Book Title" id="book_title" name="book_title" >
  <button type="submit"><i class="fa fa-search">Search</i></button>
</form>

【问题讨论】:

【参考方案1】:

你的find_book 路由期待一个参数book_title

但你没有通过 url_for('find_book')

您可以将此路由更改为@app.route('/find_book') 并从request.form 获取值,或者如果您在应用程序的另一个位置使用此路由,您可以使用this question 的方法并使用这种方式:

@app.route('/find_book/', defaults='book_title': None)
@app.route('/find_book/<book_title>')
def find_book(book_title):
    books = mongo.db.books
    if book_title is None:
        book_title = request.form.get('book_title')
    book = books.find_one(
        'book_title': book_title
    )
    return render_template('find.html', book=book)

我现在无法运行这段 sn-p 代码,如果不工作请告诉我。

【讨论】:

我得到了一些结果。但是 find_one() 只显示我的集合中的第一项,这不一定是结果。我刚刚进行的搜索示例。然而,这不是我搜索的书。主题名称 书名 作者 描述 可用性 贷款人名称 到期日期 Marine Sciense Whales Mark Jones sr 鲸鱼的秘密歌曲 Jane Doe 2020 年 7 月 28 日 这是find_one 的预期行为。尝试更改为 find 以获取结果列表或优化搜索以使用多个参数。 非常感谢您的帮助。你真的让我能够继续这个项目。

以上是关于使用带有 Python Flask 的 HTML 表单搜索 MongoDB 集合的主要内容,如果未能解决你的问题,请参考以下文章

带有 sqlalchemy 的 python flask_restless 不会生成 api 端点并使用蓝图给出“没有属性扩展”错误

带有 GAE ndb 的 Flask Flask 安全性?

ValueError:set_wakeup_fd 仅适用于带有 Django 3.0.2 或 Flask 2.0.0 的 Python 3.8 上的 Windows 主线程

Windows 10 上带有 Azure AD 示例的 Flask 应用程序

Python之Flask框架使用

Flask - 在按钮 OnClick 事件上调用 python 函数