Обратный вызов Dash не выдает результат

#python #jupyter-notebook #plotly-dash

#python #jupyter-ноутбук #plotly-dash

Вопрос:

Я работаю над программой, которая принимает имя пользователя и пароль пользователя (созданные в оболочке MongoDB) и использует их для их проверки, а затем возвращает следующий запрос на чтение:

 {"animal_type":"Dog", "name":"Lucy"}
 

Однако, когда я ввожу имя пользователя и пароль, ничего не выводится. Я пытался использовать методы read() и методы дампа, но оба, похоже, ничего не выводят.

Я предоставлю как фреймворк dash, над которым я работаю, так и основной класс, в котором у меня есть основные методы. Я с удовольствием уточню дополнительную информацию. Я ценю помощь!

Вот фреймворк dash, над которым я работаю:

 from jupyter_plotly_dash import JupyterDash
import dash_core_components as dcc
import dash_html_components as html
import dash
from dash.dependencies import Input, Output
from pymongo import MongoClient
import urllib.parse
from bson.json_util import dumps
from CRUD import AnimalShelter

# this is a juypter dash application
app = JupyterDash('ModuleFive')
 

вывод
app.layout = html.Div(
[

     html.H1("Zane's Module 5 Assignment"),
    html.Hr(),
        
        dcc.Input(
            id="input_user".format("text"),
            type="text",
            placeholder="input type {}".format("text")),
        dcc.Input(
            id="input_passwd".format("password"),
            type="password",
            placeholder="input type {}".format("password")),
        html.Button('Execute', id='submit-val', n_clicks=0),
        
    html.Hr(),
    html.Div(id="query-out"),
    #Completed: inserted unique identifier code on line 20 and 36
    html.H3('Fin'),
    ])

@app.callback(
    Output("query-out", "children"),
    [Input("input_user".format("text"), "value"), 
     Input("input_passwd".format("password"),"value"),
     Input('submit-val', 'n_clicks')],
    [dash.dependencies.State('input_passwd', 'value')]
)
def cb_render(userValue,passValue,n_clicks,buttonValue):
    if n_clicks > 0:
        username = urllib.parse.quote_plus(userValue)
        password = urllib.parse.quote_plus(passValue)

        shelter = AnimalShelter(userValue, passValue)
        
        animals = shelter.read({"animal_type":"Dog", "name":"Lucy"})
        print(animals)
        
        return dumps(list(shelter.read({"animal_type":"Dog", "name":"Lucy"})))
 

Вот мой основной класс, который имеет методы:

 from pymongo import MongoClient
from bson.objectid import ObjectId

class AnimalShelter(object):
    """ CRUD operations for Animal collection in MongoDB """

    def __init__(self, username, password):
        # Initializing the MongoClient. This helps to
        # access the MongoDB databases and collections.
        self.client = MongoClient('mongodb://%s:%s@localhost:43282' % (username, password))
        self.AAC = self.client['AAC']

    # Create method to implement the C in CRUD
    def create(self, data):
        if data is not None:
            return self.AAC.animals.insert_one(data)
        else:
            print("Nothing to save")
            return False

    # Create method to implement the C in CRUD
    def read(self, data):
        if data is not None:
            return self.AAC.animals.find(data)
        else:
            print("Nothing to read")
            return False

    # Create method to implement the C in CRUD
    def update(self, data, newData):
        if data is not None:
            return self.AAC.animals.update_one(data, {'$set': newData})

        else:
            print("Nothing to update, because data parameter is empty")
            return False

       
    # Create method to implement the D in CRUD
    def delete(self, data):
        if data is not None:
            return self.AAC.animals.delete_one(data)
            print("data deleted")
        else:
            return False
 

Комментарии:

1. Я не так хорошо знаком с MongoDB, но вы read пишете дважды. Показывает ли это print утверждение что-нибудь? Что произойдет, если вы удалите его? Иногда выполнение двух подобных операций чтения приводит к опустошению буфера.

Ответ №1:

Во-первых, чтобы понять результаты cb_render, я бы начал с того, что прокомментировал весь его код, а затем изменил ваш оператор return на this:

 return '{}'.format(enter_your_variable_here)
 

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

Во-вторых, вы должны поместить ‘username’ и ‘password’ в свой конструктор, а не аргументы ‘userValue’ и ‘passValue’ напрямую.

В-третьих, определите свой запрос:

 query = {"animal_type":"Dog","name":"Lucy"}
 

В-четвертых, теперь запустите свой запрос, используя объект client:

 animals = shelter.read(query)
 

Наконец, преобразуйте объект python в строку json с помощью функции dumps

 return '{}'.format(dumps(animals))
 

Чтобы убедиться, что запрос возвращает только один результат, перейдите в animal_shelter.py запустите скрипт в функции read () и измените ‘find’ на ‘find_one’, который является версией PyMongo ‘findOne’ в оболочке MongoDB.