見出し画像

シンプルな Pastebin を Python Flask でつくる。


Muhammad

2024 年 7 月 5 日

Python と Flask でシンプルな Pastebin サービスを作成する

このブログ投稿では、Python と Flask を使用してシンプルな Pastebin サービスを構築します。Pastebin は、プレーン テキストまたはコード スニペットを一定期間保存するために使用される人気の Web アプリケーションです。ここでは、ユーザーがテキストを貼り付け、プログラミング言語を選択し、貼り付けを共有するための URL を取得できる基本バージョンを作成します。これに関する YouTube ビデオも作成しました。こちら でご覧いただけます。


はじめに

アプリケーションの作成を開始する前に、環境を設定しましょう。環境を設定するには、次の手順に従います。

  1. まず、プロジェクト ディレクトリに仮想環境を作成します。


    python -m venv venv
    
  1. 仮想環境を作成したら、それをアクティブ化し、このプロジェクトで使用する必要なライブラリをすべてインストールします。


    pip install Flask shortuuid pygments
    

また、各貼り付けに一意の ID を生成するために `shortuuid` を使用し、構文の強調表示には `pygments` を使用します。

  1. 必要なライブラリをすべてインストールしたので、必要なファイルとフォルダーを作成しましょう。


    mkdir -p pastes templates static && touch index.py templates/index.html static/styles.css
    

フォルダ構造は次のようになります。


    pastebin/
    │
    ├── app.py
    ├── pastes/
    ├── templates/
    │   └── index.html
    └── static/
        └── styles.css
    
    

`pastes` ディレクトリには、各貼り付けのテキスト ファイルが格納されます。templates ディレクトリには HTML テンプレートが含まれ、static ディレクトリにはスタイル設定用の CSS が含まれます。

環境がセットアップされたので、次はコーディングです。

🪰訳者注:
venv
で、python の仮想の環境を作っているので、venv を有効にして、仮想環境ディレクトリでの作業になります。
1. のように venv というディレクトリをつくって仮想環境とした場合、通常は、
source venv/bin/activate
のようにコマンドを使用して仮想環境ディレクトリでの作業に入ります。

venv については以下を参考にしてください。

https://www.genspark.ai/search?query=Python+venv

コードの記述

コードを見てみましょう。`index.py` という名前のファイルを作成し、次のコードを追加します:

Flask を作成したら、`templates/index.html` に HTML テンプレートを作成し、`static/style.css` に `style.css` を作成します。

アプリケーションが作成されたので、実行する前に、コードを分解して動作を理解してみましょう。

コードの分解

  1. まず、必要なライブラリとモジュールをインポートします。 `Flask` は Web フレームワーク、`shortuuid` は一意の ID を生成するために使用され、`Pygments` は構文の強調表示に使用されます。また、`pastes/` を保存するためのディレクトリも設定しました。


    from flask import Flask, request, render_template, abort
    import shortuuid
    import os
    from pygments import highlight
    from pygments.lexers import get_lexer_by_name, get_all_lexers
    from pygments.formatters import HtmlFormatter
    
    app = Flask(__name__)
    
    PASTE_DIR = 'pastes'
    if not os.path.exists(PASTE_DIR):
        os.makedirs(PASTE_DIR)
    

🪰訳者注:
つまり、`pastes` ディレクトリに、完成した Flask アプリでシンタッスハイライトされたスニペットコードが shortuuid で生成された文字列のファイル名のテキストファイルになって保存されていくことになります。

  1. 次に、構文強調表示のために Pygments でサポートされているすべての利用可能なプログラミング言語を取得し、それらをタプルのソートされたリストとして返す関数を記述します。


    def get_language_options():
        return sorted([(lexer[1][0], lexer[0]) for lexer in get_all_lexers() if lexer[1]])
    
  1. 次に、アプリケーションのメイン ルートを記述します。リクエスト メソッドが POST の場合 (つまり、ユーザーがフォームを送信する場合)、コンテンツと言語が一意の ID を持つ新しいファイルに保存されます。新しい貼り付けの URL が生成され、ユーザーに表示されます。リクエスト メソッドが GET の場合、フォームがレンダリングされるだけです。


    @app.route('/', methods=['GET', 'POST'])
    def index():
        if request.method == 'POST':
            content = request.form['content']
            language = request.form['language']
            paste_id = shortuuid.uuid()
            file_path = os.path.join(PASTE_DIR, paste_id)
    
            with open(file_path, 'w') as f:
                f.write(f"{language}\n{content}")
    
            paste_url = request.url_root + paste_id
            return render_template('index.html', paste_url=paste_url, languages=get_language_options())
    
        return render_template('index.html', languages=get_language_options())
    
    

このルートは、特定の貼り付けの表示を処理します。貼り付けファイルを読み取り、pygments を使用して構文の強調表示を適用し、強調表示されたコンテンツをレンダリングします。


    @app.route('/<paste_id>')
    def view_paste(paste_id):
        file_path = os.path.join(PASTE_DIR, paste_id)
        if not os.path.exists(file_path):
            abort(404)
    
        with open(file_path, 'r') as f:
            language = f.readline().strip()
            content = f.read()
    
        lexer = get_lexer_by_name(language, stripall=True)
        formatter = HtmlFormatter(linenos=True, cssclass="source")
        highlighted_content = highlight(content, lexer, formatter)
        highlight_css = formatter.get_style_defs('.source')
    
        return render_template('index.html', paste_content=highlighted_content, highlight_css=highlight_css)
    
    

すべてがどう機能するかを理解したら、次のコマンドを使用してアプリケーションを実行するだけです

`python index.py`

結論

Python と Flask を使用して、シンプルな Pastebin サービスを構築しました。このサービスでは、ユーザーはテキストを貼り付け、プログラミング言語を選択し、一意の URL で貼り付けを共有できます。貼り付けの有効期限、ユーザー認証、貼り付けをより効率的に保存するためのデータベースなどの機能を追加することで、このプロジェクトを拡張できます。

フィードバックがある場合は、以下にコメントを残してください。公開コメントを希望しない場合は、いつでも メール で私に送信できます。

アナウンス

  • 1 年前に YouTube チャンネルを開始しました。このような興味深い内容のビデオ シリーズを作成してほしい場合は、お気軽に 登録 してください。

  • Python コンサルティングも受け付けています。興味深い Python プロジェクトや技術に関するアドバイスが必要な場合は、いつでも メール を送信できます。

  • 最後に、この記事を読んでいただき、私の仕事にご支援いただき、誠にありがとうございます。

この記事が気に入った場合は、コーヒーを買っ てくれる ことで、いつでも私の仕事にご支援いただけます。あなたのサポートは私にとって何よりの喜びです。また、X でこれを共有される場合は、必ず私にタグを付けてください
@muhammad_o7。また、LinkedIn で私をフォローしてください。


🪰訳者注:
Pastebin や github gist などのコードスニペットのサービスは便利で目的も分かりやすく、Flask などの web フレームワークを理解する初歩に作ってみるものとして最適です。

いいなと思ったら応援しよう!