该函数要么返回 None 要么在没有返回语句的情况下结束,使用 docker 将 python 与 mysql 连接起来

Posted

技术标签:

【中文标题】该函数要么返回 None 要么在没有返回语句的情况下结束,使用 docker 将 python 与 mysql 连接起来【英文标题】:The function either returned None or ended without a return statement connecting python with mysql using docker 【发布时间】:2021-11-08 13:41:43 【问题描述】:

我正在尝试将 python 与 mysql 连接,两者都在不同的 docker 中。我可以从我的 ubuntu 终端访问 MYSQL,但是当我尝试使用我在 python 中使用的 url 访问时它不起作用。

Docker 编写

version: "3.9"  # optional since v1.27.0
services:
 
  mysql:
    image: 'mysql:latest'
    restart: always
    volumes:
      - './my-vol/mysql_data:/var/lib/mysql'
    ports:
      - '3306:3306'

  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/my-vol 

Python 文件

from flask import Flask
app = Flask(__name__)

import sqlalchemy as db
import mysql.connector
from mysql.connector import Error


@app.route('/db')
def python():
    connection = mysql.connector.connect(host="mysql", user="root", password="root", database="test")
    cursor = connection.cursor()

    with connection.cursor() as cursor:
        cursor.execute("Select * from test_table")
        for(userId , firstName , lastName ) in cursor:
           return print(", , ".format(userId, firstName, lastName))

最后,这是我尝试访问 /db url 时出现的完成错误。

[2021-09-13 08:34:19,119] ERROR in app: Exception on /db [GET]
web_1    | Traceback (most recent call last):
web_1    |   File "/usr/local/lib/python3.8/site-packages/flask/app.py", line 2070, in wsgi_app
web_1    |     response = self.full_dispatch_request()
web_1    |   File "/usr/local/lib/python3.8/site-packages/flask/app.py", line 1516, in full_dispatch_request
web_1    |     return self.finalize_request(rv)
web_1    |   File "/usr/local/lib/python3.8/site-packages/flask/app.py", line 1535, in finalize_request
web_1    |     response = self.make_response(rv)
web_1    |   File "/usr/local/lib/python3.8/site-packages/flask/app.py", line 1698, in make_response
web_1    |     raise TypeError(
web_1    | TypeError: The view function for 'python' did not return a valid response. The function either returned None or ended without a return statement.
web_1    | 172.24.0.1 - - [13/Sep/2021 08:34:19] "GET /db HTTP/1.1" 500 -

【问题讨论】:

是的,print(something) 总是返回 None 此外,如果表为空,则执行只会“退出”视图函数的末尾,该函数也返回None 能否检查mysql.connector.connect()中的host参数是否与运行mysql数据库的容器的主机名相同。另一件需要注意的事情是,两个容器应该在同一个网络上,它们应该在同一个网络上,因为你已经使用 compose 创建了它们。仍然作为调试过程,您应该能够使用docker container inspect <container_name> 进行验证 【参考方案1】:

您的视图应该返回一个响应对象。相反,您的视图会返回始终为 Noneprint 函数的结果。

此外,由于return 语句,您的for 循环将在第一次迭代时退出。看起来这不是您想要实现的目标。

你的代码成功连接到mysql,否则你会得到一个不同的异常。

【讨论】:

以上是关于该函数要么返回 None 要么在没有返回语句的情况下结束,使用 docker 将 python 与 mysql 连接起来的主要内容,如果未能解决你的问题,请参考以下文章

在烧瓶中运行 dash 应用程序

JavaScript连载15-return函数声明方式差异化回调函数

JavaScript连载15-return函数声明方式差异化回调函数

Python中的yield和send

C--int main 和void main的区别

函数返回 None 没有返回语句