使用带有 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/
# 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 端点并使用蓝图给出“没有属性扩展”错误
ValueError:set_wakeup_fd 仅适用于带有 Django 3.0.2 或 Flask 2.0.0 的 Python 3.8 上的 Windows 主线程