该函数要么返回 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】:
您的视图应该返回一个响应对象。相反,您的视图会返回始终为 None
的 print
函数的结果。
此外,由于return
语句,您的for
循环将在第一次迭代时退出。看起来这不是您想要实现的目标。
你的代码成功连接到mysql,否则你会得到一个不同的异常。
【讨论】:
以上是关于该函数要么返回 None 要么在没有返回语句的情况下结束,使用 docker 将 python 与 mysql 连接起来的主要内容,如果未能解决你的问题,请参考以下文章
JavaScript连载15-return函数声明方式差异化回调函数