Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Flask POST request is causing server to crash

I am trying to make a simple api in Flask, the first step being getting the POST json data. (I just want to print it for now) This is my code and when I request /api with json data, it returns a 500 error. Any thoughts on why this is happening?

from flask import Flask, request, Response app = Flask(__name__)  @app.route('/') def root_response():     return "Hello World."  @app.route('/api', methods=['POST', 'GET']) def api_response():     if request.method == 'POST':         return request.json  if __name__ == '__main__':     app.run() 

The curl command:

$ curl -H "Content-Type: application/json" --data @body.json http://127.0.0.1:5000/api <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <title>500 Internal Server Error</title> <h1>Internal Server Error</h1> <p>The server encountered an internal error and was unable to complete your request.  Either the server is overloaded or there is an error in the application.</p> 

body.json:

{ "please": "print", "me": "now" } 
like image 586
zallarak Avatar asked Apr 18 '12 23:04

zallarak


People also ask

Is it possible to make POST request in Flask?

Flask POST request is defined as an HTTP protocol method that enables users to send HTML form data to server. The HTTP protocol is the foundation of data communication and is basically defined as an application layer for collaborative, distributed, hypermedia information systems.

Can Flask server handle multiple requests?

Improve performance in both Blocking and Non-Blocking web servers. Multitasking is the ability to execute multiple tasks or processes (almost) at the same time. Modern web servers like Flask, Django, and Tornado are all able to handle multiple requests simultaneously.

How do you handle GET and POST IN Flask?

POST Method To handle the POST requests at the server, let us first create a form to get some data at the client side from the user, and we will try to access this data on the server by using the POST request. Now, Enter the following code into the script named post_example.py.


2 Answers

First what you want to do is enable debug mode so Flask will actually tell you what the error is. (And you get the added benefit of flask reloading every time you modify your code!)

if __name__ == '__main__':     app.debug = True     app.run() 

Then we find out our error:

TypeError: 'dict' object is not callable 

You're returning request.json, which is a dictionary. You need to convert it into a string first. It's pretty easy to do:

def api_response():     from flask import jsonify     if request.method == 'POST':         return jsonify(**request.json) 

There you are! :)

like image 193
Theron Luhn Avatar answered Oct 04 '22 19:10

Theron Luhn


The server is overloaded because the default port(5000) or port explicitly mentioned by a user(eg:app.run(port=7000)) may be using some other processes in the background, so we need to kill the processes which are being used by that port.

You can see the process id's(PIDS) which are using that port by using the following command: netstat -o -a in command prompt enter image description here *Look into the respective PID for the port

Then kill all the Processes(PIDS) for the port you want to use using the following command: Taskkill /PID 30832 /F Here I used the PID 30832 for port 127.0.0.1:7000 which is giving the overloaded error. After that problem is solved.

like image 21
Sykam Sreekar Reddy Avatar answered Oct 04 '22 19:10

Sykam Sreekar Reddy