【问题标题】:Why is my function not printing anything in the CLI?为什么我的函数没有在 CLI 中打印任何内容?
【发布时间】:2019-10-11 20:29:53
【问题描述】:

目前我只是想让函数打印它在其中找到的内容 数据库,但是在提交时我在 CLI 中没有得到任何东西 通过具有此功能 URL 作为操作的表单的关键字。

import os
from flask import Flask, render_template, redirect, request, url_for
from flask_pymongo import PyMongo
from bson.objectid import ObjectId

app = Flask(__name__)

app.config["MONGO_DBNAME"] = 'recipe_site'
app.config["MONGO_URI"] = os.getenv("MONGO_URI")

mongo = PyMongo(app)

#function for search bar.

@app.route('/search', methods=['GET', 'POST'])
def search():
    mongo.db.recipes.create_index( { "name": "text" } )
    if request.method == "POST":
        q = request.form['search']
    else:
        q = ""
    query = ( { "$text": { "$search": q } } )
    results = mongo.db.recipes.find(query)
    
    return render_template('searchresults.html', recipes = results)

调用搜索函数并捕获关键搜索词的表单:

<form action="{{ url_for('search', text=text) }}" method="POST">
    <div>
        <div class="input-field">
            <input id="search" name="search" type="text" class="validate">
            <span class="helper-text" data-error="Try again" data-success="Done"></span>
        </div>
    </div>
    <button type="submit">Submit </button>
</form>

错误代码

  • 调试器 PIN:272-267-243 10.240.1.220 - - [25/May/2019 19:24:14] “POST /search/ HTTP/1.1”404 -

就目前的代码而言,我所期望的是它应该打印我的数据库中使用表单搜索关键字的任何集合。

【问题讨论】:

  • 你有什么错误吗?
  • 我试图重定向到的网页出现 404 错误,但这是可以预料的,因为打印语句不起作用我目前不知道该函数从我的数据库。我在末尾添加了一个 return 'return redirect(url_for('searchresults.html'))'。这也是我的表单操作以帮助诊断。
  • 你能把你的整个代码贴出来吗?
  • 你用的是哪个mongo客户端?
  • 呃,我正在为一门课程做一个完整的食谱网站项目。目前我遇到的唯一问题是尝试使用 pymongo 实现搜索栏来搜索数据库。最初的问题是我正在尝试编写的完整应用程序路线,我将在下面发布我试图捕获关键搜索词的完整表格。

标签: python-3.x mongodb flask pymongo


【解决方案1】:

感谢您的支持,但我现在已经纠正了这个问题。 cli 中没有打印任何内容的原因是 create_index 行存在问题。该集合中有一个现有的索引,我不知道是哪个索引阻止了这条线的运行。

【讨论】:

    【解决方案2】:

    使用PyMongo的官方文档 这是一个经过测试的代码,可能会有所帮助。

    from flask import Flask
    from flask_pymongo import PyMongo
    import pymongo
    
    app = Flask(__name__)
    
    app.config["MONGO_DBNAME"] = 'test'
    app.config["MONGO_URI"] = "mongodb+srv://<username>:<password>@cluster0-vhd1j.gcp.mongodb.net/test?retryWrites=true"
    
    mongo = PyMongo(app)
    
    # mongo.db.collection.create_index([("name", pymongo.ASCENDING),("text", pymongo.ASCENDING)])
    mongo.db.collection.insert_one({"name":"myname","text":"abcd"})
    query = { "text": "abcd"}
    results = mongo.db.collection.find(query)
    for result in results:
      print(result)
    

    您可以根据需要对其进行操作。 :) 希望对你有帮助。

    【讨论】:

    【解决方案3】:

    您需要使用 request.form['search'] 读取从 post 请求中收到的关键词 如下:

    #function for search bar.
    
    @app.route('/search', methods=['GET', 'POST'])
    def search():
       # index for field name
       mongo.db.recipes.create_index('name')
    
       # index for field name and example
       #mongo.db.recipes.create_index([("name", pymongo.DESCENDING),
       #("example", pymongo.ASCENDING)])
       if request.method == "POST":
         q=request.form['search']
       else:
         q = ""
       query = ( { "$text": { "$search": q } } )
       results = mongo.db.recipes.find(query)
       print (results)
       return render_template('searchresults.html', recipes = results)
    

    表格中,需要替换

    <form action="{{ url_for('search', text=text) }}" method="POST">
    

    <form action="{{ url_for('search') }}" method="POST">
    

    编辑: 我建议使用 GET 方法而不是 POST 进行搜索功能,因为当客户端刷新浏览器时,它会要求他确认表单提交。所以我们需要替换:

    if request.method == "POST":
         q=request.form['search']
    else:
         q = ""
    

    q = request.args.get('search', "")
    

    <form action="{{ url_for('search') }}" method="POST">
    

    通过

    <form action="{{ url_for('search') }}" method="GET">
    

    【讨论】:

    • 新错误似乎相似。 TypeError:“集合”对象不可调用。如果您打算在 'Collection' 对象上调用 'ensureIndex' 方法,它会失败,因为不存在这样的方法。
    • 对不起,伙计。这应该有效 mongo.db.recipes.ensure_index( { "name": "text" } )
    • pyMongo 使用 create_index 和 ensure_index 代替 createIndex 和 ensureIndex。
    • 啊,我明白了,谢谢。看来我越来越近了。最新的错误消息是“TypeError: if no direction is specified, key_or_list must be an instance of list”。对这个有什么想法吗?
    猜你喜欢
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    • 1970-01-01
    • 2022-12-02
    • 2021-11-23
    • 2021-01-05
    • 1970-01-01
    相关资源
    最近更新 更多