Это структура моего проекта
Код: Выделить всё
├── 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 после создания app = create_app().
- Пытался добавить init.py внутри create_app() после инициализации расширений.
Пытался поместить его в extensions.py внутри метода init_extensions(app). li>
Может кто-нибудь подсказать мне, что я здесь делаю неправильно, и улучшить дизайн подходы, если это возможно.
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)
В моем < strong>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