シンプルなWebアプリを構築する


SklAlchemyを使用してシンプルなWebアプリケーションを構築し、Readisサポートを使用して

目次

  • Requirements
  • The application stack
  • Data used in this example site
  • Setup the environmant
  • Download sample data
  • Start the environment
  • Application Overview
  • App configuration
  • DB configuration
  • SQLAlchemy plugin
  • Redis Cache
  • Data export
  • Data import
  • 要件


    この環境を使用するにはDockerDocker compose インストール.

    アプリケーションスタック


    バックエンド
  • BottlePy
  • SQLAlchemy
  • フロントエンド
  • Bootstrap 5
  • jQuery
  • データベース
  • PostgreSQL
  • Redis
  • Webサーバ:

  • Nginx - prod envのみです.
  • 使用データ


    このサンプルアプリケーションを使用するには、いくつかのサンプルデータをインポートする必要があります.この例のアプリケーションで使用可能な「スタック交換データダンプ」を使用しますarchive.org .
    このサイトで使用されるすべてのデータはcc-by-sa 4.0 ライセンス.

    環境設定


    まず第一にthis 倉庫
    git clone https://github.com/garutilorenzo/simple-bottlepy-application.git
    
    cd simple-bottlepy-application
    
    現在、我々は環境を整える準備ができています.devの目的リンクのためにDockerCommand - dev . yml do Dockerが作成されます.気象研
    ln -s docker-compose-dev.yml docker-compose.yml
    
    prod環境
    ln -s docker-compose-dev.yml docker-compose.yml
    
    devとprod envsの違いは以下の通りです:
    prod
    dev
    nginxは、サンプルアプリケーションを公開するために使用されます
    内蔵HTTP開発サーバー
    ポート80
    HTTPポート8080
    デバッグモード
    デバッグモードが有効です
    リローダは無効です
    リローダが有効です
    これでサンプルデータをダウンロードできます.

    サンプルデータのダウンロード


    実行する例をいくつか示します.
    ./download_samples.sh
    
    デフォルトでは' meta '属性のアーカイブがダウンロードされます.より多くのデータをDownloadCountサンプルで削除したい場合.sh ' meta 'はアーカイブ名を形成します.
    小さなデータ:
    for sample in workplace.meta.stackexchange.com.7z unix.meta.stackexchange.com.7z
    
    ビッグデータ
    for sample in workplace.stackexchange.com.7z unix.stackexchange.com.7z
    
    この例でインポートされたすべてのStackExchangeサイトに注意してください.アーカイブを選択した後は、ネットワークを調整ダウンロードします.PRCスキーマ/src/schema/
    class Sites(enum.Enum):
        vi = 'vi.stackexchange.com'
        workplace = 'workplace.stackexchange.com'
        wordpress = 'wordpress.stackexchange.com'
        unix = 'unix.stackexchange.com'
        tex = 'tex.stackexchange.com'
    
    データがダウンロードされると、データをインポートできます.
    docker-compose run --rm bottle bash
    
    web@4edf053b7e4f:~/src$  python init_db.py # <- Initialize DB
    web@4edf053b7e4f:~/src$  python import_data.py # <- Import sample data
    
    今、あなたがダウンロードしたデータサンプル(例えば、tex、unix、vi)に対して、Pythonのサブプロセスが起動され、順番にインポートされます.
  • すべてのタグ
  • 全ユーザー
  • 全投稿
  • ポストヒストリーイベント
  • インポートが完了したら、我々の環境を始めることができます

    環境を開始する


    DBの普及により、Webアプリケーションを起動できます.
    docker-compose up -d
    
    Creating network "bottle-exchange_default" with the default driver
    Creating postgres ... done
    Creating redis    ... done
    Creating bottle   ... done
    
    このアプリケーションはhttp://localhost:8080http://localhost prodの

    アプリケーション概要


    インデックス


    検索フォーム付きホームページ.「ネットワーク」選択のすべての変更に関して、「タグ」選択は/API/autocomplete/form/getchenタグ(post)上のAjax呼び出しによって分類されます(詳細については、src/ボトル/静的/資産/js/custom . jsを参照してください).
    ポストコールはランダムなハードコード化された文字列で認証されます( src/bin/app . py , apihu gettle tag )

    タグ


    Pagination NAVで利用可能なすべてのタグのリスト.
    タグの名前をクリックすると、アプリケーションのすべての質問を選択したタグに一致するすべての質問を検索するサイトの名前をクリックすると、すべての質問は、タグとあなたが選択したサイトに一致する検索を検索します.

    利用者


    ページの表示のすべての利用可能なユーザーのテーブルビュー.
    ユーザー名をクリックすると、ユーザーの詳細ページに入力します.詳細については、ユーザーページを参照してください:アップ票、ビュー、ダウン投票.ユーザーが「私について」フィールドを移入したならば、我々は私についての詳細でモードを誘発するボタンを見ます.
    ユーザーが尋ねられるか、いくつかの質問に答えたならば、我々は「ポスト」セクションで質問のリストを見ます.

    ポスト


    ページの一覧表示

    エンドポイント


    このアプリケーションは、1つのAPI/残りのルートを公開します.このルートを問い合わせることでポストコールを行うことができます.
    curl --header "Content-Type: application/json" \
      --request POST \
      --data '{"auth_key":"dd4d5ff1c13!28356236c402d7ada.aed8b797ebd299b942291bc66,f804492be2009f14"}' \
      http://localhost:8080/api/get/tags | jq
    
     {
      "data": [
        {
          "clean_name": "html5",
          "created_time": "2021-12-29 11:33:06.517152+00:00",
          "id": "1",
          "name": "html5",
          "network_sites": "Sites.wordpress",
          "questions": "91",
          "tag_id": "2",
          "updated_time": "None"
        },
        ...
        ],
      "errors": [],
      "items": 5431,
      "last_page": 27
    }
    
    AuthLesキーはハード/src/app/appでコード化されます.パイ

    アプリケーション設定


    アプリケーションの設定はloadCounge configモジュール( src/loadCount config . py )によって読み込まれます.
    このモジュールはaをロードします.以下のYMLファイル:
    /app/src/<BOTTLE_APP_NAME>/config/<BOTTLE_APP_ENVIRONMENT>
    
    ボトルレグappnameの名前とボトルネックappstr環境は、環境変数です.
    ボトルネックAppRange名は、このケースのボトルで我々のボトルのアプリケーションの生活のパスの名前です.環境変数はprodやenvです.
    設定の例は次のとおりです.
    ---
    enable_debug: True
    enable_reloader: True
    http_port: 8080
    pgsql_username: "bottle"
    pgsql_password: "b0tTl3_Be#"
    pgsql_db: "bottle_exchange"
    pgsql_host: "pgsql"
    pgsql_port: 5432
    create_db_schema: True
    default_result_limit: 50
    

    DB設定


    データベース構成は、src/schemaモジュールの下で定義されます.
    基地.Pyファイルにはエンジンの設定があります.
    import load_config # <- See App configuration
    
    from sqlalchemy import create_engine
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy.orm import sessionmaker
    
    main_config = load_config.load_config()
    conn_string = 'postgresql+psycopg2://{pgsql_username}:{pgsql_password}@{pgsql_host}:{pgsql_port}/{pgsql_db}'.format(**main_config)
    
    engine = create_engine(conn_string, pool_size=80, pool_recycle=60)
    Session = sessionmaker(bind=engine)
    
    Base = declarative_base()
    
    すべてのテーブルは、常にスキーマの下で別のファイルで定義されます.
    スキーマ
    テーブル
    説明network.pyなし
    サイトクラスはSQLAlchemyオブジェクトではなく、他のすべてのテーブルで使用されるposts.pyポスト、歴史
    PostgreSQLの履歴テーブルのテーブル定義.このモジュールは3つのenum定義も含んでいます: posttype、postystorytype、closereasontags.pyタグ
    タグテーブルusers.py利用者
    ユーザーテーブル

    SQLAlchemyプラグイン


    この例では、アプリケーションが使用され、SQLAlchemyプラグイン(SRC/ボトル/BandleCone SA . py)を呼び出します.このプラグインは、SQLAlchemyセッションを処理するために使用されます.
    from schema.base import Base, engine # <- Base and engine are defined in the schema module, see "DB configuration"
    from bottle_sa import SQLAlchemyPlugin
    import load_config
    
    main_config = load_config.load_config()
    
    # Main Bottle app/application
    app = application = Bottle()
    
    # DB Plugin
    saPlugin = SQLAlchemyPlugin(
        engine=engine, metadata=Base.metadata, 
        create=main_config['create_db_schema'], 
        config=main_config,
    )
    application.install(saPlugin)
    
    このプラグインは、src/ボトル/appで定義された各関数に余分なパラメータを渡します.Pyデフォルトでは、このパラメータは' db 'ですが、SQLAlchemyPlugin initに余分なパラメータ'キーワード'を渡すことで変更できます.
    従って、以下のような機能があります.
    @app.route('/docs')
    @view('docs')
    def index(db): # <- db is our SQLAlchemy session
        return dict(page_name='docs')
    

    REDISキャッシュ


    この例ではREDISを使用していくつかのページをキャッシュします.キャッシング“アプローチ”は非常に有用です.
  • 更新が少ないサイト
  • 遅いページ/ルート
  • DBの負荷を減らす必要があります
  • rediscacheはsrc/bin/BowleLesキャッシュで定義されています.Pyとこれは使用例です.
    from bottle_cache import RedisCache
    
    # Cache
    cache = RedisCache()
    
    @app.route('/tags')
    @app.route('/tags/<page_nr:int>')
    @cache.cached()
    @view('tags')
    def get_tags(db, page_nr=1):
        do_something()
        return something
    
    rediscacheクラスに余分なパラメータを設定します.
    config = {'redis_host': '<redis_hostname'>, 'redis_port': 6379, 'redis_db': 0, 'cache_expiry': 86400}
    cache = RedisCache(config=config)
    
    デフォルトでは設定は以下の通りです:
    パーム
    デフォルト
    説明redis_host redisREDIS FQDNまたはIPアドレスredis_port 6379リッスンポートredis_db 0REDISデータベースcache_expiry 3600秒単位のグローバルキャッシュ有効時間
    @ cached装飾子はいくつかの引数を受け入れることができます.
    パーム
    デフォルト
    説明expiry None経路キャッシュ有効期限.定義されないならば、グローバル満了時間と同じ値ですkey_prefix bottle_cache_%sREDISキープレフィックスcontent_type text/html; charset=UTF-8デフォルトコンテンツタイプ

    JSONリクエストのキャッシュ


    JSONキャッシュの例は次のようになります.
    @app.route('/api/get/tags', method='POST')
    @cache.cached(content_type='application/json')
    def api_get_tags(db):
        do_something()
        return something
    

    キャッシュの無効化


    キャッシュパラメータを無効にするには、クエリパラメータとしてキャッシュバリデータのキャッシュキーを無効にしたり、POSTコールを行った場合に

    スキップ/バイパスキャッシュ


    キャッシュパスSkipCountキャッシュキーをクエリパラメータとしてスキップするかバイパスするか、またはPOST CALLを作成した場合にBody Requestで

    データエクスポート


    pgsqlデータをバックアップするには、dumpound dbを実行します.sh
    ./dump_db.sh
    
    ダンプはこのリポジトリのルートディレクトリに置かれます.SQL.gz ( gzip形式)

    データインポート


    既存のDBをインポートするには、Dockerの構成で次の行をコメントしてください.YSL
    volumes:
        - type: volume
          source: postgres
          target: /var/lib/postgresql/data
        - ./sql:/docker-entrypoint-initdb.d # <- uncomment this line
    
    そして、gzipまたはプレーンテキスト形式であなたのダンプをSQL/

    環境を止める


    環境を止める
    docker-compose down
    
    Stopping bottle   ... done
    Stopping postgres ... done
    Stopping redis    ... done
    Removing bottle   ... done
    Removing postgres ... done
    Removing redis    ... done
    Removing network bottle-exchange_default
    
    すべてのデータ(pgSQLデータ)をクリーンアップするには、Dockerに“- V”を追加します.このパラメータを指定するとpgsqlボリュームが削除されます.