Flask+requests API ConnectionRefusedError: [Errno 111] 连接被拒绝

Bru*_*iro 6 python flask python-requests

我正在尝试运行一个简单的 Flask API,但它没有按预期工作。我在 Python 方面不是很有经验,所以发现错误并解决它非常具有挑战性。如果有人可以提供帮助,我将不胜感激。

系统设置如下:

  • Ubuntu 18.04
  • 使用 python 3.7 的 Conda 环境

这些是要求:

$ pip freeze

ansimarkup==1.4.0
asn1crypto==0.24.0
better-exceptions-fork==0.2.1.post6
certifi==2019.3.9
cffi==1.12.3
chardet==3.0.4
Click==7.0
colorama==0.4.1
cryptography==2.7
Flask==1.0.3
idna==2.8
itsdangerous==1.1.0
Jinja2==2.10.1
loguru==0.2.5
MarkupSafe==1.1.1
pycparser==2.19
Pygments==2.4.2
pyOpenSSL==19.0.0
PySocks==1.7.0
requests==2.22.0
six==1.12.0
urllib3==1.24.2
Werkzeug==0.15.4
Run Code Online (Sandbox Code Playgroud)

我的项目结构是这样的:

??? statsapi
?   ??? data_store.py
??? app.py
??? client.py
??? requirements.txt
Run Code Online (Sandbox Code Playgroud)

这是 app.py 代码:

??? statsapi
?   ??? data_store.py
??? app.py
??? client.py
??? requirements.txt
Run Code Online (Sandbox Code Playgroud)

data_store.py 代码:

#!/usr/bin/env python

from flask import Flask, request, jsonify
from loguru import logger

from statsapi import data_store


app = Flask(__name__)


# Creating an endpoint
@app.route("/data", methods=["POST"])
def save_data():
    # setting log for this action
    logger.info(f"Saving data...")

    # transform content requisition to json
    content = request.get_json()

    # save in a module just the "data" field
    # The uuid of the data
    uuid = data_store.save(content["data"])

    # set log for las action
    logger.info(f"Data saved with UUID `{uuid}` successfully")

    # define information to be returned
    return jsonify({"status": "success",
                    "message": "data saved successfully",
                    "uuid": uuid})


if __name__ == "__main__":
    app.run(host="0.0.0.0", debug=True)
Run Code Online (Sandbox Code Playgroud)

和 client.py 代码:

#!/usr/bin/env python

from uuid import uuid4


# Create a dictionary to keep things in memory
_in_memory_storage = dict()


# Save received data in memory giving an uuid
def save(data):
    data_uuid = uuid4()

    _in_memory_storage[data_uuid] = data

    return data_uuid
Run Code Online (Sandbox Code Playgroud)

client.py 应该向 API 发送一些数据,但是在调用时它会返回以下长错误消息:

#!/usr/bin/env python

import requests


def send(data):
    response = requests.post("http://localhost:5000/data", json={"data": data})

    print(response.json())


def main():
    send([1, 2, 3, 4])


if __name__ == "__main__":
    main()
Run Code Online (Sandbox Code Playgroud)

正如我所说,我离成为一名 Python 专家还很遥远,所以我将非常感谢任何帮助。

小智 0

我认为这可能是您的端口已经由其他应用程序提供服务,请尝试更改烧瓶端口。

\n

我在本地使用了你的代码并成功

\n

尝试这样的事情

\n

main.py

\n
import data_store\nfrom flask import Flask, request, jsonify\n\napp = Flask(__name__)\n\n\n# Creating an endpoint\n@app.route("/data", methods=["POST"])\ndef save_data():\n    # setting log for this action\n    print(f"Saving data...")\n\n    # transform content requisition to json\n    content = request.get_json()\n\n    # save in a module just the "data" field\n    # The uuid of the data\n    uuid = data_store.save(content["data"])\n\n    # set log for las action\n    print(f"Data saved with UUID `{uuid}` successfully")\n\n    # define information to be returned\n    return jsonify({"status": "success",\n                    "message": "data saved successfully",\n                    "uuid": uuid})\n\n\nif __name__ == "__main__":\n    app.run(port=8000)\n
Run Code Online (Sandbox Code Playgroud)\n

data_store.py

\n
from uuid import uuid4\n\n\n# Create a dictionary to keep things in memory\n_in_memory_storage = dict()\n\n\n# Save received data in memory giving an uuid\ndef save(data):\n    data_uuid = uuid4()\n\n    _in_memory_storage[data_uuid] = data\n\n    print(f"Cached value => {_in_memory_storage}")\n\n    return data_uuid\n
Run Code Online (Sandbox Code Playgroud)\n

client.py

\n
import requests\n\n\ndef send(data):\n    response = requests.post("http://localhost:8000/data", json={"data": data})\n\n    print(response.json())\n\n\ndef main():\n    send([1, 2, 3, 4])\n\n\nif __name__ == "__main__":\n    main()\n
Run Code Online (Sandbox Code Playgroud)\n

当它像这样测试成功时

\n
\xe2\x86\x92 python client.py\n{'message': 'data saved successfully', 'status': 'success', 'uuid': '050b02c2-e67e-44f7-b6c9-450106d8b40e'}\n
Run Code Online (Sandbox Code Playgroud)\n

烧瓶记录器

\n
\xe2\x86\x92 python main.py\n * Serving Flask app "main" (lazy loading)\n * Environment: production\n   WARNING: This is a development server. Do not use it in a production deployment.\n   Use a production WSGI server instead.\n * Debug mode: off\n * Running on http://127.0.0.1:8000/ (Press CTRL+C to quit)\nSaving data...\nCached value => {UUID('050b02c2-e67e-44f7-b6c9-450106d8b40e'): [1, 2, 3, 4]}\nData saved with UUID `050b02c2-e67e-44f7-b6c9-450106d8b40e` successfully\n127.0.0.1 - - [06/Jun/2021 12:51:35] "POST /data HTTP/1.1" 200 -\n
Run Code Online (Sandbox Code Playgroud)\n