Flask-sqlalchemy,推向生产

问题描述 投票:0回答:0

我正在开发我的第一个网站(我知道)。我正在使用 Flask-SQLAlchemy 连接到使用 SQLite 引擎的数据库。当我在本地托管时,我的应用程序完全按照预期工作。几天前,我刚刚尝试使用 Gunicorn 和 Digital Ocean Site 将其投入生产,但出现了一个明显的问题。数据库检索工作得很好,但是当网站被托管时,提交数据只有大约 50% 的时间有效,而且通常是在您已经提交表单之后。我要修复的主要第一步是用户创建帐户的注册页面。不过这里有一个非常奇怪的问题;当注册“发布”页面处于活动状态时,我有一个日志设置来记录用户交互,当我在网站上提交发布请求时,它应该记录交互并提交新用户。然而,问题是有时我提交 HTML 表单并直接重定向到登录页面(它应该在记录和提交数据后重定向)但没有记录和提交,就像路由只是跳过其他所有内容并直接转到重定向。感谢您提供的任何帮助!

app.py

from flask import Flask
from flask_login import LoginManager
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

def create_app():
    app = Flask(__name__)

    app.config['SECRET_KEY'] = 'SPQR'

    # Database initialization
    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///bank_data.db'

    db.init_app(app)

    # Create authorization blueprint
    from auth import auth
    app.register_blueprint(auth)

    # Create main blueprint
    from main import main
    app.register_blueprint(main)

    from admin import admin
    app.register_blueprint(admin)

    # Initiate Login Manager
    login_manager = LoginManager()
    login_manager.login_view = 'auth.login'
    login_manager.init_app(app)

    # Import the User model
    from models import User

    # Get the user assoicated with user id.
    @login_manager.user_loader
    def load_user(id):
        return User.query.get(int(id))
    
    return app

setup_database.py

lang-python
import models
from app import create_app
from werkzeug.security import generate_password_hash

def main():
    app = create_app()
    with app.app_context():
        models.db.create_all()

        savings_ir = 0.25
        savings_min = 5.0
        checkings_ir = 0.0
        checkings_min = 0.0

        models.db.session.add(models.Bank_Settings(savings_ir=savings_ir,
        savings_min=savings_min, checkings_ir=checkings_ir, 
        checkings_min=checkings_min))

        models.db.session.add(models.User(id=1, username='executive', 
        password=generate_password_hash('HarrisonWells', method='sha256'), 
        name='Admin'))

        models.db.session.commit()

    return 1

if __name__ == '__main__':
    main()

auth.py

@auth.route('/signup/', methods=['GET'])
def signup():
    logging.basicConfig(filename='debug.log', level=logging.DEBUG)
    logging.debug(datetime.now())
    logging.debug('Signup page active, GET request recieved')
    return render_template('signup.html')

@auth.route('/commit_signup/', methods=['POST'])
def commit_signup():
    logging.basicConfig(filename='debug.log', level=logging.DEBUG)
    logging.debug(datetime.now())
    logging.debug('Signup page active, POST request recieved')
    logging.debug('Using Database URI: %s' % (current_app.config['SQLALCHEMY_DATABASE_URI']))
    # Get username, password, and name.
    username = request.form['username']
    password = request.form['password']
    name = request.form['name']

    logging.debug('Recieved: Username %s, Password %s, Name %s' % (username, password, name))

    # Query for other users
    check_users = User.query.filter_by(username=username).first()

    # Good to continue if no other users with this username
    if not check_users:
        if username:
            if password:
                if name:

                    logging.debug('Valid submission attempting to commit to db')

                    # Generate password hash and create new User entry
                    hash = generate_password_hash(password, method='sha256')
                    new_user = User(username=username, name=name, password=hash)

                    # Add user to database and commit
                    db.session.add(new_user)

                    logging.debug('New user added to session')

                    db.session.commit()

                    logging.debug('Session committed to database, ')

                    # Redirect to login
                    return redirect(url_for('auth.login'))
                
                else:
                    logging.debug('Did not provide name')
                    flash('Provide A Name')

            else:
                logging.debug('Did not provide password')
                flash('Provide A Password')

        else:
            logging.debug('Did not provide password')
            flash('Provide A Username')

    else:
        logging.debug('Found users with username: %s' % (check_users.username))
        flash('Username Taken')
    
    return redirect(url_for('auth.signup'))

html 表单应该提交,然后转到注册“post”路由,然后应该生成日志并将数据提交到数据库,这种情况有时会发生,但大多数时候功能似乎基本上只是跳到函数末尾的重定向,跳过中间的所有内容。

sqlite flask sqlalchemy flask-sqlalchemy flask-login
© www.soinside.com 2019 - 2024. All rights reserved.