我正在开发我的第一个网站(我知道)。我正在使用 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”路由,然后应该生成日志并将数据提交到数据库,这种情况有时会发生,但大多数时候功能似乎基本上只是跳到函数末尾的重定向,跳过中间的所有内容。