Jananath Banuka
Jananath Banuka

Reputation: 3973

How to solve the TypeError: The view function did not return a valid response in python flask api

I am trying to retrieve data from a mongodb database and trying to pass that response to a front-end reactjs application.

But I get this error and I can't find why it is happening:

TypeError: The view function did not return a valid response. The return type must be a string, dict, tuple, Response instance, or WSGI callable, but it was a list

What I need is:

I need to retrieve all the mongodb documents and pass it into front-end application so I can map it using reactjs to show in a table.

And this is what I am trying, and this is giving me the error:

@app.route("/bemployees", methods=["GET"])
def retrieve_all_documents():
    client = pymongo.MongoClient(
        "<url>"
    )

    # database
    db = client.cdap

    # collection (table)
    collection = db.predicted_values

    documents_ = []

    for b in collection.find():

        documents_.append({'Age' :b['Age'] ,'DailyRate': b['DailyRate'],
                   'DistanceFromHome': b['DistanceFromHome'] , 'EnvironmentSatisfaction': b['EnvironmentSatisfaction'],
                   'HourlyRate':b['HourlyRate'],'JobInvolvement': b['JobInvolvement'],
                   'JobLevel': b['JobLevel'],'JobSatisfaction' :b['JobSatisfaction'],
                   'MonthlyIncome': b['MonthlyIncome'], 'MonthlyRate' :b['MonthlyRate'],
                   'NumCompaniesWorked': b['NumCompaniesWorked'],'PercentSalaryHike' :b['PercentSalaryHike'],
                   'RelationshipSatisfaction': b['RelationshipSatisfaction'],'StandardHours' :b['StandardHours'],
                   'TotalWorkingYears': b['TotalWorkingYears'],'TrainingTimesLastYear' :b['TrainingTimesLastYear'],
                   'YearsAtCompany': b['YearsAtCompany'],'YearsInCurrentRole' :b['YearsInCurrentRole'],
                   'YearsSinceLastPromotion': b['YearsSinceLastPromotion'],'YearsWithCurrManager' :b['YearsWithCurrManager'],
                   'MaritalStatus_': b['MaritalStatus_'],'JobRole_' :b['JobRole_'],
                   'Gender_': b['Gender_'],'EducationField_' :b['EducationField_'],
                   'Department_': b['Department_'],'BusinessTravel_' :b['BusinessTravel_'],
                   'OverTime_': b['OverTime_'],'Over18_' :b['Over18_'],
                   'empName': b['empName'],'empID' :b['empID'],
                   'PerformanceScore': b['PerformanceScore'],
                   'id': str(b['_id']) })

    return documents_ 

Can someone please help me to fix this?

Upvotes: 0

Views: 2432

Answers (1)

Kruspe
Kruspe

Reputation: 645

Flask views can't return lists. One way to deal with this is to convert your list to a JSON string:

import json
from flask import Response

@app.route("/bemployees", methods=["GET"])
def retrieve_all_documents():
    client = pymongo.MongoClient(
        "<url>"
    )

    # database
    db = client.cdap

    # collection (table)
    collection = db.predicted_values

    documents_ = []

    for b in collection.find():

        documents_.append({'Age' :b['Age'] ,'DailyRate': b['DailyRate'],
                   'DistanceFromHome': b['DistanceFromHome'] , 'EnvironmentSatisfaction': b['EnvironmentSatisfaction'],
                   'HourlyRate':b['HourlyRate'],'JobInvolvement': b['JobInvolvement'],
                   'JobLevel': b['JobLevel'],'JobSatisfaction' :b['JobSatisfaction'],
                   'MonthlyIncome': b['MonthlyIncome'], 'MonthlyRate' :b['MonthlyRate'],
                   'NumCompaniesWorked': b['NumCompaniesWorked'],'PercentSalaryHike' :b['PercentSalaryHike'],
                   'RelationshipSatisfaction': b['RelationshipSatisfaction'],'StandardHours' :b['StandardHours'],
                   'TotalWorkingYears': b['TotalWorkingYears'],'TrainingTimesLastYear' :b['TrainingTimesLastYear'],
                   'YearsAtCompany': b['YearsAtCompany'],'YearsInCurrentRole' :b['YearsInCurrentRole'],
                   'YearsSinceLastPromotion': b['YearsSinceLastPromotion'],'YearsWithCurrManager' :b['YearsWithCurrManager'],
                   'MaritalStatus_': b['MaritalStatus_'],'JobRole_' :b['JobRole_'],
                   'Gender_': b['Gender_'],'EducationField_' :b['EducationField_'],
                   'Department_': b['Department_'],'BusinessTravel_' :b['BusinessTravel_'],
                   'OverTime_': b['OverTime_'],'Over18_' :b['Over18_'],
                   'empName': b['empName'],'empID' :b['empID'],
                   'PerformanceScore': b['PerformanceScore'],
                   'id': str(b['_id']) })

    return Response(json.dumps(documents_), mimetype='application/json')

Upvotes: 1

Related Questions