メインコンテンツへスキップ
見出し画像

【配布】Python Flask WEBサーバーテンプレート作った ~DB/ログイン/Googleログイン/権限/Vue3/アップロード等~

    こんにちはRcatです。
    今回は、Python FlaskのWEBサーバーテンプレートを作りましたので紹介します。
    このテンプレを書き換えることで、作品を効率よく作成することができます。
    実は超大昔に作ったテンプレがあったんですが、最近の自分の動向に合わせ再構築することにした感じです。


    はじめに

    利用規約

    情報や作品の活用時は事前に利用規約をご確認ください。

    コメントについて

    利用規約のガイドラインを確認の上コメントしてください。
    則っていないコメントは削除します。


    概要

    WEBサーバーテンプレートって何?

    その名の通りWebサーバーを作るためのテンプレートになります。
    Webサーバーを採用することで、以下のようなことができるようになります。

    • ブラウザでアクセスできる
      パソコンからでもスマホからでも操作できる

    • JavaScriptが使える
      動的な操作画面を作ることができます

    • バックグラウンドでいつでもホスト
      パソコンさえ立ち上げておけば、いつでもどこでも使えるツールになります。

    使い道

    基本的に小規模なツールにWEB操作画面を割り当てることを目的としています。
    Webサーバーを使っている例としては、以下のような記事が挙げられます。

    Rcatサイト
    一応ガチで使ってみた例。ある程度極めればこういうのも可能。これはインフラ回りもわからないとだが…。

    これはJavaScriptのフレームワークも活用してPythonでは苦手な部分はJavaScriptに丸投げした例ですね。

    PythonはAIに強い言語です。さらにそこでWebサーバーと組み合わせることで、自分専用のチャットサーバーを立てることができます。

    WebサーバーがOSのコマンドを代行して叩くことで、パソコンを24時間音楽プレイヤーにするというものです。
    スマホからアクセスして操作できるのが魅力

    ちょっと昔の動画ですが、Webサーバーって何どういう仕組みなのという方はこちらが参考になります。私のですが。

    というわけで結論ですが、こういったWebサーバーをベースとしたツールを作る際に、毎回サーバーを作っていると面倒なので、テンプレートとして保持しているわけですが、ちょっと内容が古くなってきましたので、更新します。というのが今回の記事になります。


    テンプレート紹介

    では、まず今回のテンプレートはどのようなものなのか紹介していこうと思います。

    シンプルなソース

    Webサーバーとしてファイルを配信したり、APIを作る時のテンプレートとして既にコードが入っています。
    APIのテンプレート関数をコピペで増やすだけで簡単に構築できます。

    ログイン

    APIのテンプレートコードは2つあり、1つはいつでも使えるもの。
    もう1つはログインしていないと使えないものとしています。
    そのためのログイン用のAPIや設定を完備しています。
    もちろんそんなの知らん!使わない!もOK。

    Googleでログイン

    こちらの記事で紹介しているアップデートで追加された機能です。
    最近よく見かけるGoogleアカウントを使ってほかのサイトに楽々ログインできる機能を織り込みました。
    準備さえできればご自身のサイトをGoogleログイン化できます。

    データベース連携

    SQLiteを使用したサーバーに依存しないデータベースを利用。
    テンプレートではユーザー認証にしか使わないので、ご自由に拡張することができます。
    データベースで、データを読み書きするためのコードも入っているので楽々です。
    もちろんそんなの知らん!使わない!もOK。

    権限

    ユーザーに各種権限を割り振り、それによりアクセスやAPIの実行可否を決定することができます。
    内容は自由に拡張可能です。
    もちろんそんなの知らん!使わない!もOK。

    APIキーを使用したAPI

    ヘッダーに付与するタイプのAPIキーを生成して、外部プログラムなどから認証ありAPIへのアクセスを管理できます。
    もちろんそんなの知らん!使わない!もOK。

    vue3テンプレート

    デフォルトでvue3を使ったフロントエンドを作成するためのコードが入っています。
    活かせる方はこちらを使うことで、より本格的で柔軟なフロントエンドを作成することができます。
    もちろんそんなの知らん!使わない!もOK。


    導入方法

    基本的な考え方

    本作は、すべてのHTMLページを認証なしで返却するが、表示するためのAPIに認証を設けることで、データを表示させない方法をとっています。
    そのため、HTML生成段階でデータを埋め込むやり方には向きません。

    ダウンロードと展開

    最下部よりダウンロードしたファイルを好きなところに配置します。
    中身はこんな感じです。

    画像

    まず最初に実行環境を作ります。careate.batをダブルクリックします。
    ※作者の環境はPython3.11と3.12です。

    venvの作成とライブラリインストールが行われて落ちます。

    画像

    共通設定

    .envの設定。
    ここでポート番号やドキュメントルートを設定できます。

    画像
    • DOCUMENT_ROOT
      公開するHTMLの格納フォルダです
      vueを使う場合はこのままでOK

    • PORT
      ポート番号です。好きに設定しましょう。

    • PASS_PEPPER
      ユーザー名/パスワード方式でログインする際に使うペッパー。任意の文字列。

    • UPLOAD_FOLDER
      アップローダーを使う場合でフォルダ名を変えるときに使用

    • APIKEY_EXPIRATION_DATE
      APIキー発行機能の有効期限です。0で無期限のキーを作れます。

    • Googleログイン関連
      下記はGCPで認証画面を作った際に取得できるクライアント情報を記述する場所です。この機能を使わない場合は未入力。

      • GOOGLE_CLIENT_ID

      • GOOGLE_CLIENT_SECRET

    ログイン機能を使いたい場合
    dbinit.pyを編集します。
    一番上にユーザーを定義するところがありますので、ユーザー名とパスワードを設定します。
    その次が権限です。各ユーザーに対して権限番号で指定します。複数の追加が可能です。
    その下は権限番号に対応した権限名です。なくてもいいですが忘れると悲惨です。
    権限0-2はすでに使っています。それ以外なら自由に追加することができます。
    GOOGLE_USERSはGoogleでログインを使う場合の設定です。ここにあるメアドだけログインできます。それ以外は蹴る仕組みです。

    画像

    その後dbinit.batを実行するとデータベースが作成されます。

    画像

    データは、dbフォルダのserver.dbの中に入っています。
    知識のある方は直に書き換えてもらってもOK。SQLiteです。
    パスワードは一応ハッシュ化していますが、公開を前提としていないので、鍵導出まではしてません。

    画像

    フロントエンド  ~自分で書いたHTMLを置く場合~

    構築

    好きなフォルダにドキュメントルートを当ててください。
    既定の.envの設定ではwwwフォルダを使うようにしています。コメント解除しておいておけば配信されるはず。

    フロントエンド ~Vue3を使う場合~

    構築

    webフォルダがvueのプロジェクトです。
    すでにテンプレートは構築済みとなっています。

    画像

    最初にvueのライブラリを入れます。
    node.jsが入っていることを確認の上、npn installを実行

    画像

    さらに、npm run devを実行すれば、フロントエンドだけの検証サーバーを起動できます。
    ※FlaskのAPIにアクセスできないので基本使いません。

    画像

    ページの作成

    初期では、トップページとログイン、APIキー発行、アップロード、ダッシュボード、パスワード変更、利用規約画面が入っています。
    それらをコピペして好きなページを増やしてください。

    画像

    例えば、アップロードの中身はこちらです。何もないのでコピペにピッタリ。
    なお、ここではvueの構文には触れないため書き方の解説はありません。

    画像

    増やしたら、ルータの設定をします。src/router/index.jsです。
    既存のページをまねして追加します。
    例えばログインとAPIキー発行がこんな感じ。ログイン済みでないと入れないページはmetaの行を入れておくと、勝手にログインにリダイレクトします。

    画像

    出来上がったら、npm run buildでビルドします。
    これで生成されるdistフォルダをFlaskが参照する仕組みです。

    画像

    componentsにはログインの本体やフッターなどの部品が入っています。
    特にフッターはRcat999のままなので、書き換えないと私のサイトってことになっちゃいますw

    画像

    サーバー側

    対象データ

    サーバー側はmain.pyです。
    これを編集して使います。

    画像

    書き換え対象は130行目程度のInternalFlaskServerクラスです。
    この中にメソッドを定義していくことでカスタマイズします。

    画像

    APIの追加

    APIはここにある2つの関数を複製して増やします。

    画像

    ProtectedPOST_APIの方は、ログイン判定付きのテンプレートで、POST_APIは単純なAPIです。
    用途に応じて複製して下さい。

    例えばこちらで紹介しているツールもこのテンプレートを使っており、このような実装になっています。
    ログインしているときだけ中身のあるjsonBodyを返す感じですね。

    画像

    APIキー認証API

    protected_key_apiをコピペして使います。
    APIキーが正規のものであれば、キー情報が返されます。
    情報にはユーザー名とキータイプが含まれます。

    画像

    このAPIへのアクセス方法は、末尾にコードをまとめてありますので参考にしてください。

    画像

    APIキーの取得

    デフォルトの発行画面から発行可能です。
    枠内はコンポーネントなので、ご自由に移植してください。
    発行には管理者か発行権限が必要です。

    画像

    発行済みキーはデータベースで管理されます。

    画像

    アップロード

    ファイルのアップロードのエンドポイントも定義済みです。
    デフォルトでは管理者かアップロード権限がないと蹴る仕組みです。

    画像

    アップローダーのフロントもコンポーネントで、枠の部分が完全に独立しています。
    好きなところに移植して使えます。

    画像

    DBへのアクセス方法

    DBへのアクセスは、専用のクラスを用いているので非常に簡単に行うことができます。
    グローバルでインスタンス済みなので、いつでも使えます。
    本体はdb/dbmanager.py

    画像

    exec_query_param
    第一引数がSQL、第二引数がパラメータの辞書、第三引数が読み取りフラグ、第四引数がコネクタです。

    SELECT系SQLの場合はfetchallをTrueにすると、辞書のリストでテーブルを得られます。records[0]["username"]のような感じ。

    パラメータはSQL内にあるプレースホルダを置換します。
    下記はユーザー情報取得SQLの例です。

    画像

    トランザクションを使う場合は、事前にコネクションを取得の上、第四引数に渡すとこの関数を使うことができます。
    もちろん自分で全部書いてもOKですが。

    DBを直接編集する

    直接編集する場合は、A5:SQL Mk2などがおすすめです。
    SQLiteにも対応しているので、GUIで簡単に操作できます。

    画像
    画像

    E-R図

    初期の構成がこちら。
    ユーザーと権限管理周りとログだけです。

    画像

    まとめ

    今回はFlaskを使ったWEBサーバーツールのテンプレートを作成しました。
    足りない機能は随時追加して使いやすくしていきましょう!
    というわけでさっそく次回使う予定。
    それではまたお会いしましょう


    配布情報

    配布URL

    以下のURLより配布しています。
    利用規約に同意の上ご利用ください。

    https://script.google.com/macros/s/AKfycbxdcr8pnazR7RbjaSICTtaNWfN7h_rjQrKlZ3h9CZpPRFzRILk1OGc8mZqKbF-NXNO9/exec?name=FlaskテンプレートV2_VUE3_DB対応

    配布情報

    追加のキーワードについては下記より確認可能です

    リンク集

    感想投稿フォーム

    コメントは公開で恥ずかしい!! Rcatだけに送りたい人向け

    Pythonのインストール方法

    【Linux】Systemd追加支援スクリプト

    【Windows】タスクスケジューラーの追加方法

    LoggingBOTの導入方法

    ミニPCにLinuxをインストール


     
     
    モノづくりが趣味。 "売ってないなら自分で作ればいいじゃない"をコンセプトに、機械/電気/AI/プログラム/ネットワーク 全部やります。 記事執筆はAI不使用。 ご連絡や利用規約はプロフィール記事参照。

    あなたへのおすすめ