Saltar al contenido

depurar el servidor Flask dentro de Jupyter Notebook

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 la flask-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()
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *