Попытка развернуть веб-приложение Flask с помощью формы входа в систему с использованием SQLAlchemy и SQLITE3. Приложение работает, как и ожидалось, при локальном запуске. Однако при развертывании в качестве веб-службы Azure невозможно получить доступ к базе данных или выполнить запись в нее. Это приводит к следующему выводу ошибки:
500 Internal Server Error
2019-01-05T19:13:30.235301217Z [2019-01-05 19:13:30,198] ERROR in app: Exception on /register [POST]
2019-01-05T19:13:30.235339017Z Traceback (most recent call last):
2019-01-05T19:13:30.235343817Z File
...
2019-01-05T19:13:30.235502017Z File "/home/site/wwwroot/antenv/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 724, in _commit_impl
2019-01-05T19:13:30.235505417Z self.engine.dialect.do_commit(self.connection)
2019-01-05T19:13:30.235508817Z File "/home/site/wwwroot/antenv/lib/python3.7/site-packages/sqlalchemy/engine/default.py", line 462, in do_commit
2019-01-05T19:13:30.235512317Z dbapi_connection.commit()
2019-01-05T19:13:30.235624616Z sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) database is locked (Background on this error at: http://sqlalche.me/e/e3q8)
У меня проблемы с расследованием этой ошибки, поскольку она ведет себя, как и ожидалось, локально. Веб-приложение Azure находится в группе ресурсов, невидимой для других, поэтому это не может быть источником конфликта параллелизма.
models.py
from flask_login import UserMixin
from werkzeug.security import check_password_hash
from werkzeug.security import generate_password_hash
from app.extensions import db
from app.extensions import login
@login.user_loader
def load_user(id):
return User.query.get(int(id))
class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), index=True, unique=True)
password_hash = db.Column(db.String(128))
def set_password(self, password):
self.password_hash = generate_password_hash(password)
def check_password(self, password):
return check_password_hash(self.password_hash, password)
def __repr__(self):
return '<User {}>'.format(self.username)
webapp.py
from flask import Blueprint
from flask import redirect
from flask import render_template
from flask import request
from flask import url_for
from flask_login import current_user
from flask_login import login_required
from flask_login import login_user
from flask_login import logout_user
from werkzeug.urls import url_parse
from app.extensions import db
from app.forms import LoginForm
from app.forms import RegistrationForm
from app.models import User
server_bp = Blueprint('main', __name__)
@server_bp.route('/')
def index():
return render_template("index.html", title='Home Page')
@server_bp.route('/login', methods=['GET', 'POST'])
def login():
if current_user.is_authenticated:
return redirect(url_for('main.index'))
form = LoginForm()
if form.validate_on_submit():
user = User.query.filter_by(username=form.username.data).first()
if user is None or not user.check_password(form.password.data):
error = 'Invalid username or password'
return render_template('login.html', form=form, error=error)
login_user(user, remember=form.remember_me.data)
next_page = request.args.get('next')
if not next_page or url_parse(next_page).netloc != '':
next_page = url_for('main.index')
return redirect(next_page)
return render_template('login.html', title='Sign In', form=form)
@server_bp.route('/logout')
@login_required
def logout():
logout_user()
return redirect(url_for('main.index'))
@server_bp.route('/register', methods=['GET', 'POST'])
def register():
if current_user.is_authenticated:
return redirect(url_for('main.index'))
form = RegistrationForm()
if form.validate_on_submit():
user = User(username=form.username.data)
user.set_password(form.password.data)
db.session.add(user)
db.session.commit()
return redirect(url_for('main.login'))
return render_template('register.html', title='Register', form=form)
@server_bp.route('/dynamic_chart', methods=['POST', "GET"])
def dynamicchart():
req_data = request.get_json()
hour1 = req_data["hour1"]
return hour1
Любая идея, помощь приветствуется. Спасибо за ваше время.