Title: You can’t use input() inside a Flask route (EOFError). Use HTTP request data instead.
The error EOFError('EOF when reading a line') happens because Flask routes run inside a WSGI worker without an interactive terminal (stdin). input() tries to read from stdin, but there’s no TTY in an HTTP request context, so it immediately hits EOF. Even in debug, blocking on input() would stall the worker and break concurrency.
Don’t read from the server console in a route. Get user input from the HTTP request.
Use one of these patterns:
HTML form (POST)
from flask import Flask, request, render_template_string
app = Flask(name)
form_html = """
<form method="post"> <input name="username" placeholder="Username"> <button type="submit">Send</button> </form> """
@app.route("/ask", methods=["GET", "POST"])
def ask():
if request.method == "POST":
username = request.form.get("username")
return f"Hello, {username}!"
return render_template_string(form_html)
JSON API (AJAX/fetch)
from flask import Flask, request, jsonify
app = Flask(name)
@app.route("/api/answer", methods=["POST"])
def api_answer():
data = request.get_json(silent=True) or {}
answer = data.get("answer")
if not answer:
return jsonify(error="missing 'answer'"), 400
return jsonify(ok=True, echoed=answer)
Client:
fetch("/api/answer", {
method: "POST",
headers: {"Content-Type": "application/json"},
body: JSON.stringify({answer: "hello"})
})
Query parameters (GET)
from flask import Flask, request
app = Flask(name)
@app.route("/greet")
def greet():
name = request.args.get("name", "world")
return f"Hello, {name}!"
Call: /greet?name=Alice
Path parameters
from flask import Flask
app = Flask(name)
@app.route("/user/<username>")
def user(username):
return f"Hello, {username}!"
If you truly need interactive, real-time input, use WebSockets (e.g., Flask-SocketIO) to exchange messages with the browser. If you want terminal prompts, build a separate CLI script and don’t call input() inside Flask routes.