Это структура моего проекта
Код: Выделить всё
├── app.py
├── flask_api
│ ├── __init__.py
│ ├── config.py
│ ├── extensions.py
│ ├── models.py
│ └── routes.py
├── instance
└── migrations
├── __pycache__
├── env.py
└── versions
Код: Выделить всё
from flask_api import create_app
app = create_app()
if __name__ == '__main__':
app.run(debug=True)
Код: Выделить всё
from flask import Flask
from flask_api.config import Config
from flask_api.extensions import db, migrate, init_extensions, user_datastore
from flask_api.routes import main
def create_app():
app = Flask(__name__)
app.config.from_object(Config)
init_extensions(app) # Initializing extensions
app.register_blueprint(main) # Registering blueprint
return app
if __name__ == '__main__':
app = create_app()
app.run(debug=True)
Код: Выделить всё
from flask_sqlalchemy import SQLAlchemy
from flask_security import Security, SQLAlchemyUserDatastore
from flask_migrate import Migrate
from flask_api.models import User, Role
db = SQLAlchemy()
migrate = Migrate()
user_datastore = SQLAlchemyUserDatastore(db, User, Role)
def init_extensions(app):
global user_datastore, security
db.init_app(app)
migrate.init_app(app, db)
security = Security(app, user_datastore)
Код: Выделить всё
from flask_sqlalchemy import SQLAlchemy
from flask_security import UserMixin, RoleMixin
db = SQLAlchemy()
roles_users = db.Table('roles_users',
db.Column('user_id', db.Integer(), db.ForeignKey('user.id')),
db.Column('role_id', db.Integer(), db.ForeignKey('role.id'))
)
class Role(db.Model, RoleMixin):
...
class User(db.Model, UserMixin):
...
Код: Выделить всё
from flask import Blueprint, request, jsonify
from flask_api.models import db, User, Role
from flask_api.extensions import user_datastore
main = Blueprint('main', __name__)
@main.route('/user-signup', methods=['POST'])
def user_signup():
data = request.json
if user_datastore.find_user(email=data['email']):
return jsonify(message="Email is already registered"), 400
# More signup logic is there
...
@main.route('/user-login', methods=['POST'])
def user_login():
# More logic
...
и делаю запрос POST к конечной точке /user-signup создается файл main.db, но внутри него нет таблиц.
Я знаю, что мне нужно где-то использовать фрагмент кода, чтобы вручную инициировать таблицы:
Код: Выделить всё
with app.app_context():
db.create_all()
[*]Пытался поместить его в app.py после создания приложения = create_app ().
[*]Попробовал добавить init.py внутри метода create_app(), после инициализация расширений.
[*]Пытался поместить его в extensions.py внутри метода init_extensions(app).
< /ul>
Ни один из этих подходов не работает. Может ли кто-нибудь помочь мне с тем, что я здесь делаю неправильно, и с лучшими подходами к проектированию, если таковые имеются.
PS. Я пропустил здесь некоторый код, потому что думал, что он не имеет отношения к вопрос, но я могу поделиться им, если необходимо.
РЕДАКТИРОВАТЬ. Кроме того, если я откажусь от структуры своего проекта и сохраню все в одном файле (__init__.py), то все будет работать нормально. - таблицы создаются прекрасно, все самостоятельно (даже без необходимости в db.create_all()).
Вот почему я твердо верю, что это возможно с моей текущей структурой проекта.
РЕДАКТИРОВАТЬ 2.
Я обновил свой __init__.py следующим образом:
Код: Выделить всё
from flask import Flask
from flask_api.config import Config
from flask_api.extensions import db, migrate, init_extensions, user_datastore
from flask_api.routes import main
def create_app():
app = Flask(__name__)
app.config.from_object(Config)
with app.app_context():
init_extensions(app)
app.register_blueprint(main)
print(db.metadata.tables.keys()) # dict_keys([])
print(db.engine.table_names()) # ['alembic_version']
db.create_all()
return app
if __name__ == '__main__':
app = create_app()
app.run(debug=True)
В моем routes.py Я тестировал с ними -
Код: Выделить всё
from flask import Blueprint, request, jsonify
from flask_api.models import db, User, Role
from flask_api.extensions import user_datastore
main = Blueprint('main', __name__)
@main.route('/user-signup', methods=['POST'])
def user_signup():
print(db.metadata.tables.keys()) # dict_keys(['roles_users', 'role', 'user'])
print(db.engine.table_names()) # ['alembic_version']
import pdb; pdb.set_trace() # To stop further code from executing
# More signup logic is there
...
@main.route('/user-login', methods=['POST'])
def user_login():
# More logic
...
Подробнее здесь: https://stackoverflow.com/questions/790 ... ng-created