2022-10-13

flask

python

Posted by

applemango

最終更新: 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

サーバーが実行されている必要が有ります

しょうがないな

取得

作成

作成が動かない?

次に問題提起してその次で直すから安心して

だめ?

少し言い訳をさせてもらうと今エラーを解決すると何で出たのか分かりづらいから...

このドキュメントどう?

emoji
emoji
emoji
emoji