2017-04-16 15 views
0

Google App Engine을 사용하여 Flask를 기반으로 웹 응용 프로그램을 설정하려고합니다. 웹 응용 프로그램은 클라이언트에서 데이터를 수신하고 처리하여 데이터베이스에 저장해야합니다.Flask-SQLAlchemy를 Google App Engine DB에 연결할 수 없습니다.

나는 플라스크-SQLAlchemy의 사용하려고했지만 내가 같은 프로젝트에서 MySQL의 DB를 만들 this guide을 사용했습니다, Google 클라우드 SQL로 설정 드릴 수 없습니다 :

DB on GAE

한 다음 내 주요 파이썬 코드를 사용하려고 해요 :

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

은 또한 당신은 베타 설정에서 (플렉스 ENV)를 애플리케이션 제목 파일을 클라우드 SQL 인스턴스 이름을 포함해야합니다. –

답변

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 

아마

등을 소스로 선택하지 설정 파일에 내 비밀과 모든 기타 민감한 정보를 분리 또는 환경 변수를 사용합니다 로컬 클라우드 SQL 인스턴스와 응용 프로그램을 테스트하려면

, 당신은 the Cloud SQL Proxy를 설치하고 app.yaml

> cloud_sql_proxy -instances=your-connection-name=tcp:3306 
,369에 환경 변수와 MySQLdb 라이브러리로 연결 이름을 추가해야합니다

그렇지 않으면 테스트를 위해 로컬 MySQL 인스턴스를 사용할 수 있지만 앱 엔진에서 Cloud SQL으로 전환 할 수 있습니다.

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