Ejemplo n.º 1
0
def cli(ctx):
    """Create the table for covid-19 va data"""

    ctx.log("Creating Covid-19 Database Tables...")

    init_db()

    ctx.log("Done...")
Ejemplo n.º 2
0
def create_app():

    app = Flask(__name__)

    # database settings
    app.config.from_pyfile('dbconfig_%s.py' % os.getenv('FLASK_ENV'))
    init_db(app)

    return app
Ejemplo n.º 3
0
def create_app():

    app = Flask(__name__)
    app.config.from_object('src.config.Config')

    init_db(app)

    api = Api(app)
    api.add_resource(RecipeListAPI, '/recipes')
    api.add_resource(RecipeAPI, '/recipes/<int:id>')

    return app
Ejemplo n.º 4
0
def configure_db(app):
    """
    配置数据库
    :param app:
    :return:
    """
    from src.database import init_db, db_session
    init_db()

    @app.teardown_request
    def shutdown_session(exception=None):
        db_session.remove()
Ejemplo n.º 5
0
def client():
    db_fd, app.config['DATABASE'] = tempfile.mkstemp()
    app.config['TESTING'] = True

    with app.test_client() as client:
        with app.app_context():
            init_db()

        yield client

    os.close(db_fd)
    os.unlink(app.config['DATABASE'])
Ejemplo n.º 6
0
def create_app():

    app = Flask(__name__)
    app.config.from_object('src.config.Config')

    init_db(app)

    api = Api(app)
    api.add_resource(HogeHello, '/')
    api.add_resource(HogeListAPI, '/hoges')
    api.add_resource(HogeAPI, '/hoges/<id>')

    return app
Ejemplo n.º 7
0
def create_app():
    app = Flask(__name__)
    app.config['JSON_AS_ASCII'] = False
    app.config.from_object('src.config.Config')

    init_db(app)

    api = Api(app)
    api.add_resource(RelationsAPI, '/relations')
    api.add_resource(RecordsAPI, '/records')

    CORS(app)
    return app
Ejemplo n.º 8
0
def create_app(config_name):
    from src.database import init_db
    from src.transacoes.views import transacoes_api

    app = Flask(__name__)

    try:
        app.config.from_object(f'config.{config_name}')
    except ImportError:
        raise Exception('Invalid Config')

    init_db(app)
    app.register_blueprint(transacoes_api, url_prefix='/api/v1/')

    return app
Ejemplo n.º 9
0
def load_pickled_data():
    drop_tables()
    init_db()
    db_session = get_session()
    with open("ex_data.p", "rb") as muscle_pickle:
        exercises = pickle.load(muscle_pickle)
    pprint(exercises)
    day_1_db = Day(desc="Day 1")
    day_2_db = Day(desc="Day 2")
    day_3_db = Day(desc="Day 3")
    day_4_db = Day(desc="Day 4")
    db_session.add_all([day_1_db, day_2_db, day_3_db, day_4_db])
    db_session.flush()

    day_muscle_map = [[[
        'Abdominals', 'Lower Back', 'Middle Back', 'Quadriceps'
    ], day_1_db], [['Glutes', 'Calves', 'Triceps'], day_2_db],
                      [['Biceps', 'Forearms', 'Traps', 'Shoulders'], day_3_db],
                      [['Lats', 'Chest', 'Hamstrings'], day_4_db]]
    # Muscle, Day, Exercise
    db_muscles = {}
    for ex in exercises:
        muscle = ex["muscle"]
        ex_name = ex["name"]
        ex_url = ex["url"]
        db_day = next(
            (day for muscles, day in day_muscle_map if muscle in muscles))
        if muscle not in db_muscles.keys():
            db_muscle = Muscle(name=muscle, day_id=db_day.id)
            db_muscles[muscle] = db_muscle
            db_session.add(db_muscle)
        else:
            db_muscle = db_muscles[muscle]
        db_exercise = Exercise(name=ex_name, muscle=db_muscle, url=ex_url)
        db_session.add(db_exercise)
    db_session.commit()
Ejemplo n.º 10
0
def create_app():
    # twitter api key
    consumer_api_key = ENV_VALUES["CONSUMER_API_KEY"]
    consumer_secret_key = ENV_VALUES["CONSUMER_SECRET_KEY"]
    # Twitter api URLs
    request_token_url = "https://api.twitter.com/oauth/request_token"
    authorization_url = "https://api.twitter.com/oauth/authorize"
    access_token_url = "https://api.twitter.com/oauth/access_token"
    # get_timeline_url = "https://api.twitter.com/1.1/statuses/user_timeline.json"

    app = Flask(__name__)
    app.config.from_object("src.config.Config")  # configを別ファイルのオブジェクトから読み込む
    CORS(app)

    app.secret_key = b"\x17x\xf0\x83\x93i\x14\xa3\xec<7\x88A\xca\xb5G"

    init_db(app)  # databaseの初期化を行う

    @app.route("/")
    def index():
        if "user_name" in session:
            # セッション変数の取得
            name = session["user_name"]
            return f"hello {name}"
        else:
            return redirect(url_for("get_twitter_request_token"))

    # 認証画面を返す
    @app.route("/user/login", methods=["GET"])
    def get_twitter_request_token():
        try:
            # リクエストトークンを取得し, 認証urlを取得してリダイレクトする. 失敗したらトップページへのリンクを提示する.
            # oauth_callback = ENV_VALUES['APP_URL']+"/callback"
            twitter = OAuth1Session(consumer_api_key, consumer_secret_key)
            twitter.fetch_request_token(request_token_url)
            auth_url = twitter.authorization_url(authorization_url)
            return redirect(auth_url)

        except Exception as e:
            print(e)
            return redirect(ENV_VALUES["APP_URL"])

    @app.route("/user/callback", methods=["GET"])
    def callback():
        users_show_url = "https://api.twitter.com/1.1/users/show.json"
        try:
            # getパラメータを取得
            oauth_token = request.args.get("oauth_token")
            oauth_verifier = request.args.get("oauth_verifier")
            # リクエストトークン取得から返ってきたgetパラメータを用いてアクセストークンを取得. 失敗したら認証のときと同様
            twitter = OAuth1Session(consumer_api_key, consumer_secret_key,
                                    oauth_token, oauth_verifier)
            response = twitter.post(access_token_url,
                                    params={"oauth_verifier": oauth_verifier})
            access_token = dict(parse_qsl(response.content.decode("utf-8")))

            twitter = OAuth1Session(
                consumer_api_key,
                consumer_secret_key,
                access_token["oauth_token"],
                access_token["oauth_token_secret"],
            )
            response = twitter.get(users_show_url,
                                   params={"user_id": access_token["user_id"]})

            if response.status_code == 200:
                user_data = json.loads(response.text)
                # ユーザー登録とセッション情報の兼ね合いがどうなるか未定なのでこのようにしておく
                users = User.query.filter(
                    User.name == access_token["screen_name"]).all()
                # users = User.query.filter(User.user_id==access_token['user_id']).all()

                # セッションID生成
                session_id = hashlib.sha256(
                    access_token["oauth_token"].encode("utf-8")).hexdigest()
                if len(users) == 0:
                    # 存在しないなら登録処理
                    user = User(name=user_data["screen_name"],
                                session_id=session_id)
                    db.session.add(user)
                    db.session.commit()
                else:
                    # print(f"hello, {users[0].name}")
                    # user = User.query.filter(
                    #   User.name==access_token['screen_name']
                    # ).first()
                    user = users[0]
                    print(f"hello, {user.name}")
                    user.session_id = session_id
                    db.session.commit()
                db.session.close()

                # アイコン画像URLから_normalを取り除きオリジナルサイズのものを得ている.
                # https://syncer.jp/Web/API/Twitter/Snippet/4/
                image_url = re.sub(r"_normal", "",
                                   user_data["profile_image_url_https"])
                # 返すデータを整えてjsonでreturn
                response_data = {
                    "sessionId": session_id,
                    "username": access_token["screen_name"],
                    "profile_image_url": image_url,
                }
                # print(session)
                return jsonify(response_data)
            else:
                raise Exception(
                    f"response status code is not 200 (is {response.status_code})"
                )
        except Exception as e:
            print(e)
            return redirect(ENV_VALUES["APP_URL"])

    @app.route("/user/logout", methods=["GET"])
    def logout():
        session_id = request.args.get("sessionID")
        user = User.query.filter(User.session_id == session_id).first()
        if user is not None:
            user.session_id = None
            db.session.commit()
        return redirect(ENV_VALUES["APP_URL"])

    # recommendされた最近のアニメを取得する
    # [GET] : "num": intに変換可能なstring, "sessionID": セッションID
    # {'animes': [ {"image": base64(string), "id": int}]} が返る
    @app.route("/user/recent", methods=["POST"])
    def fetch_recent_user_data():
        if request.method == "POST":
            image_num = request.json["num"]
            session_id = request.json["sessionID"]
            user = User.query.filter(User.session_id == session_id).first()
            if user is not None:
                # recommendedの日付データを見て新しい順に持ってくれば良い.
                # recommendedとAnimeDataをanime_idでjoinして, user_idを指定して時刻順にとってきて数の上限を設定する.
                past_data = (db.session.query(Recommended, AnimeData).join(
                    Recommended,
                    AnimeData.anime_id == Recommended.anime_id).filter(
                        Recommended.user_id == user.user_id).order_by(
                            desc(Recommended.updated_at)).limit(
                                int(image_num)).all())
                if past_data is None:
                    response_data = {"animes": []}
                else:
                    # print([data[1].anime_id for data in past_data])
                    # 各データのimageプロパティから画像をbase64でエンコードしたものを辞書にして返す.
                    response_data = {
                        "animes": [{
                            "image": img_encode(data[1].image),
                            "id": data[0].anime_id,
                        } for data in past_data]
                    }
                return jsonify(response_data)
            else:
                return redirect(ENV_VALUES["APP_URL"])

    # 指定した数(num)だけカードに表示するアニメの情報を取ってくる。DBにアクセスし、過去に表示したカード以外から適当に選んでくる。
    # [POST] : {"num": intに変換可能なstring, "sessionID": string, "animeId": [int, ...]}
    # {
    #    'animes': [
    #        {
    #           "id": int,
    #           "title": string,
    #           "image": base64(string),
    #           "description",
    #           "id": anime_id,
    #           "genre": [string, string, ...]
    #           "company": string
    #        }
    #    ]
    # }
    # が返る
    @app.route("/app/recs", methods=["POST"])
    def fetch_random_anime_data():
        if request.method == "POST":
            # テスト用クエリ(これをターミナルで打ち込むとpostでjsonが送信されます. データベースにも反映されるはずです)
            # curl http://localhost:5000//app/recs -X POST\
            # -H "Content-Type: application/json" --data\
            # '{"num": "5", "sessionID": "value", "animeId": [4,7,8,9,10]}'
            image_num = request.json["num"]
            session_id = request.json["sessionID"]
            anime_id_buffer = request.json["animeId"]
            # テストするときはパラメータが無いので他で適当にfilter
            user = User.query.filter(User.session_id == session_id).first()
            # image_num = "5"
            # user = User.query.filter(User.name == "Kw_I_KU").first()
            if user is not None:
                lu_data = (db.session.query(LikeUnlike).filter(
                    LikeUnlike.user_id == user.user_id).all())
                past_animes = [lu.anime_id for lu in lu_data] + anime_id_buffer
                past_animes = list(set(past_animes))
                # 過去に表示したことがあるものを含まないものからimage_num個に制限してとってくる
                animes = (db.session.query(AnimeData).filter(
                    AnimeData.anime_id.notin_(past_animes)).limit(
                        int(image_num)).all())
                response_data = {
                    "animes": [
                        {
                            "id": anime.anime_id,
                            "title": anime.title,
                            "image": img_encode(anime.image),  # 画像をbase64で返す
                            "description": anime.description,
                            "year": anime.year,
                            "genre": anime.genre.split(),
                            "company": anime.company,
                        } for anime in animes
                    ]
                }
                return jsonify(response_data)
            else:
                return redirect(ENV_VALUES["APP_URL"])

    def user_anime_matrix():
        # user_idとanime_idを縦横にもち値がstatusの二次元配列を返す
        all_users = User.query.all()
        anime_num = len(AnimeData.query.all())
        user_id_list = [user.user_id for user in all_users]
        print("user_id_list:", user_id_list)
        res = []
        for user_id in user_id_list:
            # ユーザーひとりに対してアニメに対するlikeunlikeのstatusを取得, リストで保持する.
            lu_data = (db.session.query(LikeUnlike).filter(
                LikeUnlike.user_id == user_id).order_by(
                    asc(LikeUnlike.anime_id)).all())

            if lu_data is not None:
                # そのユーザーがlike_unlikeを一つでも設定しているなら
                user_status_list = []
                index = 1  # user_status_listの要素数は最終的にanime_numにならないといけないのでそのようにする
                for data in lu_data:
                    data_anime_id = data.anime_id
                    data_status = data.status
                    # 前のループの次の場所からこのループのanime_idの場所まで0で埋める(デフォルト値)
                    user_status_list.extend([0] * (data_anime_id - index))
                    # このループのデータをいれる
                    user_status_list.append(data_status)
                    # インデックスを更新する
                    index = data_anime_id + 1
                # 終わったら最後までを0で埋める.
                user_status_list.extend([0] * (anime_num + 1 - index))
            else:
                # 一つもlike_unlikeをしていないなら全て0で埋める
                user_status_list = [0] * anime_num
            res.append(user_status_list)
        # return jsonify(res) # 確認用
        # アニメID順にステータスが並んだリストがユーザーごとに並んでいる二次元リストを返す.
        return res

    def anime_similarity():
        content_lu = np.array(user_anime_matrix()).T
        # anime_num, user_num = content_lu.shape[0], content_lu.shape[1]
        corr_mat = np.dot(content_lu, content_lu.T)
        anime_norm_vec = np.linalg.norm(content_lu, axis=1)
        anime_norm_mat = np.outer(anime_norm_vec, anime_norm_vec)
        anime_norm_mat = np.where(
            np.absolute(anime_norm_mat) < 0.001, anime_norm_mat, 1)
        cos_sim_mat = corr_mat / anime_norm_mat
        cos_sim_mat = cos_sim_mat - np.diag(cos_sim_mat, k=0)
        return cos_sim_mat

    def collaborative_filtering(ith_anime: int,
                                liked_anime_list: List[int]) -> int:
        # i 番目のアニメに対して、コサイン類似度ベースの協調フィルタリングでレコメンドされたアニメのid を返します。
        # 既にlike 済みのアニメは無視します
        cos_sim_mat = anime_similarity()
        recommend_vec = cos_sim_mat[ith_anime]
        recommend_vec[liked_anime_list] = 0
        recommend_id = np.argmax(recommend_vec)
        return recommend_id

    # likeunlikeステータスを受け取り、過去の情報をもとにおすすめの情報を返す.
    # [POST] : {"sessionID": セッションID, "animes": [{"animeId": string, "like", int}, ...]}
    # {
    #    'animes': [
    #        {
    #           "id": int,
    #           "title": string,
    #           "image": base64(string),
    #           "description",
    #           "genre": [string, string, ...]
    #           "company": string
    #        }
    #    ]
    # }
    # が返る
    @app.route("/app/rslts", methods=["POST"])
    def anime_results():
        if request.method == "POST":
            # テスト用クエリ(これをターミナルで打ち込むとpostでjsonが送信されます. データベースにも反映されるはずです)
            # curl http://localhost:5000/app/rslts -X\
            # POST -H "Content-Type: application/json"\
            # --data '{"sessionID": "value", "animes": [{"animeId": "4", "like": "0"},\
            #  {"animeId": "5", "like": "2"}]}'

            session_id = request.json["sessionID"]
            request_body = request.json["animes"]
            # 送られてきたアニメidとstatusのリストを並べた二次元リストに展開しておく.
            all_ul_data = [[int(anime["animeId"]),
                            int(anime["like"])] for anime in request_body]

            # テストするときはパラメータが無いので他で適当にfilter
            user = User.query.filter(User.session_id == session_id).first()
            # user = User.query.filter(User.name == "Kw_I_KU").first()
            if user is not None:
                try:
                    for ul_data in all_ul_data:
                        # like_unlikeの登録をする. 過去に同じuserとanime_idに対して登録があれば, それを更新する.
                        past_ul = (LikeUnlike.query.filter(
                            LikeUnlike.user_id == user.user_id).filter(
                                LikeUnlike.anime_id == ul_data[0]).first())
                        if past_ul is not None:
                            # 過去に登録されたものがあれば更新
                            past_ul.status = ul_data[1]
                        else:
                            # Noneなら追加
                            like_unlike = LikeUnlike(
                                user_id=user.user_id,
                                anime_id=ul_data[0],
                                status=ul_data[1],
                            )
                            db.session.add(like_unlike)
                        db.session.commit()
                    # 登録が終わったら今回受け取った情報でlike以上のものを一つ選び、レコメンドアルゴリズムに渡す.
                    # like以上が一つでもあるならsuperlikeなものを探してそちらを優先する. なければlikeを取得, なければempty.
                    like_anime_data = [
                        anime_data[0] for anime_data in all_ul_data
                        if anime_data[1] > 0
                    ]
                    if len(like_anime_data) > 0:
                        superlike_anime_data = [
                            anime_data[0] for anime_data in all_ul_data
                            if anime_data[1] == 2
                        ]
                        if len(superlike_anime_data) > 0:
                            like_anime_id = superlike_anime_data[0]
                        else:
                            like_anime_id = like_anime_data[0]
                    else:
                        raise Exception("like_anime_data is empty")
                    # 今までにlike/unlikeを押したことのある全てのanime_idを取得する. 渡すとき0-indexにしたいので-1しておく.
                    past_ul_data = LikeUnlike.query.filter(
                        LikeUnlike.user_id == user.user_id).all()
                    past_ul_list = [data.anime_id - 1 for data in past_ul_data]

                    # 今はリストのargが返ってくるので+1してアニメidに直す.
                    recommend = collaborative_filtering(
                        like_anime_id, past_ul_list) + 1

                    # recommendがidなので、その情報を返す. 一つだけとってくる
                    anime = (db.session.query(AnimeData).filter(
                        AnimeData.anime_id == recommend).first())
                    # 該当アニメがないなら例外でエラー
                    if anime is None:
                        raise Exception("anime data not found")

                    # recommendedに登録する. 既存なら何もしない.
                    past_recommend = (Recommended.query.filter(
                        Recommended.user_id == user.user_id).filter(
                            Recommended.anime_id == recommend).first())
                    if past_recommend is None:
                        # Noneなら追加
                        recommended_anime = Recommended(user_id=user.user_id,
                                                        anime_id=recommend)
                        db.session.add(recommended_anime)
                        db.session.commit()
                    response_data = {
                        "animes": [{
                            "id": anime.anime_id,
                            "title": anime.title,
                            "image": img_encode(anime.image),
                            "description": anime.description,
                            "year": anime.year,
                            "genre": anime.genre.split(),
                            "company": anime.company,
                        }]
                    }
                    return jsonify(response_data)
                except Exception as e:
                    # 例外を受け取ったらRecommendedの直近を返すことにする.
                    print(e)
                    anime = (db.session.query(Recommended, AnimeData).join(
                        Recommended,
                        AnimeData.anime_id == Recommended.anime_id).filter(
                            Recommended.user_id == user.user_id).order_by(
                                desc(Recommended.updated_at)).first()[1])
                    if anime is None:
                        response_data = {"animes": []}
                    else:
                        response_data = {
                            "animes": [{
                                "id": anime.anime_id,
                                "title": anime.title,
                                "image": img_encode(anime.image),
                                "description": anime.description,
                                "year": anime.year,
                                "genre": anime.genre.split(),
                                "company": anime.company,
                            }]
                        }

                    return jsonify(response_data)
            else:
                return redirect(ENV_VALUES["APP_URL"])
        pass

    @app.route("/app/fetch", methods=["POST"])
    def fetch_anime_data():
        if request.method == "POST":
            anime_id = request.json["animeId"]
            session_id = request.json["sessionID"]
            user = User.query.filter(User.session_id == session_id).first()
            if user is not None:
                anime = (db.session.query(AnimeData).filter(
                    AnimeData.anime_id == anime_id).first())
                if anime is None:
                    response_data = {"animes": []}
                else:
                    response_data = {
                        "animes": [{
                            "id": anime.anime_id,
                            "title": anime.title,
                            "image": img_encode(anime.image),
                            "description": anime.description,
                            "year": anime.year,
                            "genre": anime.genre.split(),
                            "company": anime.company,
                        }]
                    }
                return jsonify(response_data)
            else:
                return redirect(ENV_VALUES["APP_URL"])

    return app
Ejemplo n.º 11
0
def create_app():
    """Creates Flask App"""
    app_ = Flask(__name__)
    #app.config['SQLALCHEMY_DATABASE_URI'] = SQLITE_DB_PATH
    #app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
    app_.register_blueprint(cars_blueprint)
    app_.register_blueprint(popular_blueprint)
    app_.register_blueprint(rate_blueprint)
    return app_

def setup_logging():
    """Sets up Logging"""
    log_dirpath = './log'
    if not os.path.exists(log_dirpath):
        os.makedirs(log_dirpath)

    fileConfig(st.FLASK_LOGFILE_PATH)


init_db()

app = create_app()

setup_logging()

@app.teardown_appcontext
def shutdown_session(ex=None):
    """Tears down Sqlalchemy session"""
    db_session.remove()
Ejemplo n.º 12
0
def create_app():
    app = Flask(__name__)
    app.config.from_object('src.config.Config')
    init_db(app)
    CORS(app)
    return app
def initdb_command():
    """Initializes the database."""
    init_db()
    print('Initialized the database.')
Ejemplo n.º 14
0
 def initialise_database():
     init_db(app, mode)
Ejemplo n.º 15
0
from flask import Flask, request, render_template
from flask_login import LoginManager, current_user
from src.database import db, init_db
from src.models.models import *
from src.views.index import index_router
from werkzeug.security import generate_password_hash

app = Flask(__name__)
app.config.from_object('config')
app.secret_key = app.config['SUPER_SECRET_KEY']
init_db(app)


# デフォルト処理の定義
@app.before_request
def before_request():
    if '/static' in request.path:
        # static 配下のファイルはそのまま表示する
        pass
    elif request.path.startswith('/signup') or request.path.startswith(
            '/login'):
        # サインアップページ, ログインページはそのまま表示する
        pass
    elif not current_user.is_authenticated:
        # 非ログインユーザはログインページに誘導する
        return render_template('unauthorized.html'), 302


# ログイン処理における認証ユーザの呼び出し方法の定義
login_manager = LoginManager()
login_manager.init_app(app)
Ejemplo n.º 16
0
def init_db():
    database.init_db()
Ejemplo n.º 17
0
def create_app():
    app = Flask(__name__)
    CORS(app)
    configure_app(app)
    init_db(app)
    return app
Ejemplo n.º 18
0
 def setUp(self):
     self.app_instance = create_app("ConfigTest")
     self.app = self.app_instance.test_client()
     init_db(self.app_instance)
Ejemplo n.º 19
0
async def startup_event():
    database.init_db()