Какие существуют способы заполнения приложения Flask?

Я собираюсь развернуть очень простое фляжное приложение на aws Elastic Beanstalk. Каким образом мне нужно поместить некоторые исходные данные, чтобы у живого экземпляра было несколько пользователей?

from dateutil import parser
from datetime import datetime
from flask import Flask, request, jsonify
from flask_sqlalchemy import SQLAlchemy
from flask_marshmallow import Marshmallow
import os

app = Flask(__name__)
basedir = os.path.abspath(os.path.dirname(__file__))

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'db.sqlite')
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
db = SQLAlchemy(app)
ma = Marshmallow(app)


.
.
.

@app.route('/user/<id>', methods=['PUT'])
def update_user(id):
    user = User.query.get(id)
    weight = request.json['weight']
    user.weight = weight
    db.session.commit()
    return user_schema.jsonify(user)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String)
    weight = db.Column(db.Float)
    workouts = db.relationship('Workout', backref='user', lazy=True)

    def __init__(self, name, weight):
        self.name = name
        self.weight = weight

class UserSchema(ma.Schema):
    class Meta:
        fields = ('id', 'name', 'weight')

user_schema = UserSchema(strict=True)
users_schema = UserSchema(many=True, strict=True)

.
.
.

db.create_all()

if __name__ == '__main__':
    app.run(debug=True)

Опять же, я хочу, чтобы у живого экземпляра были некоторые начальные данные (я знаю, что могу просто создать некоторые записи, используя консоль локально). Я думал, что я должен включить семена в блок

if __name__ == '__main__':
    user1 = User('Jon',75)
    db.session.add(user1)
    db.session.commit()

Но я не уверен, как правильно это сделать. Также не будет ли это запускаться каждый раз при запуске приложения? Мне просто нужно, чтобы он запускался один раз в самый первый раз


person irmaz    schedule 28.07.2019    source источник


Ответы (1)


У меня была похожая потребность некоторое время назад для моего нового приложения Flask, и я решил ее, создав функцию с Faker, чтобы добавить некоторые исходные данные, а затем вызвать ее с помощью команды cli из Click, так как мне нужно было просто запустить ее один раз. Я думаю, это может сработать и для вас. Обратите внимание, что обе библиотеки являются внешними.

Вот пример, который может подойти для вашего случая — внесите необходимые изменения:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import os

import click
import random

from faker import Faker


app = Flask(__name__)
basedir = os.path.abspath(os.path.dirname(__file__))

fake = Faker() #initialize faker service

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'db.sqlite')
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
db = SQLAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String)
    weight = db.Column(db.Float)
    workouts = db.relationship('Workout', backref='user', lazy=True)

    def __init__(self, name, weight):
        self.name = name
        self.weight = weight
rest of your code...

Эта функция будет вызываться командой Cli, чтобы добиться цели.

@click.command()
@click.option('--count', default=20, help='number of users to be generated')
def add_users(count):
    """
    Generate fake users.
    """
    random_usernames = []
    data = []

    click.echo('Working...')

    # Ensure we get the count number of usernames.

    for i in range(0, count):
        random_usernames.append(fake.first_name())

    random_usernames = list(set(random_usernames))

    while True:
        if len(random_usernames) == 0:
            break

        username = random_usernames.pop()
        weight = random.uniform(30.5,260.5)

        user = User(username, weight)
        db.session.add(user)
        db.session.commit()


    return click.echo('{} users were added successfully to the database.'.format(count))

if __name__ == '__main__':
    add_users()

Наконец, вызовите команду cli в командной строке.

$ python app.py --count=50
Working...
50 users were added successfully to the database.

Click вместе с Faker очень полезны, надеюсь, они вам подойдут.

person Kenny Aires    schedule 29.07.2019