WebSurfer's Home

Filter by APML

Visual Studio 2022 で Python Flask

by WebSurfer 15. December 2024 14:55

先の記事「Flask 開発サーバーが .mjs に Contents-Type: text/plain を返す」と話が前後しますが、その記事を書くため自分の Windows 10 PC の Visual Studio 2022 17.12.3 で Python Flask アプリが動かせるよう設定しました。

Visual Studio 2022 で Python Flask

いろいろ紆余曲折があってスムーズにはいかなかったので、今後同じことを行うことがあったらその際にまた苦労しなくて済むよう、その紆余曲折を備忘録として残しておくことにします。

まず、Microsoft のドキュメント「チュートリアル: Visual Studio での Flask Web フレームワークの概要」の「前提条件」のセクションに従って Visual Studio Installer を起動し以下のワークロードと個別のコンポーネントを追加します。

  • 「Python 開発」ワークロード
  • 「個別のコンポーネント」タブの「コード ツール」下の [Git for Windows]

その後で「手順 1-1: Visual Studio プロジェクトとソリューションを作成する」に進みましたが、その手順に書いてある [Blank Flask Web Project] テンプレートが出てきません。(汗)

別の Microsoft のドキュメント「クイック スタート: Visual Studio で Python Web アプリを作成」を見ると、

"Visual Studio インストーラーで [Python 開発] ワークロードを選択し、インストールの詳細で [Python Web サポート] を選択します。"

・・・と書いてあるのでその通りにすると Python の Web アプリ関係のテンプレートはいろいろ出てくるようになりました。

上に紹介した 1 つ目の Microsoft ドキュメントには Git を使う手順がいろいろ書いてあるのですが、Flask とは直接関係ない Git の勉強に余計な労力を使いそうだったので、これ以降は 2 つ目のドキュメントに従って進めることにします。

プロジェクトの新規作成メニューで表示されたテンプレートの中で [Web プロジェクト] を選んでプロジェクトを作成し先に進めます。

「Web プロジェクト」テンプレート

Flask ライブラリをインストールする」のセクションまで進んで、

"1. プロジェクトの [Python 環境] ノードを展開して、プロジェクトの既定の環境を表示します。"

・・・をやってみましたが [Python 環境] 下には何も表示されません。(汗) 以下の操作を行う必要がありました。

ソリューションエクスプローラーで [Python 環境] ノードを右クリックして表示されたメニューから [環境を追加(E)...] をクリック、「環境を追加」ダイアログの左側のメニューの [Python インストール] を選択し、[Python 3 64 ビット (3.9.13)] を追加します。(サポート外) と表示されていましたが、後でアップデートすることにして、そのままインストールしました。

その操作により、ソリューションエクスプローラーの [Python 環境] 下に「Python 3.9 (64-bit) (グローバルデフォルト)」が表示されます。

「Python 3.9 (64-bit) (グローバルデフォルト)」を右クリックして [Python パッケージの管理] を選択します。 Microsoft のドキュメントに書いてある通り [パッケージ (PyPI)] タブ上に [Python 環境] ウィンドウが開きます。

検索フィールドに flask と入力し「次のコマンドを実行する: pip install flask」をクリックします。Microsoft のドキュメントに書いてある通り、ライブラリがソリューションエクスプローラーの [Python 環境] 下の「Python 3.9 (64-bit) (グローバルデフォルト)」下に表示されます。

コード ファイルの追加」のセクションに進んで最小限のウェブアプリケーションを実装します。

ソリューションエクスプローラーでプロジェクトのノードを右クリックし、表示されたメニューから [追加 (D)] ⇒ [新しい項目(W)...] と進んで、表示される「新しい項目の追加」ダイアログで [空の Python ファイル] を選び、名前を app.py として [追加] ボタンをクリックします。

Microsoft のドキュメントに書いてあるコード(下記)をコピーしてエディタウィンドウに貼り付けて保存します。

from flask import Flask

# Create an instance of the Flask class that is the WSGI application.
# The first argument is the name of the application module or package,
# typically __name__ when using a single module.
app = Flask(__name__)

# Flask route decorators map / and /hello to the hello function.
# To add other resources, create functions that generate the page contents
# and add decorators to define the appropriate resource locators for them.

@app.route('/')
@app.route('/hello')
def hello():
   # Render the page
   return "Hello Python!"

if __name__ == '__main__':
   # Run the app server on localhost:4449
   app.run('localhost', 4449)

アプリケーションの実行」のセクションに進みます。app.py を [スタートアップファイルとして設定] し、プロジェクトのプロパティ画面でポート番号を app.py に指定した 4449 に設定します。

Visual Studio のメニューバーの [デバッグ(D)] ⇒ [デバッグなしで開始(H)](もしくは [デバッグの開始(S)])で Flask 開発サーバーが立ち上がり、

Flask 開発サーバー

この記事の一番上の画像のようにブラウザが立ち上がって app.py に設定した文字列 Hello Python! が表示されます。

Tags: , ,

その他

URL Rewrite Module で HTTP を HTTPS へリダイレクト

by WebSurfer 13. December 2024 19:02

先日 Let's Encript を利用してHTTPS 通信ができるようにしたのを機会に、ホスティングサービスに実装されている IIS の URL Rewrite Module を使って、HTTP で要求が来た場合は 301 Moved Permanently 応答を返して HTTPS にリダイレクトするように設定しました。

ネットで検索してヒットする記事の中では Redirect HTTP to HTTPS with Windows IIS 10 が一番信頼できると思います。実際その通りやって期待通りの結果が得られます。

ですが、自分の Windows 10 PC のローカル IIS で一通りやってみました。さらに、設定がどのような意味を持つかも調べました。調べて分かったことを以下に備忘録として書いておきます。

さらに詳しく知りたい場合は、Microsoft のドキュメント「URL リライト モジュール構成リファレンス」を見ることをお勧めします。日本語版は翻訳がアレなので意味不明なところがあると思います。その場合は英語版を読んでください。

(1) URL Rewrite Module の起動

URL Rewrite Module の起動

IIS Manager を起動して書き換えを行うサイトまたはアプリケーションを選び、IIS メニューの[URL Rewrite]をクリックします。

(2) 書き換えルールの追加

書き換えルールの追加

画面右側の「操作」欄の下のメニュー[Add Rule(s)...]をクリック。それにより表示された「Add Rule(s)」ダイアログの「Inbound rules」下の「Blank rule」を選択して[OK]ボタンをクリックします。

(3) Match URL セクション

Match URL セクション

上の「Edit Inbound Rule」画面が表示されます。赤枠で示したように[Name]に任意の名前を入力し、Match URL セクションの[Pattern:]に正規表現 (.*) を入力します。その他はデフォルトで上の画像の通りとなっているはずなので、そのままにしておきます。

設定の意味は、要求 URL が[Pattern:]に設定された正規表現 (.*) にマッチした時に Conditions に設定された条件を調べて、条件が満たされていれば Action の設定に従って処理を行うということです。正規表現 (.*) はどのような URL にもマッチします。

正規表現を ( ) で囲うのは意味があって、今回の例では使っていませんが、パターンをグループ化して入力の特定の部分を {R:0} とか {R:1} で取得できるからです。

[Ignore case]というのは大文字・小文字の区別をしないという意味です。チェックが入ったままにしておいてください。

(4) Conditions セクション

Conditions セクション

Conditions セクションを開いて[Add...]ボタンをクリックし、表示された「Add Condition」ダイアログで[Condition input:]と[Pattern:]に赤枠で示した通り入力します。その他はデフォルトで上の画像の通りとなっているはずなので、そのままにしておきます。

[Condition input:]に入力した {HTTPS} は、上に紹介した Microsoft のドキュメントにも書いてありますが、サーバー変数です。HTTPS 通信でない場合サーバー変数 {HTTPS} の値は OFF という文字列になります。

つまり、サーバー変数 {HTTPS} の値が[Pattern:]に入力した正規表現 ^OFF$ にマッチした場合は HTTPS 通信でないと判断され、Action に設定されるリダイレクトが実行されるということです。

Conditions セクションの入力・設定が完了したら[OK]ボタンをクリックします。結果は以下のようになるはずです。

設定された条件

(5) Action セクション

Action セクション

上の画像の赤枠で示した通り設定・入力します。その他はデフォルトで画像の通りとなっているはずなので、そのままにしておきます。

[Action types:]の設定[Redirect]でリダイレクトを行う応答(この記事では 301 Moved Permanently)が返されます。

[Redirect URL:]に設定した {HTTP_HOST} と {REQUEST_URI} はサーバー変数です。上に紹介した Microsoft のドキュメントにも書いてありますが、例えば要求 URL が以下の場合、

http://www.mysite.com/content/default.aspx?tabid=2&subtabid=3

取得される文字列はそれぞれ以下のようになります。

  • HTTP_HOST: www.mysite.com
  • REQUEST_URI: /content/default.aspx?tabid=2&subtabid=3

[Append query string]のチェックは外しておきます。[Redirect URL:]に設定した REQUEST_URI にクエリ文字列は含まれるので不要なはずです。

[Redirect type:]はデフォルトで[Permanent (301)]となっているはずなのでそのままにしておきます。今回のような HTTP から HTTPS へのリダイレクトでは 301 Moved Permanently が SEO 的に望ましいそうです。

(6) ルールの適用

ルールの適用

入力・設定が完了したら右側の「操作」欄の下のメニュー[適用]をクリックします。

(7) web.config

アプリの web.config に以下のコードが追加されているはずなので確認してください。

<system.webServer>
  <rewrite>
    <rules>
      <rule name="Redirect HTTP to HTTP" stopProcessing="true">
        <match url="(.*)" />
        <conditions>
          <add input="{HTTPS}" pattern="^OFF$" />
        </conditions>
        <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" 
                appendQueryString="false" />
      </rule>
    </rules>
  </rewrite>
</system.webServer>

(8) ブラウザで確認

ブラウザで確認

ブラウザのキャッシュを削除してからアドレスバーに http で始まる URL を入力して要求をかけ、上に設定したとおりリダイレクトが行われるか確認してください。

上の画像は Chrome のディベロッパーツールの Network でキャプチャした要求・応答を見たものです。設定どおり 301 Moved Permanently 応答が返ってきて、https で始まる URL にリダイレクトされています。

確認後、上の (7) の xml コードをホスティングサービスのサイトの web.config にコピーします。結果、期待通り HTTP から HTTPS へリダイレクトされることが確認できました。

Tags: , ,

Windows Server

MariaDB 10.11 をインストールしました

by WebSurfer 10. December 2024 13:33

MariaDB 10.11.10 を自分の PC (Windows 10 バージョン 22H2) にインストールしましたので、その手順などを備忘録として書いておきます。

2024 年 12 月に自分が使っているホスティングサービスで新サーバーへの移行がありました。新サーバーでは MariaDB 10.11 が使用されており、それに自分がブログアプリで使っているプロバイダ MySql.Data 6.3.6 でアクセスするとサーバーエラーになるという問題が生じました。

(MariaDB とMySql.Data との相性の話は MySQL Connector fails to connect to MariaDB 10.10.2 とか MySqlConnection.Open() System.InvalidCastException: Object cannot be cast from DBNull to other types に情報がありますので興味があれば見てください)

そういう訳で、自分の開発環境での検証用に、ホスティングサービスが使っている MariaDB 10.11 と同じバージョンのものを MariaDB Server: the innovative open source database から入手して自分の PC にインストールしました。(ちなみに、記事を書いた時点での最新版は 11.6.2 です)

まず、MariaDB のダウンロードページ Download MariaDB Server に行き、ドロップダウンリストでバージョンを選び[Download]ボタンをクリックします。

ドロップダウンリストで MariaDB Server 10.11.10 を選んだ場合 mariadb-10.11.10-winx64.msi という msi 形式のインストーラーがダウンロードされますので、それを起動してインストールします。

以下にインストールするときに表示された画像を貼って要点を書いておきます。

(1) 初期画面

初期画面

ダウンロードした mariadb-10.11.10-winx64.msi を起動すると上の画面が表示されます。[Next] ボタンをクリックします。

(2) Und-User License Agreement 画面

Und-User License Agreement

ライセンス条項が表示されるので、アクセプトして ([I accept the terms in the License Agreement] にチェックを入れて)、 [Next] ボタンをクリックします。

(3) Custom Setup 画面

Custom Setup

カスタム設定のための画面が表示されます。自分の環境ではデフォルトのままで問題ないので、何も変更せず [Next] ボタンをクリックしました。

(4) Deafult instance properties 画面 (1/2)

Deafult instance properties (1/2)

データベースに root ユーザーで接続する際のパスワードなどの設定画面が表示されます。今後の接続の際に使用するパスワードを決めて入力します。パスワードはおぼえておいてください。

[Use UTF8 as default server's character set] にチェックを入れます。[Data directory] はデフォルト C:\Program Files\MariaDB 10.11\data\ のままにしました。

ローカルでの検証用に使うだけなら [Enable access from remote machines for 'root' user] は不要ですが、将来そういう必要も出てくるかもしれないと思ってチェックを入れておきました。

以上の設定を入力して [Next] ボタンをクリックします。

(5) Default instance properties 画面 (2/2)

Deafult instance properties (2/2)

デフォルトの設定のまま [Next] をクリック・・・したのですが、"The TCP Port you selected is already in use. Please choose a differnt port." というエラーメッセージが出て先に進みません。

記録に残っていないですが、先に MySQL 8.0.19 をインストールした際、ポート 3306 を使用したようです。(ちなみに、ノート PC の MySQL 5.7.17 が 3306、PostgreSQL は 5432 というのは記録に残っていました)

という訳で、[TCP port] のみ 3307 に変更しました。その他は上の画面の通りのデフォルトのまま [Next] ボタンをクリックします。

(6) Ready to install MariaDB 10.11 (x64) 画面

Ready to install MariaDB 10.11 (x64)

[Install] ボタンをクリックします。ボタンには盾マークが表示されていますが、インストールの際に権限の昇格が必要という意味です。インストールが進まない場合はユーザーアカウント制御画面が表示されているはずなので [はい] をクリックしてください。

[はい] をクリックすると Installing MariaDB 10.11 (x64) 画面が表示され、インストールが開始されるはずです。

(7) Completed the MariaDB 10.11 (x64) Setup Wizard 画面

Completed the MariaDB 10.11 (x64) Setup Wizard

インストールが完了すると上の画面が表示されます。[Finish] ボタンをクリックして終了します。

(8) スタートメニュー

スタートメニュー

インストールの結果、Windows のスタートメニューには上の画像の項目が表示されます。

一番下の MySQL Client (MariaDB 10.11 (x64)) が MySQL の Command Line Client と同様なものらしいです。


メニューに含まれる HeidiSQL というのは、SQL Server Management Tool と同様に GUI で MariaDB の操作ができるツールのようです。詳しくは What is HeidiSQL? を見てください。

インストールした MariaDB に接続して使えるようにする方法を下に書いておきます。

(a) HeidiSQL 初期画面

HeidiSQL 初期画面

起動すると上の初期画面が表示されます。[新規] ボタンをクリックします。

(b) HeidiSQL 初期設定

HeidiSQL 初期設定

上の画面で名前を「ローカルMariaDB」とし (任意に覚えておきやすい名前を設定)、ポートを 3307 に変更 (ポートは MariaDB のインストール時に設定したもの)、パスワードに MariaDB のインストール時に設定したものを入力して [開く] ボタンをクリックします。

(c) HeidiSQL 画面

HeidiSQL 画面

上の画面が表示されます。「ローカルMariaDB」下に表示されている項目は、上の手順で MariaDB 10.11.10 をインストールした際に同時にインストールされたデータベースです。

自分は HeidiSQL を使って、データベース blogengine を作成し、[ファイル] ⇒ [SQL ファイルを実行] でホスティングサービスからエクスポートした SQL を走らせてブログの記事のデーターベースを複製しました。


上の手順でインストールした MariaDB 10.11.10 に MySql.Data を使って接続を試みるとどうなるかを検証してみました。

ちなみに、接続文字列は MySQL と同じものに port=3307 を追加すれば OK でした。以下の様にします。

server=localhost;user id=root;password=********;database=mysql;port=3307

MySql.Data 8.1 以降であれば、問題なく MariaDB 10.11.10 に接続でき、データを取得できました。

MySql.Data 8.0.11 では MySql.Data.MySqlClient.MySqlException "The host localhost does not support SSL connections." という例外がスローされます。

MySql.Data 6.x では System.InvalidCastException "オブジェクトを DBNull から他のタイプにキャストすることはできません。" という例外がスローされます。

・・・ということで、既存のブログアプリで使っている MySql.Data 6.3.6 がダメということでした。MySql.Data 8.1.0 は既存のブログアプリのフレームワーク .NET Framework 3.5 には対応してないので MySql.Data.dll を入れ替えれば済むという問題ではないことが分かりました。

Tags: ,

MySQL

About this blog

2010年5月にこのブログを立ち上げました。主に ASP.NET Web アプリ関係の記事です。ブログ2はそれ以外の日々の出来事などのトピックスになっています。

Calendar

<<  April 2025  >>
MoTuWeThFrSaSu
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

View posts in large calendar