Cicada000‘s Xlog

Cicada000‘s Xlog

twitter
telegram
bilibili
github

Vercel上でデプロイされたAPIをPythonで作成する

表紙

まず最初に、ここを訪れて私が何をしているか見てください。ここを訪れて JSON データを確認し、ここを訪れてプロジェクトのソースコードを確認してください。

背景#

lz233一言を見て、とても興味を持ちました。自分でも作りたいと思いましたが、いくつかの新しい機能(例:GET パラメータを使用して特定のタイプの文を取得するなど)を追加したかったので、次の 2 つの条件を満たしたかったです:1. サーバーにデプロイしないこと。2. 自分で文と機能を追加および削除できること。しかし、調査した結果、私が求めている答えは見つかりませんでしたので、自分で作ることにしました。

作成を始める前に、Vercel がServerless Functionsという機能を提供していることを知っていましたが、Go 言語のプロジェクトのみが使用できると思っていました。しかし、ドキュメントを読んでみると、Python もサポートされていることがわかりました。これは本当に偶然でしたので、さっそく作り始めました!

Python のサポート

過程#

実際には、基本的なチュートリアルはインターネット上や公式のドキュメントで十分に説明されています。リポジトリの /api ディレクトリに新しい index.py ファイルを作成し、次のコードを書きます:

from http.server import BaseHTTPRequestHandler
from cowpy import cow
class handler(BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.send_header('Content-type','text/plain')
        self.end_headers()
        message = cow.Cowacter().milk('Hello from Python from a Serverless Function!')
        self.wfile.write(message.encode())
        return

また、同じディレクトリに requirements.txt ファイルを作成し、Vercel に必要なモジュールとバージョンを指定します(バージョンを指定しなくても構いません):

cowpy==1.0.3

その後、デプロイするだけで、公式の例が正常に表示されることがわかります:

 _______________________________________________ 
< Hello from Python from a Serverless Function! >
 -----------------------------------------------
     \   ^__^
      \  (oo)\_______
         (__)\       )\/\
           ||----w |
           ||     ||

これが私が Vercel の Serverless Functions に初めて触れた経験です。さらに調査を進めると、Flask フレームワークを使用して構築することもできることに驚きました!これを知った後、私はもっと嬉しくなりました。なぜなら、「Flask フレームワークを使用して情報システムを構築する」というのは情報技術の授業の必修科目の一つだからです。授業中に魚釣りをしていることが多いですが、少しはわかるので、以下はJohnson のメモからの例です:

index.py:

from flask import Flask, request
import requests
app = Flask(__name__)
@app.route('/')
def hello_world():
    return 'Hello from Flask Github!'

requirements.txt:

Flask==1.1.2
Werkzeug==1.0.0
uvicorn
requests
pydantic

その後、次のデータが返されることがわかります:

Hello from Flask Github!

これらの 2 つの例があるので、詳細な詳細を理解し、私自身の一言 APIを作成しました。具体的な使用方法については、Github プロジェクトの README を参照してください。

エピソード#

プログラムを書く際には、上記の一文で済ませることはそんなに簡単ではありません。この間、私は多くの問題に直面しました。この小さなプロジェクトには 2 日間もの時間がかかりました。以下に、私が印象に残ったいくつかのポイントを紹介します。

1. モジュールのインポート#

ランダムな JSON データを取得し、JSON データを処理するために、index.py に次のコードを書きました:

import requests , json , random

一見問題はなさそうですが、requirements.txt には次のように記述する必要があります:

requests
pyjson
pyrandom

そうです、一部のモジュール名はファイル名と異なるため、インポートする際に注意が必要です。

2. テキストのエンコーディング#

変数の型の統一は、私が強調する必要がある低レベルの問題だと信じています(私自身も多くのミスを犯しました)。私が強調したいのは、テキストのエンコーディングの問題です。変数内の文字は、各関数を通過する際にエンコーディングの問題によってエラーが発生する可能性があります(特に中国語は難しいです)。私のプロジェクトを例に挙げると、出力したい結果は次のようになります:

{
    "text": "逸一時,誤一世,逸久逸久罷矣齡。",
    "by": "田所浩二",
    "from": "《真夏の夜の淫夢》",
    "time": "1919.8.10"
}

しかし、最初に出力される結果は次のようになります:

{
    "text": "\u9038\u4e00\u6642\uff0c\u8aa4\u4e00\u4e16\uff0c\u9038\u4e45\u9038\u4e45\u7f62\u77e3\u9f61\u3002",
    "by": "\u7530\u6240\u6d69\u4e8c",
    "from": "\u300a\u771f\u590f\u306e\u591c\u306e\u6deb\u68a6\u300b",
    "time": "1919.8.10"
}

試行錯誤とトラブルシューティングの後、json.dumps 関数を使用して出力する際に、デフォルトのエンコーディングが Unicode であり、私が望むのは UTF-8 で出力することがわかりました。そのために、ensure_ascii=Falseを追加しました。

3. ログを確認する#

この経験で私に残ったもう一つの印象的なポイントは、出力されたログをよく見ることです。これは、エラーのトラブルシューティングや解決に非常に役立ちます(私の経験が不足しているせいもありますが、これは初めての試みです)。

ログ

結論#

これは私が Python を使用して最初のまともなプロジェクトを作成したものであり、多くの経験を得ることができ、教科書では教えてくれない知識を学ぶことができました。それがこの記事を急いで書き上げた理由でもあります。これからもこのような研究熱心な精神を持ち続け、困難に立ち向かいたいと思います。

最後に、最初は実際にはFlask フレームワークを使用していなかったことを言わないし、Safari ブラウザでアクセスすると文字化けの問題がまだ存在することも言わない...

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。