🔭

renderなるものを使ってみた

2023/05/11に公開

色々ハマったので、メモしておく

Herokuが有料化されたことになり、代替手段として、renderなるものが話題になっていて、デプロイするのをやってみました。しかし、デプロイに失敗して原因を調べてみたとこと、今回だとPythonならではのルールがあったみたいです。

ソースコード

最初は、main.pyでやってましたが、エラーの原因になるそうで、app.pyに変更しました。

app.py
from flask import Flask, request, json, jsonify

app = Flask(__name__)
app.config['JSON_AS_ASCII'] = False
tasks = {
    '1': 'スーパーで買い物をする',
    '2': 'Netflixを見る'
}


@app.route('/tasks', methods=['GET'])
def list_all_tasks():
    json = {
        'message': tasks
    }
    return jsonify(json)


@app.route('/tasks/<int:taskid>', methods=['GET'])
def show_task(taskid):
    taskid = str(taskid)
    json = {
        'message': tasks[taskid]
    }
    return jsonify(json)


@app.route('/tasks/<int:taskid>', methods=['DELETE'])
def delete_task(taskid):
    taskid = str(taskid)
    if taskid in tasks:
        del tasks[taskid]
        msg = 'Task {} deleted'.format(taskid)
    else:
        msg = '{0} is not in tasks.'.format(taskid)
    json = {
        'message': msg
    }
    return jsonify(json)


@app.route('/tasks', methods=['POST'])
def create_task():
    taskid = str(int(max(tasks.keys())) + 1)
    posted = request.get_json()
    if 'task' in posted:
        tasks[taskid] = posted['task']
        msg = 'New task created'
    else:
        msg = 'No task created'
    json = {
        'message': msg
    }
    return jsonify(json)


@app.route('/tasks/<int:taskid>', methods=['PUT'])
def update_task(taskid):
    taskid = str(taskid)
    posted = request.get_json()
    if 'task' in posted and taskid in tasks:
        tasks[taskid] = posted['task']
        msg = 'Task {} updated'.format(taskid)
    else:
        msg = 'No task updated'
    json = {
        'message': msg
    }
    return jsonify(json)


if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=5001)

render側でパッケージをインストールする設定

requirements.txtに、Pythonで使用するパッケージ名を書いておく必要があります。Gunicornというパッケージは、デフォルトでapp.pyを探しにいくので、main.pyでコードをデプロイすると失敗する原因になっていた。

Flask
Gunicorn

失敗したときのログ

修正をすると、エンドポイントにアクセスすると、JSONのデータが表示された。こちらのURLをポストマンで、GETすると、データを取得できました🥳

まとめ

今回、学習の参考になったサイトのリンクを載せておきます。もしずっと起動しているサーバーが欲しいなら、他のサービスを検討したほうが良いと思われます🤔

https://qiita.com/matsutogen/items/f29ad5c244fdca24e4cf
https://medium.com/nyle-engineering-blog/flaskでrest-apiを作ってみる-fad8ae1fde5c
https://zenn.dev/tatehito/scraps/f7929e4a980d1c

Jboy王国メディア

Discussion