【Python】ChatGPTとLangChain使って自分のデータから検索させる

目的 ユーザーがChatGPTに質問をするとOpenAIが持っているデータベースを参照して回答してくれます。しかしこのデータは2021年までしか保存されていないため、それ以降のデータは質問しても回答してくれません。例として2022年にリリースされたLangChainのフレームワークのことをChatGPTに質問すると下記の画像のように知らないと回答されます。 また、自分でアップロードしたデータを参照させたい場合もファイルのサイズに制限があります。 しかし、今日紹介する、PyhotnフレームワークのLangChainとChatGPTを使用することで自分で指定したデータからクエリさせることが可能になります。例として同じLangChainについて質問をさせました。そしてChatGPTにLangChainのドキュメンテーション(英語)を読み取りさせています。ChatGPTに読ませたファイルはGitHubのdataディレクトリ内にあります。 このテクノロジーはアメリカの大企業のQ&Aやカスタマーサポートなどで使われ始めている機能で、すぐに当たり前の技術になってくるでしょう。(私がアメリカにいるので日本ではどれくらい復旧しているかは確認していません。) 完成したコードはGitHubから見てください。 先に準備(理解)しておくこと 今回のプロジェクトにはOpenAIのAPIキーが必要になります。このキーを取得するにはクレジットカードを登録する必要があります。テストくらいのリクエストのみであればジュース代だと思って使うのもありだと思います。※自己責任で進めてください。 chromaDBはオプショナルですが、ChatGPTに入力した記録を残しChatGPTがその会話をデータとして参照できるようにします。 LangChainは今回の主役になるフレームワークです。 プロジェクトのセットアップ では下記のコマンドでGitHubからリポジトリをクローンしましょう。 以下に手順を詳しく説明します: APIキーを貼り付ける constantsCOPY.pyのファイル名からCOPYを取り除き、constants.pyにします。次にChatGPTのAPIキーを貼り付けます。 ファイルを実行する ではdataディレクトリにchatGPTに読ませたいデータを入れておきます。.txtファイル、PDFファイル、CSVファイル、JSONファイルなどが読み込み可能です。 次に下記のコマンドでpyファイルを実行します。 では次にコードを詳しく説明します。 メソッドのインポート リポジトリになるように下記に必要なメソッドとモジュールをインポートします。 ChromaDBのコンフィグ この行は、モデルをディスクに保存して再利用するための設定を行っています。 PERSIST は、モデルをディスクに保存して再利用するかどうかを制御するためのブール値の変数です。現在は False に設定されていますので、モデルの永続化は無効になっています。 PERSIST を True に設定すると、モデルがディスクに保存され、同じデータに対して繰り返しクエリを実行する場合に、モデルを再作成する必要がありません。これにより、処理時間を節約できます。 ただし、モデルをディスクに保存すると、ディスク容量の使用量が増えることに注意する必要があります。また、ディスク上の保存データの管理や更新も考慮する必要があります。 クエリの作成 このコードは、query 変数を使用してインデックスを再利用するかどうかを判断し、その結果に応じてインデックスを作成します。 まず、query を None に初期化します。次に、条件 len(sys.argv) > 1 を使用して、コマンドライン引数の数が1つ以上あるかどうかをチェックします。もし引数が存在する場合、sys.argv[1] の値が query に代入されます。 その後、PERSIST が True かつ “persist” という名前のディレクトリが存在する場合、インデックスを再利用していることを示すメッセージが表示されます。Chroma クラスのインスタンスである vectorstore を作成し、VectorStoreIndexWrapper … Read more

【埋め込みデータベース】Chromaとは

埋め込みデータベースとは 埋め込みデータベース(Embedding Database)は、データの特徴表現を効率的に保存・検索するためのデータベースです。埋め込み(Embedding)は、データを低次元のベクトル空間に変換する手法であり、データの意味や特徴を抽出した表現を得ることができます。 埋め込みデータベースは、一般的に機械学習や自然言語処理のタスクにおいて特に有用です。例えば、顔認識システムでは、顔画像を埋め込みベクトルに変換してデータベースに格納し、そのベクトルとの距離を計算することで、特定の人物の顔を識別することができます。また、文書の類似性検索では、文書を埋め込みベクトルに変換し、ベクトル間の距離を計算して類似した文書を検索することができます。 埋め込みデータベースは、高速な検索やクエリ処理を実現するために最適化されています。特に、近傍探索(Nearest Neighbor Search)などの高度な検索アルゴリズムが使用され、大規模なデータセットに対しても効率的な操作が可能です。 Chromaとは Chromaはオープンソースの埋め込みデータベースです。Chromaは、知識、事実、スキルをLLM(Language Model)にプラグイン可能にすることで、LLMアプリケーションの構築を容易にします。 Chromaは、以下のような機能を提供します: Chromaは、以下の点を重視しています: Chromaには、PythonクライアントSDK、JavaScript/TypeScriptクライアントSDK、およびサーバーアプリケーションが含まれています。 Chromaのインストール Python Pythonでは、Chromaはメモリ内またはクライアント/サーバーモード(アルファ版)で実行することができます。 メモリ内モードでは、Chromaはデータベースをメモリ内に展開し、データを高速に処理することができます。これは小規模なデータセットや一時的な処理に適しています。 クライアント/サーバーモードでは、Chromaはクライアントとサーバーの役割を分けて動作します。クライアントはPythonのChromaクライアントSDKを使用してデータベースにアクセスし、サーバーはChromaサーバーアプリケーションを実行してデータの永続的な保存と検索を担当します。これにより、大規模なデータセットや分散環境での処理が可能となります。 ただし、クライアント/サーバーモードは現在アルファ版であり、開発中の機能です。 Chromadbインストールのエラー 上記のコマンドでchromadbをインストールするとエラーがでるかもしれません。 エラーの原因一つの理由として、Pythonのバージョンがあげられます。最新のPythonをインストールして再度試してみましょう。 次にpipのバージョンも最新のものに更新しておきます。 ウィンドウズのビルドツールからMicrosoftのC++ビルドツールをインストールする このエラーについてはGitHubの ではこのリンクからMicrosoftのビルドツールをダウンロードします。 https://visualstudio.microsoft.com/visual-cpp-build-tools/ 実行ファイルを起動してVisual Studio Installerを起動します。Modifyをクリックします。 次にIndivisual Componentsのタブから、MSVCのツールを探します。これは自分のマシンによって選択するものが変わりますが、Windowsの場合はx64/x86になります。 次にwindows11(若しくは10)のSDKを探しチェックします。 ではこの2つを選択した状態で右下のModifyのボタンを押しましょう。 では再度pip install chromadbのコマンドを実行します。 私の場合はこれでうまくいきました! これでもまだうまくいかない場合はGitHubのIssueを確認しましょう。 https://github.com/chroma-core/chroma/issues/189

LangChainとは

LangChainとは LangChainは2022年にリリースされたライブラリになるのでChatGPTに聞いても教えてくれません。(ChatGPTは2021年までのデータまでしか把握していません。) 以下に、なぜLangChainがChatGPTを使用するうえで重要なライブラリになるかを説明します。 LangChainは、自然言語処理(NLP)のためのライブラリとツールセットです。LangChainは、様々なNLPタスクにおいて効率的かつ柔軟な開発を支援するために設計されています。 LangChainの主な機能とコンポーネントには以下があります: LangChainはこれらのコンポーネントを組み合わせて使用することで、自然言語処理のさまざまなタスクを効率的に実行することができます。 つまり、我々が提供するデータからChatGPTを使ってユーザーと対話側のコミュニケーションが取れるアプリケーションが作成できるライブラリになります。 PythonとJavaScript LangChainはPythonとJavaScriptの両方で使用することができます。PythonライブラリはこのGitHubリポを参照してください。JavaScriptGitHubリポはこちらから確認してください。 LangChainが正しい回答をクエリする流れ LangChainにおけるベクターデータベースから質問の回答に近い答えをクエリする一般的な流れは次のようになります: この流れに従ってLangChainを使用することで、ベクターデータベースから質問に近い回答を効率的にクエリすることができます。LangChainの機能とコンポーネントは、この流れをサポートするために設計されており、柔軟性と効率性を提供します。 つまり。。。 上記までの内容をもっと分かりやすくまとめます。 通常はユーザーがChatGPTに直接アクセスする流れになります。 しかしLangChainを使用することでChatGPTなどの言語モデルを介して、自分のデータを参照させることができます。 なぜこれがゲームチェンジャーかというと、このLangChainを使用することでほとんどすべての企業でベネフィットを得ることができるようになります。例えば社内でのドキュメントの検索、ユーザーがマニュアルやデータを参照する際のプラットフォームの作成など、使用方法は無限です。またGoogleに接続することでリアルタイムの情報(天気やニュースなど)を理解させることも可能になります。 LangChainのインストール(Python) 今回の記事ではPythonのライブラリに絞って解説をしていきます。 これでLangChainの最低限必要なライブラリがインストールされます。LangChainの強みは、さまざまなモデルプロバイダやデータストアなどと統合する際に生じます。ただし、そのために必要なモジュールはデフォルトではインストールされません。 一般的なLLMプロバイダに必要なモジュールをインストールするには、次のコマンドを実行してください。 環境の設定 LangChainを使用する場合、通常は1つ以上のモデルプロバイダ、データストア、APIなどとの統合が必要となります。この例では、OpenAIのモデルAPIを使用します。 まず、OpenAIのPythonパッケージをインストールします。 APIへのアクセスにはAPIキーが必要です。アカウントを作成し、こちらにアクセスすることでAPIキーを取得できます。キーを取得したら、環境変数として設定するために次のコマンドを実行します。 環境変数を設定したくない場合は、OpenAIのLLMクラスを初期化する際にopenai_api_keyという名前のパラメーターを直接渡すこともできます。 アプリケーションの構築 さて、言語モデルアプリケーションの構築を始めましょう。LangChainは、言語モデルアプリケーションの構築に使用できる多くのモジュールを提供しています。モジュールは単体で簡単なアプリケーションで使用することもできますし、より複雑なユースケースではモジュールを組み合わせることもできます。 LLMs 言語モデルから予測を取得する LangChainの基本的な構築ブロックはLLM(Language Model)であり、テキストを受け取り、さらなるテキストを生成します。 例として、企業の説明に基づいて企業名を生成するアプリケーションを構築しているとしましょう。これを行うために、OpenAIモデルのラッパーを初期化する必要があります。この場合、出力をよりランダムにしたいので、モデルを高いtemperatureで初期化します。 そして、テキストを渡して予測を取得できます。 チャットモデル チャットモデルは、対話型言語モデルです。チャットモデルは言語モデルを内部で使用しますが、公開するインターフェースは少し異なります。通常の「テキストの入力とテキストの出力」のAPIではなく、複数のメッセージを入力として受け取り、応答としてメッセージを返します。 チャットモデルには、1つ以上のメッセージをチャットモデルに渡すことでチャットの補完を取得できます。応答はメッセージとして返されます。LangChainで現在サポートされているメッセージの種類はAIMessage、HumanMessage、SystemMessage、ChatMessageであり、ChatMessageは任意の役割パラメータを受け取ります。ほとんどの場合、HumanMessage、AIMessage、SystemMessageの3つのメッセージを使用します。 チャットモデルが通常のLLMとどのように異なるかを理解することは役立ちますが、通常は同じように扱えると便利です。LangChainでは、チャットモデルと同様にLLMとやり取りするためのインターフェースも提供されています。これは、predictインターフェースを介してアクセスできます。 プロンプトテンプレート プロンプトテンプレート(Prompt Templates)は、ほとんどのLLMアプリケーションではユーザーの入力を直接LLMに渡さず、通常はユーザーの入力を追加の文脈情報を提供するより大きなテキスト、つまりプロンプトテンプレートに追加します。 先ほどの例では、モデルに渡したテキストには企業名を生成するための指示が含まれていました。アプリケーションでは、ユーザーが企業や製品の説明を提供するだけで、モデルに指示を与える必要はないと便利です。 Chains チェーン(Chains)を使用すると、モデル、プロンプトテンプレート、他のチェーンなど、複数のプリミティブをリンク(またはチェーン)して組み合わせることができます。 チェーンは、LangChainフレームワークにおいて、異なるプリミティブを連結して組み合わせるための仕組みです。これにより、モデルとテンプレートを結びつけて特定のタスクを実行することができます。 たとえば、モデルとプロンプトテンプレートを組み合わせて、特定のテキスト生成タスクを実行するチェーンを作成することができます。また、より複雑なアプリケーションを構築するために、複数のチェーンを結合して使用することもできます。 チェーンは、LangChainの柔軟性と拡張性を高める重要な要素であり、異なるプリミティブを組み合わせることで、さまざまなタスクに対応できるようになります。 Agents エージェント(Agents)は、入力に基づいて動的にアクションを選択する必要がある複雑なワークフローを処理するために使用されます。 エージェントは、言語モデルを使用して、どのアクションを取るか、どの順序で取るかを決定します。エージェントはツールにアクセス権があり、ツールを選択し、実行し、出力を観察して最終的な回答を導き出すまで、繰り返し動作します。 エージェントを読み込むには、次の要素を選択する必要があります: LLM/Chatモデル:エージェントのバックエンドとなる言語モデルです。 ツール:特定のタスクを実行するための関数です。例えば、Google検索、データベース検索、Python REPL、他のチェーンなどが含まれます。事前定義されたツールとその仕様については、ツールのドキュメントを参照してください。 エージェント名:サポートされているエージェントクラスを参照する文字列です。エージェントクラスは、言語モデルがどのアクションを選択するかを決定するために使用するプロンプトによって主にパラメータ化されます。 … Read more

Pineconeとは

Pineconeとは Pineconeは、機械学習のための高速でスケーラブルなベクトル検索エンジンです。ベクトル検索は、ベクトル表現でデータを表現し、ベクトル間の類似性を計算してデータを検索する技術です。 Pineconeは、大量のベクトルデータをリアルタイムで高速に検索することを目的としています。これには、機械学習モデルの埋め込み表現や特徴ベクトルなどのデータを含めることができます。例えば、製品の特徴ベクトルや顧客のプロファイルをPineconeに格納し、似たような製品や顧客を見つけるためにクエリを実行することができます。 Pineconeは、高速な類似性検索とスケーラビリティに優れており、リアルタイムのアプリケーションやサービスでの利用に適しています。また、Pineconeはクラウドベースのサービスとして提供されており、簡単に統合して利用することができます。 Pineconeは、機械学習エンジニアやデータサイエンティストが類似性検索やパターンマッチングを効率的に行うためのツールとして利用されています。また、個別のユースケースに応じて、推薦システム、自然言語処理、コンピュータビジョンなど、さまざまな分野で利用されています。 Pineconeの開発者 Pineconeは、アメリカの企業であるOpenAIによって開発されました。OpenAIは、人工知能(AI)の研究と開発を行う非営利団体および企業であり、AI技術の発展と普及に取り組んでいます。OpenAIは、GPT-3やGPT-3.5などの有名なAIモデルを開発したことでも知られています。 Pineconeは、OpenAIが開発したベクトル検索エンジンであり、その目的は高速かつ効率的なベクトルデータの検索と類似性の計算です。OpenAIは、Pineconeを利用することで、機械学習エンジニアやデータサイエンティストがリアルタイムで大規模なベクトルデータを処理し、高度な類似性検索やパターンマッチングを実現できるようにしました。 Vector Databaseとは Vector Database(ベクトルデータベース)は、ベクトル検索に特化したデータベースの一種です。通常のデータベースは、主にテキストや数値などの構造化データを格納・検索するために使用されますが、ベクトルデータベースでは、ベクトル表現でデータを格納し、ベクトル間の距離や類似性を計算してデータを検索することができます。 ベクトルデータベースは、大規模なベクトルデータセットを効率的に管理し、高速な類似性検索を実現することを目的としています。ベクトルデータベースは、ベクトルのインデックス化や効率的なベクトル検索アルゴリズムの実装に特化しており、従来のデータベースとは異なる要件に対応しています。 ベクトルデータベースは、機械学習の分野で広く活用されています。例えば、画像やテキストの埋め込みベクトル、音声や動画の特徴ベクトル、ユーザーのプロファイルなど、様々なタイプのベクトルデータを格納し、類似性検索やパターンマッチングを行うことができます。ベクトルデータベースは、リアルタイムなアプリケーションやサービスにおいて、高速かつスケーラブルなベクトル検索を可能にするために使用されます。 使われる用語 Pineconeを使用する際に関連する専門用語を以下に説明します。 Pineconeを使ってみよう ではPineconeのサイトにアクセスしてSign Up Freeのボタンからアカウントを作成しましょう。データの使用料や期間により有料になります。 では、GoogleやGitHubのアカウントでサインアップすることができるのでこれらのアカウントを使ってログインしましょう。 ログインするとAPI Keyが与えられるので自分のプロジェクトに使えるようになります。 PythonでPineconeにアクセスする方法 Pineconeにアクセスするためには、Pinecone Pythonクライアントを使用します。以下は、Pinecone Pythonクライアントを使用してPineconeデータにアクセスする方法の一般的な手順です。 上記の手順は一般的なPineconeデータの操作方法の例です。具体的なデータの構造や要件に応じて、より詳細な設定や操作を行うことができます。

【Python】PyMuPDFライブラリを使おう

Python_PyMuPDF

PyMuPDFとは PyMuPDFは、Python向けのオープンソースのライブラリであり、PDF文書の操作や処理を行うために使用されます。PyMuPDFは、MuPDFという高性能なPDF処理エンジンを基にしており、Pythonから直接アクセスできるようになっています。 PyMuPDFを使用すると、以下のようなことが可能です: PyMuPDFは高度なPDF処理機能を提供するため、PDFの操作や処理が必要なプロジェクトで便利に利用されます。 PyMuPDFの開発者は誰? PyMuPDFは、Artifex Software Inc.という企業が開発しました。Artifex Softwareは、MuPDFと呼ばれる高速なPDF処理エンジンの開発元でもあります。PyMuPDFは、MuPDFの機能をPythonから利用できるようにするために、Artifex Softwareによって開発・メンテナンスされています。 PyMuPDFをインストールする PyMuPDFライブラリをインストールするためには、以下の手順に従ってください: なお、PyMuPDFはMuPDFのバイナリ依存関係を持つため、インストール時には適切なバイナリが自動的にダウンロードされます。ただし、一部のプラットフォームではバイナリが提供されていない場合があります。その場合は、別途MuPDFのバイナリを手動でインストールする必要があります。 また、PyMuPDFのインストールには依存関係がある場合がありますので、必要な追加パッケージがインストールされていることを確認してください。一般的には、Pythonの開発環境には必要なパッケージがすでに含まれていますが、エラーが発生した場合は公式ドキュメントを参照してください。 以上の手順に従ってPyMuPDFライブラリをインストールすると、PythonプロジェクトでPDFの操作や処理を行うことができるようになります。 PyMuPDFで使えるメソッド PyMuPDFライブラリには、PDFの操作や処理に使用できる多くのメソッドがあります。以下にいくつかの一般的なメソッドを紹介します。 これらは一部の一般的なメソッドの例です。PyMuPDFでは、PDFの描画、注釈の追加、フォームの操作、PDFの結合や分割など、さまざまな操作が可能です。 PDFからテキストを抽出する 以下は、PyMuPDFライブラリを使用してPDFファイルからテキストを抽出する簡単なPythonプログラムの例です。 上記のプログラムでは、fitzモジュールを使用してPDFファイルを開き、各ページからテキストを抽出しています。extract_text_from_pdf関数は、PDFファイルのパスを引数として受け取り、抽出されたテキストを文字列として返します。 pdf_path変数には実際のPDFファイルのパスを指定してください。プログラムを実行すると、PDFファイルから抽出されたテキストが表示されます。 プログラムは下記のコマンドで実行してください。 この例は、PyMuPDFを使用して基本的なPDFテキスト抽出を行うものです。PyMuPDFには他にも多くの機能があり、PDFの描画や注釈の追加など、さまざまな操作が可能です。 PyMuPDFをしたアプリの例 以下に、PyMuPDFを使用したアプリケーションのアイディアをいくつか挙げます: これらはいくつかの例ですが、PyMuPDFは柔軟で高機能なライブラリであり、PDF処理に関連する多くの領域で利用されています。実際のアプリケーションでは、これらの機能を組み合わせて独自のユースケースに合わせた機能を開発することができます。

【Python】Flaskを始めよう

Flaskを始めよう

Flaskとは Flaskは、Pythonで開発された軽量なWebアプリケーションフレームワークです。Webアプリケーションの構築を容易にするために設計されており、シンプルさと柔軟性が特徴です。 Flaskは、HTTPリクエストを受け取り、レスポンスを返すためのルーティングやビューを定義することができます。また、テンプレートエンジンを使用して動的なコンテンツの生成や、データベースとの連携、セッション管理など、一般的なWebアプリケーション開発に必要な機能を提供します。 Flaskの特徴の一つは、軽量かつシンプルな設計です。これにより、開発者は必要な機能を選択し、カスタマイズすることが容易になります。また、Flaskは拡張性が高く、多くのサードパーティ製拡張モジュールが利用可能です。これにより、データベース処理、認証、API開発など、さまざまな機能を追加することができます。 Flaskは人気のあるWebフレームワークであり、小規模なプロトタイプや中規模なアプリケーションの開発に適しています。また、FlaskはPythonのエコシステムともシームレスに連携することができるため、Pythonの豊富なライブラリやツールを活用することができます。 総じて言えば、Flaskはシンプルさと柔軟性を重視したPythonのWebフレームワークであり、Webアプリケーションの開発を迅速かつ効率的に行うためのツールです。 Flaskのインストール Flaskを始めるためには、以下の手順に従ってインストールを行う必要があります。 macOS/Linux(Bashシェルを使用する場合): Flaskのインストール: 仮想環境をアクティベートした場合は、コマンドラインで以下のコマンドを実行してFlaskをインストールします: Flaskはデフォルトでローカルホスト(http://127.0.0.1:5000/)でアプリケーションを実行します。Webブラウザを開き、このURLにアクセスすると、”Hello, World!” と表示されるはずです。 これで、Flaskのインストールと初めてのアプリケーションの作成・実行が完了しました。 FlaskにHTMLを使ったテンプレートを作成する方法 Flaskでは、HTMLを使ったテンプレートを作成することができます。以下の手順に従って、FlaskでHTMLテンプレートを作成する方法を説明します。 これで、FlaskでHTMLテンプレートを作成し、動的なコンテンツを表示することができます。テンプレート内では、フローティング変数、条件分岐、ループなどの制御構造を使用して、より複雑なテンプレートを作成することも可能です。FlaskのテンプレートエンジンにはJinja2が使用されているため、Jinja2の文法と機能を学ぶことも有用です。 if __name__ == ‘__main__’: if __name__ == ‘__main__’: と app.run() の組み合わせは、Pythonスクリプトが直接実行される場合にのみ、Flaskアプリケーションを実行するための一般的なパターンです。以下に詳細を説明します。 Pythonのスクリプトファイル(.pyファイル)は、他のスクリプトやモジュールからインポートされることもありますが、また、直接実行されることもあります。 if __name__ == ‘__main__’: は、Pythonインタプリタが現在実行しているスクリプトがエントリーポイント(直接実行されるファイル)である場合に条件が真となります。一方、他のスクリプトからインポートされた場合は条件が偽となります。 app.run() は、Flaskアプリケーションを起動するためのメソッドです。FlaskがローカルのWebサーバーを立ち上げ、アプリケーションを実行します。通常、app.run() はFlaskアプリケーションを実行するために必要な一行のコードです。 組み合わせると、if __name__ == ‘__main__’: ブロック内に app.run() を配置することで、Pythonスクリプトが直接実行された場合にのみ、Flaskアプリケーションが実行されるようになります。他のスクリプトからインポートされた場合には、app.run() は実行されず、アプリケーション自体は起動されません。 このパターンは、Flaskアプリケーションを開発しているときに便利です。開発中に、他のスクリプトからアプリケーションをインポートしてテストしたり、モジュールとして再利用することができますが、同時にスクリプト単体として実行して動作を確認することもできます。 templatesに作成したindex.htmlにCSSとJavaScriptのファイルを追加する Flaskのテンプレート内にCSSファイルやJavaScriptファイルを追加するには、以下の手順に従ってください。 {{ url_for(…) }} は、Flaskのテンプレート内で静的ファイルのパスを生成するための特殊な構文です。これにより、正しいファイルパスが生成されます。 これで、index.htmlテンプレートにCSSファイルとJavaScriptファイルが追加されました。Flaskはこれらの静的ファイルを自動的に探し、リンクやスクリプトとして適切に読み込みます。Webブラウザでアプリケーションを実行すると、CSSが適用され、JavaScriptが実行されるはずです。

DjangoアプリにGoogleでログインできるようにする

Django-allauth

こんにちは。今日はDjangoアプリにGoogleなどのソーシャルメディアアカウントを使ってログインする方法を紹介します。

今回使用するdjango-allauthライブラリを使用することにより、ソーシャルメディアでユーザーをサインアップさせることができます。

詳しいドキュメンテーションはこちらを参照してください。(英語ですが。)

あと、Googleクラウドのサービスは課金されるものになるのでテストが完了したら課金はオフにしておきましょう。(最初に登録した場合は無料のクレジットがもらえるはずですが。)

ちなみに今回はフロントエンドはDjangoのテンプレートを想定していますが、REST APIを使ってログインする方法も今後紹介する予定ですのでお見逃しなく。

WSL2を使ってWindows11からDjangoをデプロイしよう

WSL2からDjangoをデプロイ

前回の記事では、windowsにWSL2(Windows Subsystem for Linux)をインストールする方法を紹介しました。 では今日はWSL2を使ってDjangoをデプロイする方法を説明していきます。UbuntuサーバーからDjangoをデプロイする方法はこちらの記事を参考にしてください。 ※今回はwindows11で作業を行っています。SWL2であれば問題はないと思いますが、Windows11を使うことをお勧めします。 ※WindowsからDjangoはデプロイできますが、Hyper-VでNATネットワークをUbuntuにアサインしているためにデフォルトでは、Windowsマシン以外からDjangoアプリにアクセスができません。詳しい対応策はMicrosoftのWSLのGitHub Issueを見てください。 Ubuntuサーバーの起動 では前回の記事でインストールしたUbuntuサーバーを起動します。 Ubutnuサーバーの環境の確認 これから作業するにあたり、Linuxのコマンドに慣れていない人は簡単な早見表などを見ておくとよいです。 例えばCtl+Lで入力画面が一番上に来るのでキレイに見えます。 他に入力している途中でCtl+iを押すと推測したテキストが表示されます。長いファイル名の場合は最初の何文字か書いてCtrl+iで記入を終わられるのに便利です。 また、過去に実行したコマンドを見たい場合は上矢印で見ることができます。 UbuntuサーバーのIPアドレスを見てみます。 ip addrのコマンドで分かるようにeth0のインターフェースに172.18.173.157のIPアドレスがあることが分かります。 WindowsのホストマシンのコマンドプロンプトからPingをかけてみました。 リスポンスがあったので、ここからデプロイできそうです。 次にPythonが入っていることを確認します。 次にUbuntuソフトウェア、パッケージのアップデートをします。 Ubutnuユーザーをwww-dataグループに追加します。 ※これからの作業の注意点 Ubuntuユーザーを作成した際にsudoの権限がすでについています。rootに切り替えて作業せず、そのままsudo権限のあるユーザーのまま作業を行いましょう。理由はnginxやファイルの実行の際に権限が与えられていないとエラーが発生するからです。 Djangoデプロイに使うライブラリをUbuntuにインストール 下記のコマンドでUbuntuサーバーにグローバルにインストールしていきます。 PostgreSQLのデータベースを作成 ではこちらの参考Djangoのプロジェクトを使用してデプロイさせていくことにします。もしPostgreSQLを使ったことがない人は1時間くらいかけてデータベースのSQLコマンドを練習、理解してみてください。今後データベースのデータの修正やバックアップを取るためにコマンドラインを使っていくことになるので慣れておくとよいです。 postgresをインストールしたときに自動でpostgres というアドミン権限のユーザーが作成されます。 この権限を使って新しいデータベースとユーザーを作成します。 まずは、PostgreSQLのステータスを確認します。 PostgreSQLが起動できたらPostgresのユーザーに切り替えます。 これでユーザーが切り替わりSQLの入力モードになったことが分かります。 では、Djangoのsettings.pyに合わせたデータベースを作成していきます。 セミコロンを忘れずに! \lのコマンドでDBの一覧が表示されます。 これでpostgresユーザーがオーナーのデータベースが出来ました。 PostgreSQLのコンフィグレーション もしデータベースのオーナーをpostgres以外に設定したい場合は新しいPosgreSQLのユーザーを作成して所有権を移動させてください。 ではpostgresの接続をスムースにするためにコネクションパラメーターを変えます。 まずはエンコーディングをutf-8に変えます。 Postgresのタイムゾーンを日本時間に変えます。 Djangoのタイムゾーンがデフォルト(初期設定)でUTCにセットさせているのでそれを変更していない人はSettnigs.pyから変更しておきましょう。 次に、作成したユーザーにdb(データベース)のアドミン権限をつけます。 postgresは一旦完了なのでquitと入力してでpostgresから抜け出しましょう。 もしくはCtl+Zでも抜けられます。 Django用に仮想環境を作成 pythonではいくつか仮想環境のライブラリがありますが今回はvirtualenvを使用します。 仮想環境を使ったことがない人は詳しく理解しておいた方が良いですね。 簡単に説明すると同じサーバーで違うバージョンのライブラリを使いたいとき(例えばDjangoの3.0と4.0)に仮想環境をアクティベートして同じマシンでも同時に使用できる様になります。 また、複数人で仕事をするときもバージョンを統一してするために使います。 Pipの準備pipはpythonパッケージマネージャーでpythonのライブラリをインストールする際に使用しますね。 -HのフラグはsudoのコマンドでユーザーのhomeディレクトリではなくrootのHOMEディレクトリにインストールするように指示します。 まずはpipを最新のものにします。 … Read more

JSひろばアプリ開発5日目:Djangoのデプロイ

JSひろばアプリ作成まで~5日目

前回まではJSひろばのVueアプリとDjangoのAPIを大まかに作成しました。 今日はフロントエンドのVueのデプロイよりも先にDjangoのアプリをデプロイして実際のAPIを使ってVueからAPIコールができるようにします。実際にデプロイをしたあとに細かなセキュリティの設定やAPIのデータを入力していくようにします。 作業日 2022年12月14日 作業にかけた時間 5時間 合計作業時間 16時間 作業内容 ドメインの取得Ubuntuサーバーの設定サーバーのユーザー設定PostgreSQLのインストールリポジトリのクローンDjangoのデプロイNginxの設定SSLの取得 ドメインの購入 ドメインは〇〇.comとかウェブサイトのアクセスリンクになる部分ですね。今回は個人的なお勧めのNameCheap.comからドメインを購入します。APIの方もIPアドレスからAPIのエンドポイントを作成しようと思いましたがセキュリティの面からもドメインを使った方が良いとのことなのでDjangoとVueのアプリケーションのどちらにもドメインを割り当てます。 では、asameshi-api.cloudとjs-hiroba.comを購入します。合計で年間12ドルなので安いですね。SSL Certificate(HTTPS)は無料でサーバー側で設定できるのでここで購入する必要はありません。 サーバーにドメインを登録 今回もまた、個人的なお勧めのLinodeサーバーを使います。東京にサーバーを作りましたので先ほど購入したドメインをサーバーに登録しましょう。ではNameCheapのドメイン設定からカスタムDNSを設定します。 ところがLinode側で登録すると以前に設定していたサーバーと紐づけされてエラーになってしまいました。 これは私の方では何もできないので一旦、サポートにお願いをして待ちます。 その間にIPアドレスからデプロイしちゃいます。 サーバーの設定 まずはLinodeでサーバーを作ります。Linodeサーバーを月額500円で始めるという記事があるのでそちらを参考にしましょう。 サーバーを作成したらLinode側でドメインを登録します。 同じようにapiで使う方のドメインも登録しておきます。 サーバーにSSHで接続 詳しいSSHの使い方はこちらの記事で説明しています。サーバー構築で必ず役に立つので理解しておきましょう。 ではSSHクライアントを使ってサーバーに接続しましょう。SSHクライアントのMobaXtermを使います。 Djangoのデプロイ 詳しいDjangoのデプロイの仕方はこちらで説明しています。 同じような手順で設定していきましょう。 この後にデータベースを作成しましょう。 詳しくはDjangoのデプロイの仕方でカバーしているので確認しておきましょう。 次に仮想環境の設定です。 次にGunicornのテストをしました。 でNginxのコンフィグはこのようになりました。 ではNignxをテストして、サービスをリロードします。 ドメインをsettings.pyに登録していなかったのでエラーが出ました。しかしこれでDjangoのエラーのページが出たので正しくNginxとGunicornが動いていることが確認できますね。 これでサーバーを再起動してAPIのURLにアクセスすると問題が解決していることが確認できました。 しかしURLを見ても分かるようにまだHTTPのままなのでSSL Certificateを取得して安全なサイトにするようにします。 この作業はLet’s EncryptでSSL取得の記事を見て行いましょう。 ここで、安いプランのシェアサーバーだったせいか、SSLのセットアップに少し苦難し、2時間余計に時間がかかってしまいました。 特に、DNSを使ったSSL証明のチャレンジ、HTTPからHTTPSへのリダイレクトなど初めての作業だったのでとても良い経験になりました。

JSひろばアプリ開発4日目:Djangoプロジェクトの作成

JSひろばアプリ作成まで~4日目

前回まではVueのフレームワークを使い、フロントエンドのアプリを作成しました。まだモックのデータでしか操作できないので、実際にREST APIを作成したVue側で使えるようにしていきます。 今日は、PythonのウェブフレームワークのDjangoを使ってAPIを作っていきます。Flaskよりもアドミンページがあったりセキュリティの設定が最初から入っているなど開発の面でもスピードアップができる素晴らしいフレームワークです。 YouTubeでもDjangoとDjango REST APIを説明したプレイリストがあるので是非見てください。 作業日 2022年12月13日 作業にかけた時間 2時間 合計作業時間 11時間 作業内容 Djangoのプロジェクト作成virtualenvの設定requirements.txtに書き出しDRFのインストールDBのテーブルの構成モデル、URL、ビューの設定PostgreSQLに接続 Djangoのプロジェクト では早速Djangoのプロジェクトを作成します。Python3がインストールされていることを確認してください。 その前に仮想環境のvirtualenvが入っているか確認します。入っていない場合は下記のコマンドでインストールしましょう。 仮想環境の説明はこちらの動画を見てください。必ず役に立ちますよ。 では正しいファイルパスにいることを確認して下記のコマンドで仮想環境をアクティベートします。 これでプロンプトの最初に(env)と表示されればOKです。 Djangoのインストール ではDjangoとDjango REST Frameworkをインストールします。 他にも必要なパッケージがあればその都度インストールすると思いますが、今のところはなさそうです。 Djangoはバージョン4.1がリリースされているので最新のものを入れておきましょう。 必要であればgit initでリポを作成しましょう。詳しいGitとGitHubの使い方はこちらの動画を見てください。 では、下記のコマンドでDjangoのプロジェクトをスタートします。 次にmanage.pyのファイルを使ってDjangoのアプリを作成します。 次にを開発用の仮のデータベースをSQLiteで作成します。 その後にテストランしてみましょう。 これでセッションのテーブルができました。 では実際にブラウザにアクセスしてDjangoのデフォルトのページが表示されるか見てみます。 OKですね。では実際にコードに入ります。 アプリの登録 先ほど登録したcommandアプリをDjangoのプロジェクトに教えてあげます。 Settings.pyでcommandアプリとRESTフレームワークのアプリを登録しました。 次にプロジェクトフォルダのurls.pyにAPIのエンドポイントとなるURLを登録します。 このrouterファイルは後から作成します。まずはAPIの前にデータが登録できるところまで確認しましょう。 モデルの作成 ではデータベースの枠となるmodels.pyを作成していきます。 とりあえずはこんな感じで作成しました。 Views.pyの作成 Views.pyはモデルともとに何をするのか指示する場所になります。 ここではモデルをシリアル化してAPIを作成するように指示しています。 CommandSerializerのファイルがまだできていないのでそれを作成します。 CommandSerializer では同じファイルパスにserializers.pyを作成しましょう。 まずはこれだけ設定していきます。 admin.pyの登録 Djangoのアドミンパネルでテーブルが見れるようにモデルを登録します。 スーパーユーザーの登録 Djangoのスーパーユーザーを作成してアドミンパネルからテーブルが作成できるか見てみましょう。 再度テーブルのマイグレーションを行います。 … Read more