シンプルなWebアプリを構築する
21046 ワード
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
この環境を使用するにはDocker 安Docker compose インストール.
バックエンド BottlePy SQLAlchemy フロントエンド Bootstrap 5 jQuery データベース PostgreSQL Redis Webサーバ:
Nginx - prod envのみです.
このサンプルアプリケーションを使用するには、いくつかのサンプルデータをインポートする必要があります.この例のアプリケーションで使用可能な「スタック交換データダンプ」を使用しますarchive.org .
このサイトで使用されるすべてのデータはcc-by-sa 4.0 ライセンス.
まず第一にthis 倉庫
prod
dev
nginxは、サンプルアプリケーションを公開するために使用されます
内蔵HTTP開発サーバー
ポート80
HTTPポート8080
デバッグモード
デバッグモードが有効です
リローダは無効です
リローダが有効です
これでサンプルデータをダウンロードできます.
実行する例をいくつか示します.
小さなデータ:
すべてのタグ 全ユーザー 全投稿 ポストヒストリーイベント インポートが完了したら、我々の環境を始めることができます
DBの普及により、Webアプリケーションを起動できます.
検索フォーム付きホームページ.「ネットワーク」選択のすべての変更に関して、「タグ」選択は/API/autocomplete/form/getchenタグ(post)上のAjax呼び出しによって分類されます(詳細については、src/ボトル/静的/資産/js/custom . jsを参照してください).
ポストコールはランダムなハードコード化された文字列で認証されます( src/bin/app . py , apihu gettle tag )
Pagination NAVで利用可能なすべてのタグのリスト.
タグの名前をクリックすると、アプリケーションのすべての質問を選択したタグに一致するすべての質問を検索するサイトの名前をクリックすると、すべての質問は、タグとあなたが選択したサイトに一致する検索を検索します.
ページの表示のすべての利用可能なユーザーのテーブルビュー.
ユーザー名をクリックすると、ユーザーの詳細ページに入力します.詳細については、ユーザーページを参照してください:アップ票、ビュー、ダウン投票.ユーザーが「私について」フィールドを移入したならば、我々は私についての詳細でモードを誘発するボタンを見ます.
ユーザーが尋ねられるか、いくつかの質問に答えたならば、我々は「ポスト」セクションで質問のリストを見ます.
ページの一覧表示
このアプリケーションは、1つのAPI/残りのルートを公開します.このルートを問い合わせることでポストコールを行うことができます.
アプリケーションの設定はloadCounge configモジュール( src/loadCount config . py )によって読み込まれます.
このモジュールはaをロードします.以下のYMLファイル:
ボトルネックAppRange名は、このケースのボトルで我々のボトルのアプリケーションの生活のパスの名前です.環境変数はprodやenvです.
設定の例は次のとおりです.
データベース構成は、src/schemaモジュールの下で定義されます.
基地.Pyファイルにはエンジンの設定があります.
スキーマ
テーブル
説明
サイトクラスはSQLAlchemyオブジェクトではなく、他のすべてのテーブルで使用される
PostgreSQLの履歴テーブルのテーブル定義.このモジュールは3つのenum定義も含んでいます: posttype、postystorytype、closereason
タグテーブル
ユーザーテーブル
この例では、アプリケーションが使用され、SQLAlchemyプラグイン(SRC/ボトル/BandleCone SA . py)を呼び出します.このプラグインは、SQLAlchemyセッションを処理するために使用されます.
従って、以下のような機能があります.
この例ではREDISを使用していくつかのページをキャッシュします.キャッシング“アプローチ”は非常に有用です. 更新が少ないサイト 遅いページ/ルート DBの負荷を減らす必要があります rediscacheはsrc/bin/BowleLesキャッシュで定義されています.Pyとこれは使用例です.
パーム
デフォルト
説明
@ cached装飾子はいくつかの引数を受け入れることができます.
パーム
デフォルト
説明
JSONキャッシュの例は次のようになります.
キャッシュパラメータを無効にするには、クエリパラメータとしてキャッシュバリデータのキャッシュキーを無効にしたり、POSTコールを行った場合に
キャッシュパスSkipCountキャッシュキーをクエリパラメータとしてスキップするかバイパスするか、またはPOST CALLを作成した場合にBody Requestで
pgsqlデータをバックアップするには、dumpound dbを実行します.sh
既存のDBをインポートするには、Dockerの構成で次の行をコメントしてください.YSL
環境を止める
目次
要件
この環境を使用するにはDocker 安Docker compose インストール.
アプリケーションスタック
バックエンド
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:8080 とhttp://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、closereason
tags.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を使用していくつかのページをキャッシュします.キャッシング“アプローチ”は非常に有用です.
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
redis
REDIS FQDNまたはIPアドレスredis_port
6379
リッスンポートredis_db
0
REDISデータベースcache_expiry
3600
秒単位のグローバルキャッシュ有効時間@ cached装飾子はいくつかの引数を受け入れることができます.
パーム
デフォルト
説明
expiry
None
経路キャッシュ有効期限.定義されないならば、グローバル満了時間と同じ値ですkey_prefix
bottle_cache_%s
REDISキープレフィックス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ボリュームが削除されます.Reference
この問題について(シンプルなWebアプリを構築する), 我々は、より多くの情報をここで見つけました https://dev.to/garutilorenzo/build-a-simple-web-app-using-bottlepy-2mpテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol