Pythonを使ってミニマルにAPIの開発をするなら、Django + REST Framework + GAE
がとても便利です。この構成で始めるときに役立つ資料をまとめました。
Pythonもこれからという場合は、以下も参考にしてください。
Django
公式ドキュメント
Djangoは公式ドキュメントが非常に充実しているので、迷ったらまずは公式ドキュメントを読むのがおすすめです。
場合によっては内部のコードを読んだほうが理解が早い場合もあります。認証モデル周りは、書き方の参考にもなります。
TIPS
Djangoプロジェクト構造のカスタマイズ(分割と構造化) - Qiita
Django + REST Framework のチュートリアル
REST Frameworkで何が便利になるのかがよくわかります。
Django REST Frameworkを使って爆速でAPIを実装する - Qiita
REST Framework
公式ドキュメント
REST Frameworkも公式ドキュメントが充実しているので、迷ったらまずは見ましょう。
こちらもコードを読むと書き方の参考になります。
TIPS
Django REST framework 知っておくと少し役に立つ 小技まとめ - Qiita
Djangoのモデル
Djangoは他のフレームワークに比べてモデル周りの規約の理解が必要です。
Model
Djangoのモデルにcreated_at,updated_atを実装する
Manager
DjangoのCustom ManagerとCustom QuerySetについて - Qiita
Query Set
DjangoのQuerySetのfilterメソッドの使い方まとめ | CodeLab
Migrations
python manage.py migrate APP_NAME zero
MySql
Djangoの推奨はmysqlclientです。
Databases | Django documentation | Django
ただ、「Python Mysql」と検索してたどり着く記事はPyMySqlが使われていたりします。
PyMySQL
[Python+MySQL] RuntimeError: cryptography is required - ITips
ここで注意しなければならないのが、現時点でPyMySqlがDjango2.2に対応できていません。
そのため、PyMySqlを入れた場合は、mysqlclientに変更する必要があります。
PyMySqlからmysqlclientへの変更
認証
認証周りはDjangoが予め用意しているフレームワークもあったりで多少ややこしくなっています。とくにFirebase Authenticationや独自のモデルを使いたい場合などはカスタマイズが必要になります。
公式ドキュメント
Django の認証方法のカスタマイズ - 公式ドキュメント
参考記事
ジャンゴ(django)のカスタムユーザーモデル(Custom User Model)
Django + REST Framework + Firebase Authentication
Firebase Authenticationを使う場合は、クライアントでToken取得 → サーバーで検証して一致するUserの取得
という実装が必要になります。
以下記事が具体的な手順の参考になります。
Django REST Frameworkでユーザ認証周りのAPIを作る - Qiita
Firebase Integration with Django REST - Stack Overflow
サードパーティーライブラリ
Django + REST Framework + Firebase Authenticationで動作するサードパーティーのライブラリです。Token認証周りを任せられるので便利です。
garyburgmann/drf-firebase-auth
Firebase Authenticationユーザーの各プロパティ取得方法
firebase/firebase-admin-python
GAE for Django
GAEでDjangoを動かすには公式ドキュメントを参考に、必要な設定をプロジェクトに追加します。
Django スタートガイド | Python | Google Cloud
GoogleCloudPlatform/python-docs-samples
requirements.txtやapp.yamlに必要な記述がなかったりすると下記エラーが出てハマるので、注意が必要です。
Traceback (most recent call last): File "/env/lib/python3.7/site-packages/gunicorn/arbiter.py", line 583, in spawn_worker worker.init_process() File "/env/lib/python3.7/site-packages/gunicorn/workers/gthread.py", line 104, in init_process super(ThreadWorker, self).init_process() File "/env/lib/python3.7/site-packages/gunicorn/workers/base.py", line 129, in init_process self.load_wsgi() File "/env/lib/python3.7/site-packages/gunicorn/workers/base.py", line 138, in load_wsgi self.wsgi = self.app.wsgi() File "/env/lib/python3.7/site-packages/gunicorn/app/base.py", line 67, in wsgi self.callable = self.load() File "/env/lib/python3.7/site-packages/gunicorn/app/wsgiapp.py", line 52, in load return self.load_wsgiapp() File "/env/lib/python3.7/site-packages/gunicorn/app/wsgiapp.py", line 41, in load_wsgiapp return util.import_app(self.app_uri) File "/env/lib/python3.7/site-packages/gunicorn/util.py", line 350, in import_app __import__(module) ModuleNotFoundError: No module named 'main'
GAE standard環境にて Python3 + Djangoでサーバを構築する - Qiita
Cloud Storage
Firebase Authenticationから取得したプロフィール画像などを保存するのにCloud Storageを使います。
Google Cloud Storage - django-storages 1.7.1 documentation
URLから画像を取得
Firebase Authenticationからは画像URLが提供されるので、それをダウンロードした上でCloud Storageに入れる必要があります。URLからの画像保存はメモリに展開後、DjangoStorageに渡します。
Django pattern: download to FileField
python3でurlretrieveの返り値が変わっおり、下記のコードだとエラーになります。古い記事のときは注意が必要です。↑の返り値が正しいです。
Django save image from url and connect with ImageField
Visual Studio Code
VSCodeを使ってて気になった部分を参考程度に載せておきます。
Djangoのmodel参照時のpylintの警告を出さないようにする - Qiita