2022-10-13
Posted by
最終更新: 2023-03-05
さて考えましょう
info
僕は普段作りながら考えたりfrontendを書きながら考えますがこれだとtutorialにならないので普段から考えながら作り、frontendとあわなかったり書き直しになる事が無い世界線の話です
ですが考えながら作っても最初に設計してもあまり変わりません
まず短縮urlのアプリに必要な物は何でしょう
大雑把に考えると
1. https://example.com/<id>(<id>は例えば"g48Wa"などが入る) 等のurlにアクセスすると設定したwebsiteに飛ばされること
2. httos://example.com にアクセスすると新しくurlを作れる事
の二つです、それを実現するにはどのような機能がbackendには必要でしょうか?
まず<id>を渡された時そのidに紐づけられたurlを返す必要が有ります
次にurlを渡された時新しく作ったidを渡す必要が有ります
そう考えていくとdatabaseが必要になってきます
dbはurlとidを保存するだけのシンプルな作りで良さそうですね
早速作っていきましょう
取り合えず一度app.pyのすべてのコードを消し上記の機能を追加する為の準備をしましょう
一度app.pyのすべてを消して以下のコードを張り付けてください
あまり深く考えずテンプレート的な物だと思ってください
import os #pathの取得などに使う
import json #何かと使う
from flask import Flask # flaskを使うのに絶対必要
from flask import jsonify # jsonを送るのに使う
from flask import request # queryなどを取得するのに使う
from flask_cors import CORS, cross_origin#crosの設定
from flask_sqlalchemy import SQLAlchemy#databaseを使うために必要
basedir = os.path.abspath(os.path.dirname(__file__)) #実行folderのpathを取得、何かと使う
app = Flask(__name__, instance_relative_config=True) # アプリの作成
app.config.from_mapping( #アプリの設定
None #今は何も無い
)
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=5000) # アプリの実行
これはまだ何もしてくれません、設定以外書いてないですからね
ここから機能を追加していく必要が有ります
とりあえず /get/<id>
にアクセスすると {"url":"https://example.com"}
を返す関数を書きましょう
確かjsonを返す関数は jsonify()
でしたよね
info
後ほどdbからidを元にurlを取得しますが先にダミーでapiを作ってfrontendから呼び出せることを確認しfrontendが完成したらちゃんとしたのを作ります
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
+
17
+
18
19
20
import os #pathの取得などに使う
import json #何かと使う
from flask import Flask # flaskを使うのに絶対必要
from flask import jsonify # jsonを送るのに使う
from flask import request # queryなどを取得するのに使う
from flask_cors import CORS, cross_origin#crosの設定
from flask_sqlalchemy import SQLAlchemy#databaseを使うために必要
basedir = os.path.abspath(os.path.dirname(__file__)) #実行folderのpathを取得、何かと使う
app = Flask(__name__, instance_relative_config=True) # アプリの作成
app.config.from_mapping( #アプリの設定
None #今は何も無い
)
def get_url(id):
return jsonify({"url":"https://example.com"})
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=5000) # アプリの実行
あとはデコレーターを付けるだけですね
デコレーターは確かこう書くんでしたよね?
ここでクイズ : get_urlを/get/<id>にアクセスした時実行するようにするにはどの様なデコレーターを付ければいいか
さあここまで出来たらもうurlを新しく作る関数のダミーもその下に作ってしまいましょう
def create_url():
return jsonify({"url":"https://exmaple.com"})
ここまででこのような感じになっているはずです
import os #pathの取得などに使う
import json #何かと使う
from flask import Flask # flaskを使うのに絶対必要
from flask import jsonify # jsonを送るのに使う
from flask import request # queryなどを取得するのに使う
from flask_cors import CORS, cross_origin#corsの設定
from flask_sqlalchemy import SQLAlchemy#databaseを使うために必要
basedir = os.path.abspath(os.path.dirname(__file__)) #実行folderのpathを取得、何かと使う
app = Flask(__name__, instance_relative_config=True) # アプリの作成
app.config.from_mapping( #アプリの設定
None #今は何も無い
)
@app.route("/get/<id>")
def get_url(id):
return jsonify({"url":"https://example.com"})
@app.route("/create")
def create_url():
return jsonify({"url":"https://exmaple.com"})
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=5000) # アプリの実行
ここまで書けたらfrontendを書き始めましょう
frontendを書き始める前にちゃんと動くかテストしたい?
warning
サーバーが実行されている必要が有ります
しょうがないな
取得
作成
作成が動かない?
次に問題提起してその次で直すから安心して
だめ?
少し言い訳をさせてもらうと今エラーを解決すると何で出たのか分かりづらいから...
このドキュメントどう?