Solución:
Instalé Jupyter y Flask y su código original funciona.
los flask.Flask
El objeto es una aplicación WSGI, no un servidor. Flask utiliza el servidor de desarrollo de Werkzeug como WSGI
servidor cuando llamas python -m flask run
en tu caparazón. Crea un nuevo servidor WSGI y luego pasa su aplicación como parámetro a werkzeug.serving.run_simple
. Tal vez puedas intentar hacerlo manualmente:
from werkzeug.wrappers import Request, Response
from flask import Flask
app = Flask(__name__)
@app.route("https://foroayuda.es/")
def hello():
return "Hello World!"
if __name__ == '__main__':
from werkzeug.serving import run_simple
run_simple('localhost', 9000, app)
Flask.run()
llamadas run_simple()
internamente, por lo que no debería haber diferencia aquí.
El truco consiste en ejecutar el servidor Flask en un hilo separado. Este código permite registrar proveedores de datos. Las características clave son
-
Busque un puerto libre para el servidor. Si ejecuta varias instancias del servidor en diferentes portátiles, competirán por el mismo puerto.
-
los
register_data
La función devuelve la URL del servidor para que pueda usarla para lo que necesite. -
El servidor se inicia bajo demanda (cuando se registra el primer proveedor de datos)
-
Nota: Agregué el
@cross_origin()
decorador de laflask-cors
paquete. De lo contrario, no puede llamar al formulario API dentro del cuaderno. -
Nota: no hay forma de detener el servidor en este código …
-
Nota: El código usa escritura y python
3
. -
Nota: No hay un buen manejo de errores en este momento.
import socket
import threading
import uuid
from typing import Any, Callable, cast, Optional
from flask import Flask, abort, jsonify
from flask_cors import cross_origin
from werkzeug.serving import run_simple
app = Flask('DataServer')
@app.route('/data/<id>')
@cross_origin()
def data(id: str) -> Any:
func = _data.get(id)
if not func:
abort(400)
return jsonify(func())
_data = {}
_port: int = 0
def register_data(f: Callable[[], Any], id: Optional[str] = None) -> str:
"""Sets a callback for data and returns a URL"""
_start_sever()
id = id or str(uuid.uuid4())
_data[id] = f
return f'http://localhost:{_port}/data/{id}'
def _init_port() -> int:
"""Creates a random free port."""
# see https://stackoverflow.com/a/5089963/2297345
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('localhost', 0))
port = sock.getsockname()[1]
sock.close()
return cast(int, port)
def _start_sever() -> None:
"""Starts a flask server in the background."""
global _port
if _port:
return
_port = _init_port()
thread = threading.Thread(target=lambda: run_simple('localhost', _port, app))
thread.start()