Почему моя функция ничего не печатает в CLI? - PullRequest
0 голосов
/ 25 мая 2019

В данный момент я просто пытаюсь заставить функцию напечатать то, что она нашла в база данных, однако я не получаю ничего в CLI при отправке eywords через форму, которая имеет 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 мая / 2019 19:24:14] "POST / search / HTTP / 1.1" 404 -

Поскольку код стоит сейчас, все, что я ожидаю, это то, что он должен напечатать все коллекции в моей базе данных, в которых ключевое слово ищется с использованием формы.

Ответы [ 3 ]

0 голосов
/ 25 мая 2019

Вам необходимо прочитать ключевые слова, полученные из почтового запроса, используя request.form ['search'] как показано ниже:

#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">

Edit: Я предлагаю использовать метод 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">
0 голосов
/ 28 мая 2019

Спасибо за ваши попытки поддержать, но я теперь исправил проблему. Причина, по которой ничего не печаталось в клиенте, была вызвана проблемой со строкой create_index. В этой коллекции существовал индекс, о котором я не знал, который мешал запуску этой строки.

0 голосов

Использование официальной документации для 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)

Вы можете манипулировать им в соответствии с вашими требованиями.:) Надеюсь, это поможет.

...