2017-07-17 7 views
0

Auf meinem lokalen Server läuft die Anwendungsdatenbank gut und bringt immer die gleichen Ergebnisse, aber wenn ich meine Flask-Anwendung auf dem Server bereitstellen und ein Element hinzufügen, variieren die Ergebnisse beim Abrufen die Daten. Sie können dieses Problem unter http://rest-menuapp.appspot.com/JSON anzeigen. Wenn Sie die Seite aktualisieren, werden Sie sehen, dass das Element manchmal nicht vorhanden ist und manchmal dort ist.Google App Engine - Flask - SQLAlchemy - Inkonsistente Datenbank

Hier ist meine app.yaml Datei:

runtime: python 
env: flex 
entrypoint: gunicorn -b :$PORT item_catalog:app 
threadsafe: false 
runtime_config: 
    python_version: 2 

handlers: 
- url: /static 
    static_dir: static 

- url: /static/photos 
    static_dir: static/photos 

- url: /.* 
    script: item_catalog.app 

Hier ist meine Datenbank

from sqlalchemy import create_engine 
from sqlalchemy.orm import scoped_session, sessionmaker 
from sqlalchemy.ext.declarative import declarative_base 


engine = create_engine('sqlite:///catalog.db', convert_unicode=True) 
db_session = scoped_session(sessionmaker(autocommit=False, 
             autoflush=False, 
             bind=engine)) 

Base = declarative_base() 
Base.query = db_session.query_property() 

def init_db(): 
    # import all modules here that might define models so that 
    # they will be registered properly on the metadata. Otherwise 
    # you will have to import them first before calling init_db() 
    import models 
    Base.metadata.create_all(bind=engine) 

Diese

der Beginn meiner Routing-Python-Datei ist
from flask import Flask, render_template, request, redirect, jsonify,\ 
    url_for, session, g, send_from_directory 
from sqlalchemy import create_engine, asc 
from sqlalchemy.orm import sessionmaker 
from datetime import datetime 
from functools import wraps 
from werkzeug.utils import secure_filename 
from PIL import Image 
import os 



from apiclient import discovery 
import httplib2 
from oauth2client import client, crypt 

from database import init_db, db_session 
from models import Item, Category, User, Photo 

UPLOAD_FOLDER = 'static/photos' 
ALLOWED_EXTENSIONS = set(['png', 'jpg', 'jpeg', 'gif']) 
init_db() 


app = Flask(__name__) 
+0

Sie speichern den Status lokal in einer Datei. Wenn mehrere Instanzen Ihre App ausführen, verfügen Sie über mehrere Kopien Ihrer Daten, die sich von den anderen unterscheiden. – univerio

+0

Dies ist der Katalog.db. Wie würde ich ändern, um es für alle Instanzen zu speichern. – nanomosfet

+0

Muss ich nur eine Postgresql-Datenbank einrichten? Oder wie kann ich mehrere Instanzen ausschalten? – nanomosfet

Antwort

0

So ist die schnelle und Eine einfache Lösung bestand darin, meine Google App-Engine so zu ändern, dass nur eine Instanz verwendet wurde. Dies wurde durch Hinzufügen von:

manual_scaling: 
    instances: 1 

in meine app.yaml-Datei getan.

Als universio in den Kommentaren erwähnt Ich war die Datenbankdatei lokal speichern und da es mehrere Instanzen gab es mehrere Versionen der Datenbank. Eine andere Lösung wäre, meine Datenbank auf PostgreSQL umzustellen. Für meine Zwecke war es einfach, die Anzahl der Instanzen zu begrenzen.