Flask - 无法在视图上提交更改

时间:2016-07-27 00:14:38

标签: python flask flask-sqlalchemy

我在服务器上部署了这个Flask应用程序。

一切正常,除了我需要db.session.commit()anytihing的视图。我一直在寻找循环导入和数据库引擎的东西,但我似乎无法理解为什么它不起作用。

下面我发布了我的 init .py和其中一个我似乎无法工作的观点。

 #__init__.py

from flask import Flask
from flask.ext.bootstrap import Bootstrap
from flask.ext.moment import Moment
from flask.ext.sqlalchemy import SQLAlchemy
from config import config
from flask.ext.login import LoginManager
import os

basedir = os.path.abspath(os.path.dirname(__file__))

bootstrap = Bootstrap()
moment = Moment()
db = SQLAlchemy()

login_manager = LoginManager()
login_manager.session_protection = 'strong'
login_manager.login_view = 'auth.login'

def create_app(config_name):
        app = Flask(__name__)
        app.config.from_object(config[config_name])
        config[config_name].init_app(app)

        bootstrap.init_app(app)
        moment.init_app(app)
        db.app = app
        db.init_app(app)
        db.create_all()
        login_manager.init_app(app)

        #BLUEPRINTS
        from main import main as main_blueprint
        app.register_blueprint(main_blueprint)

        from auth import auth as auth_blueprint
        app.register_blueprint(auth_blueprint, url_prefix = '/auth')

        from api import api as api_blueprint
        app.register_blueprint(api_blueprint, url_prefix = '/api')

        return app

app = create_app(os.getenv('FLASK_CONFIG') or 'default')

if __name__ == "__main__":
    app.run()

定义数据库设置的config.py文件

# -*- coding: utf-8 -*-

import os
basedir = os.path.abspath(os.path.dirname(__file__))

class Config:
    SECRET_KEY = os.environ.get('SECRET_KEY') or 'hard to guess string'
    SQLALCHEMY_COMMIT_ON_TEARDOWN = True
    SQLALCHEMY_TRACK_MODIFICATIONS = True
    # MAIL_SERVER = 'smtp.googlemail.com'
    MAIL_SERVER = 'smtp.live.com'
    MAIL_PORT = 587
    MAIL_USE_TLS = True
    # Variáveis de configuração definidas na linha de comandos por motivos de segurança
    MAIL_USERNAME = os.environ.get('MAIL_USERNAME')
    MAIL_PASSWORD = os.environ.get('MAIL_PASSWORD')
    ORGANITE_MAIL_SUBJECT_PREFIX = '[Organite]'
    ORGANITE_MAIL_SENDER = '*****@hotmail.com'
    ORGANITE_ADMIN = '*****@hotmail.com'

    @staticmethod
    def init_app(app):
        pass

class DevelopmentConfig(Config):
        DEBUG = True
        SQLALCHEMY_DATABASE_URI = 'sqlite:///data-dev.sqlite'

class TestConfig(Config):
        TESTING = True
        SQLALCHEMY_DATABASE_URI = os.environ.get('TEST_DATABASE_URL') or \
                'sqlite:///' + os.path.join(basedir, 'data-test.sqlite')

class ProductionConfig(Config):
        SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or \
                'sqlite:///' + os.path.join(basedir, 'data.sqlite')

config = {
        'development': DevelopmentConfig,
        'testing': TestConfig,
        'production': ProductionConfig,
        'default': DevelopmentConfig
}

然后在我的api蓝图中,其中一个视图不起作用:

# -*- coding: utf-8 -*-

from flask import jsonify, request, session, redirect, url_for, current_app
from flask.ext.login import login_user, logout_user, login_required, \
    current_user
from .. import db
from ..models import User
from flask.ext.login import login_required
from ..decorators import admin_required, permission_required
from . import api
import cx_Oracle
import datetime
import json
import os

os.environ["NLS_LANG"] = ".UTF8"

#Remover utilizador > JSON
@api.route('/delete/<id>', methods=['GET'])
@login_required
@admin_required
def del_user(id):
    user = User.query.filter_by(num_mec=id).first()
    if user is not None:
        try:
            db.session.delete(user)
            db.session.commit()
            status = 'Sucesso'
        except:
            status = 'Falhou'
    else:
        status='Falhou'
    db.session.close()
    return jsonify({'result': status})

无论我做出哪些更改,结果都将始终为'Falhou',这意味着db.session.commit()失败。

我甚至不知道如何查看这类事情的日志错误,我似乎无法理解为什么它不起作用。

请帮助,我没时间完成这个项目。

1 个答案:

答案 0 :(得分:0)

在这种情况下,遗憾的是,grep阻止了错误的真正原因,它阻止了错误,只是通过返回失败结果来处理错误。

删除try: except,您将在Flask生成的崩溃日志中看到会话提交失败的原因(在这种情况下,正如您在评论中提到的,对数据库文件没有足够的权限)

作为一般规则,除非预期会出现异常并且必须正常处理,否则最好让它崩溃并以最大错误报告进行刻录(至少在调试模式下),这样就可以通过静默忽略来防止错误。由于没有一般用例,您可能会认为失败的提交是正常行为,因此您不应将其包装在try: except块中。