LoginSignup
3
5

More than 3 years have passed since last update.

Flask(自分用のメモ)

Posted at

その前に基礎知識

  • ルーティング: ウェブブラウザからのリクエストに合わせて呼び出す処理を切り替える機能
    • URLと処理を紐付ける機能
  • テンプレートエンジン:アプリケーションが保持するデータ、プログラムが処理した結果をHTMLの雛形を組み合わせてウェブページとして表示する機能

 いろいろ

$env:FLASK_APP="app"
flask run
app.py
from flask import Flask

app = Flask(__name__)  # アプリケーションオブジェクトの取得

@app.route('/')  # ルーティング
def hello():
    return "hello world!"

Flask_APP

  • 環境変数

  • FLASK_APP

    • ウェブアプリのモジュール名を示す。
    • 今回は「app」
    • 未設定でapp.py が実行
    • 適当な値を入れたらアカンで。
  • FLASK_ENV

    • FLASKを実行する環境構成を実行
      • production: 本番環境を対象とした構成
        • デバッグモードとリロードが有効になる。
          • デバッグモード:エラーの詳細をトレースできる。
          • リロードモード:スクリプトを編集したら自動でアプリケーションを再起動してくれる仕組み
      • development: 開発環境を対象とした構成
    • 未設定でproduction

 ルーティング

@app.route('/')  # URLのパスに相当

/http://localhost:5000/に相当

URLの一部を変数として使う

@app.route('/rt_variable/<var>')
def fn_variable(var):
    return var

型の制限を掛けられる。

python
@app.route('/rt_variable/') 
@app.route('/rt_variable_i/<int:var>') 整数
@app.route('/rt_variable_f/<float:var>') 浮動小数点数
@app.route('/rt_variable_p/<path:var>') 任意のパス
@app.route('/rt_variable_u/<uuid:var>') 
@app.route('/rt_variable_a/<any(s1,s2,s3):var>') この中のどれか
def fn_variable(var=None):
    print("*****called******")
    ans = str(var)
    return ans

テンプレート

  • テンプレート:htmlなどのウェブページに対応した雛形
    • pythonのコードを入れ込むことで、動的にウェブページを生成できる。
app.py
@app.route('/ex_template/')
@app.route('/ex_template/<t1>')
def fn_template(t1=None):
    return render_template('template_example.html', var=t1) 
//出力するテンプレートとテンプレート内で利用する変数
template
<!doctype html>
<tytle>Template Example</tytle>
{% if var %}
<h1>var: {{var}}</h1>
{% else %}
<h1>var is None</h1>
{% endif %}

{{ }}はpythonの変数や実行結果を出力したいときに使う
{% %}は制御文を使いたいときに使う

Requestオブジェクト

  • httpリクエストのメソッド名、パラメーター、ヘッダ情報を取得できる。
Invoke-RestMethod -Uri "http://localhost:5000/ex_req?u1=abc&u2=def&u1=ghi" -Method POST -Body "f1=ABC
&f2=DEF&f2=GHIAAA"
app.py
@app.route('/ex_req', methods=['GET', 'POST'])
def fn_req():
    print(request.method) //POST
    print(request.path) // /ex_req
    print(request.content_length) //23
    print(request.mimetype) // application/x-www-form-urlencoded

    print(request.args.get('u1')) //abc
    print(request.args['u2']) // def
    print(request.args.getlist('u1')) //['abc', 'ghi']

    print(request.form.get('f1')) // ABC
    print(request.form['f2']) // DEF
    print(request.form.getlist('f1')) //['ABC']

    print(request.headers.getlist('Connection')) //['Keep-Alive']
    print(request.headers['Connection'])  // Keep-Alive
    print(request.headers.get('Connection')) //Keep-Alive

    return 'call fn_req()'

 リダイレクト

@app.route('/ex_redirect')
def fn_redirect():
    return redirect (url_for('fn_rt_variable')) //リダイレクト先の関数

ファイルアップロード

app.py
@app.route('/ex_upload', methods=['GET', 'POST'])
def fn_upload():
    if request.method == 'POST' and 'file' in request.files:
        f = request.files['file'] //ファイルを取得
        f.save('upload_files/' + secure_filename(f.filename)) //保存ディレクトリを指定ファイル名はセキュアなものに直してくれる
        return 'file uploaded'

make responce関数

  • レスポンスの内容を設定できる
    • レスポンスヘッダー
    • httpステータス
app.py
@app.route('/ex_res/<int:var>')
def fn_res(var):
    resp = make_response('call fn_res().'.var) //varをhttpステータスに設定
    resp.headers["ex_res"] = "OK!!" // headerはex_resという名称でOK!!を選択
    return resp 
StatusCode        : 200
StatusDescription : OK
Content           : call fn_res().
RawContent        : HTTP/1.0 200 OK
                    ex_res: OK!!
                    Content-Length: 14
                    Content-Type: text/html; charset=utf-8
                    Date: Wed, 19 Jun 2019 12:10:44 GMT
                    Server: Werkzeug/0.15.4 Python/3.7.3

                    call fn_res().
Forms             : {}
Headers           : {[ex_res, OK!!], [Content-Length, 14], [Content-Type, text/html; charset=utf-8], [Date, Wed, 19
                    Jun 2019 12:10:44 GMT]...} //[ex_res, OK!!]が追加されている。
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : mshtml.HTMLDocumentClass
RawContentLength  : 14

クッキー

app.py
@app.route('ex_cookie')
@app.route('ex_cookie/<var>')
def fn_cookie(var=None):
    if var is None:
        ck = request.cookies.get('ck') //cookieの取得request内のgetメソッドで取得
        return f"ck={ck}"
    resp = make_response('set_cookie')    // レスポンスオブジェクトの生成
    resp.set_cookie('ck', var) //cookieにデータを保存する。 「ck:varって感じ
    return resp

セッション

app.py

app.secret_key = "test"  // セッションの暗号化で使う

@app.route('/ex_session')
def fn_session(var=None):
    if var is None:
        sess = session.get('sess') //セッション取得
        return f"sess = {sess}"

    session["sess"] = ver  //セッションへデータ保存
    return "set settion"

 フラッシュ

  • 一度だけ表示したいメッセージに使う
app.py
app.secret_key = "test"

@app.route('/ex_flash')
@app.route('/ex_flash/<var>')
def fn_flash(var=None):
    if var is None:
        fl = get_flashed_messages() //フラッシュの呼び出しもう一度呼び出すと消える
        return f"fl = {fl}"

    flash(var) //フラッシュの保存
    return "set settion"

ロギング

  • pythonのロギング機能を使うことができる。
    • ロギング:ログ出力のこと。
app.py
@app.route('/ex_logging')
@app.route('/ex_logging/<var>')
def fn_logging(var=None):
    app.logger.info(var)
    app.logger.warning(var)
    app.logger.error(var)
    return "call fn_logging()"
'''




3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5