无法从在Heroku上运行的Flask应用程序连接到cleardb

时间:2019-07-26 08:00:08

标签: python mysql heroku flask cleardb

我正在学习Flask等,并在本地创建了一个简单的应用程序。使用xammp中的本地mysql数据库,一切正常。我将其导出并导入到heroku上的clearDB中,并部署了我的应用程序。该应用程序运行,但是每当我尝试访问依赖于日志中的数据库的页面时,都会看到此错误。

pymysql.err.OperationalError:(2003年,“无法连接到'localhost'上的MySQL服务器([Errno 111]连接被拒绝)”)

我在本地运行了该应用程序,但是使用了clearDB数据库,它能够毫无问题地检索数据。文件中的所有内容均已配置为可根据来自heroku的URL详细信息进行访问。

代码在下面。我确定还有很多其他问题,但是正如我所说的,我正在学习,并且从教程中获得了所有这些内容。

#instaniation
app = Flask(__name__)
app.secret_key= 'secret123'

#config
app.config['MYSQL_HOST'] = 'us-cdbr-iron-east-02.cleardb.net'
app.config['MYSQL_USER'] = 'redacted'
app.config['MYSQL_PASSWORD'] = 'redacted'
app.config['MYSQL_DB'] = 'heroku_0c6326c59d8b6e9'
app.config['MYSQL_CURSORCLASS'] = 'DictCursor' #a cursor is a connection to let us run methods for queries. We set is as a dictionary

#init MySQL
mysql = MySQL(app,cursorclass=DictCursor)

#url endpoint
@app.route('/')

#function for starting app
def index():
    #can directly return HTML
    return render_template('index.html')

@app.route('/about')
def about():
    return render_template('about.html')

#many articles
@app.route('/articles')
def articles():
    #create Cursor
    cur = mysql.get_db().cursor() #to execute commands
    cur.execute("USE myflaskapp")

    #get articles
    result = cur.execute("SELECT * FROM articles")
    #should retrieve all as a dictionary
    articles = cur.fetchall()
    if result > 0:
        return render_template('articles.HTML', articles=articles)
    else:
        msg= 'No Articles Found'
        return render_template('articles.HTML', msg=msg)
    cur.close()

1 个答案:

答案 0 :(得分:0)

从错误中可以看到:pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on 'localhost' ([Errno 111] Connection refused)") MySQL试图连接到localhost服务器,这意味着它没有加载您的配置变量。

如果您正在使用https://flask-mysql.readthedocs.io/en/latest/#中的flask扩展来加载MySQL,那么您可能忘记了初始化应用程序(pip install flask-mysql

mysql.init_app(app)

您的代码头现在应该像这样

并注意配置变量名称,扩展名使用略有不同的约定

from flask import Flask
from flaskext.mysql import MySQL

#instaniation
app = Flask(__name__)
app.secret_key= 'secret'

#config
app.config['MYSQL_DATABASE_USER'] = 'user'
app.config['MYSQL_DATABASE_PASSWORD'] = 'password'
app.config['MYSQL_DATABASE_DB'] = 'db'
app.config['MYSQL_DATABASE_HOST'] = 'host'

#init MySQL
mysql = MySQL()
mysql.init_app(app)