2017-04-16 134 views
0

我正嘗試使用Google App Engine(我對這兩者都是新手)設置基於Flask的Web應用程序。 網絡應用程序從客戶端接收數據,它應該被處理並保存在數據庫中。無法讓Flask-SQLAlchemy連接到我的Google App Engine數據庫

我試圖用燒瓶SQLAlchemy的,但我無法與谷歌雲SQL設置它,我用this guide在同一個項目中創建MySQL數據庫:

DB on GAE

,然後我想用我的主要Python代碼:

app.config('SQLALCHEMY_DATABASE_URI') = 'mysql+mysqldb://[email protected]/Results?unix_socket=/cloudsql/crafty-circlet-164415:psy01' 
app.config['SECRET_KEY'] = 'NglfxE8FOP9pgV8fxpyj' 
db = SQLAlchemy(app) 

class Result(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.Text) 
    profession = db.Column(db.Text) 
    year = db.Column(db.Text) 
    pressure_level = db.Column(db.Integer) 
    reported_suc_count = db.Column(db.Integer) 
    marked_suc_count = db.Column(db.Integer) 
    real_suc_count = db.Column(db.Integer) 
    insertion_time = db.Column(db.DateTime) 

    def __init__(self, name, profession, year, pressure_level, reported_suc_count, marked_suc_count, real_suc_count): 
     self.name = name 
     self.profession = profession 
     self.year = year 
     self.pressure_level = pressure_level 
     self.reported_suc_count = reported_suc_count 
     self.marked_suc_count = marked_suc_count 
     self.real_suc_count = real_suc_count 
     self.insertion_time = datetime.utcnow() 

@app.route('/resultform', methods=['POST', 'GET']) 
def resultform(): 
    if request.method == 'POST': 
     if not request.form['successmatrices']: 
      flash('please fill all the fields', 'error') 
     else: 
      if 'name' in request.form: 
       name = request.form['name'] 
      else: 
       name = None 
      if 'profession' in request.form: 
       profession = request.form['profession'] 
      else: 
       profession = None 
      if 'year' in request.form: 
       year = request.form['year'] 
      else: 
       year = None 
      if 'pressure_level' in request.form: 
       pressure_level = int(request.form['pressure_level']) 
      else: 
       pressure_level = None 
      if 'successmatrices' in request.form: 
       successmatrices = int(request.form['successmatrices']) 
      else: 
       successmatrices = 0 
      new_result = Result(name=name, profession=profession, year=year, pressure_level=pressure_level, reported_suc_count=successmatrices, marked_suc_count=len(session['marked']), real_suc_count=len(session['correct'])) 
      db.session.add(new_result) 
      db.session.commit() 
      return redirect(url_for('showresults')) 
    return render_template("resultform.html") 

@app.route('/showresults') 
def showresults(): 
    return render_template("showresults.html", results=Results.query.all()) 

if __name__ == '__main__': 
    db.create_all() 
    app.run(debug=True) 

當我想在我的地方發展運行它(我使用PyCharm)我收到以下錯誤在後臺:

ERROR 2017-04-16 09:20:19,802 wsgi.py:263] 
Traceback (most recent call last): 
    File "C:\Users\<>\AppData\Local\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\google\appengine\runtime\wsgi.py", line 240, in Handle 
    handler = _config_handle.add_wsgi_middleware(self._LoadHandler()) 
    File "C:\Users\<>\AppData\Local\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\google\appengine\runtime\wsgi.py", line 299, in _LoadHandler 
    handler, path, err = LoadObject(self._handler) 
    File "C:\Users\<>\AppData\Local\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\google\appengine\runtime\wsgi.py", line 85, in LoadObject 
    obj = __import__(path[0]) 
    File "C:\Users\<>\PycharmProjects\crafty-circlet-164415\main.py", line 7 
    app.config('SQLALCHEMY_DATABASE_URI') = 'mysql+mysqldb://[email protected]/Results?unix_socket=/cloudsql/crafty-circlet-164415:psy01' 
SyntaxError: can't assign to function call 

和部署到GAE以下錯誤後會出現:

Error: Server Error 
The server encountered an error and could not complete your request. 

Please try again in 30 seconds. 

不知道如何解決這個問題?

+0

,你也必須包括雲SQL實例名稱下的測試設置app.yaml文件(柔性ENV)。 –

回答

0

app.config是一個字典,所以要添加配置值,您將使用[ ]而不是(),就像您在app.config['SECRET_KEY']中所做的那樣。

所以它應該是:

app.config['SQLALCHEMY_DATABASE_URI'] = SQLALCHEMY_DATABASE_URI 

其他一些指針太成功連接。你需要正確地格式化您的連接細節:

USER = 'root' 
PASSWORD = 'your-cloudsql-password' 
DATABASE = 'your-cloudsql-database-name' 
# connection_name is of the format `project:region:your-cloudsql-instance` 
CONNECTION_NAME = 'your-cloudsql-connection-name' 

SQLALCHEMY_DATABASE_URI = (
    'mysql+pymysql://{user}:{password}@localhost/{database}' 
    '?unix_socket=/cloudsql/{connection_name}').format(
     user=USER, password=PASSWORD, 
     database=DATABASE, connection_name=CONNECTION_NAME) 

app.config['SQLALCHEMY_DATABASE_URI'] = SQLALCHEMY_DATABASE_URI 

我將我的祕密和其他敏感信息可能分成一個配置文件不簽入源代碼或使用環境變量等

如果你想與您的Cloud SQL執行本地測試您的應用程序,你需要安裝the Cloud SQL Proxy,並添加連接名稱爲環境變量和MySQLdb庫您app.yaml

> cloud_sql_proxy -instances=your-connection-name=tcp:3306 

否則您可以使用本地MySQL實例進行測試,但在應用引擎上切換到Cloud SQL。

More information on setting up Cloud SQL with App Engine can be found here

相關問題