Flask - Quick Start

Notes

Flask is actually called a “microframework”, meaning the creators of Flask aims to keep the core simple and lightweight but easily extensible.

https://anna-carey.medium.com/learning-flask-after-ruby-on-rails-e8c0708ffd40

Things

a microframework for Python based on Werkzeug, Jinja 2 and good intentions. Flask is intended for getting started very quickly and was developed with best intentions in mind.

  1. Patterns for Flask
  2. Flask API
  3. Jinja
  4. Werkzeug

Flask real world examples

Installation

Dependencies

  1. Werkzeug Python Interface between Applications and Servers
  2. Jinja: Template language renders the pages
  3. MarkupSafe: comes with Jinja. Escapes untrusted input when render template.
  4. ItsDangerous: Secure signs data. Used to protect Flask’s session cookies
  5. Click: Writing command line applications. Provide flask command.

Optional:

  • Blinker - Provides support for Signals
  • python-dotenv
  • Watchdog: Reloader for development server.

Run

flask --app hello run --debug

Routing

Variable Rules

  1. string Any text without /
  2. int positive integers
  3. float positive floating point
  4. path like string but also accepts slashes
  5. uuid Accept UUID strings

File uploads

  • Use request.files
  • Use werkzeug.utils to call secure_filename

Cookies

Redirects and Errors

  • redirect(url_for('login'))
  • abort(401) if errors

Response

https://flask.palletsprojects.com/en/2.2.x/quickstart/#about-responses

  • Flask sẽ dựa vào response object để đoán xem nên trả về kiểu dữ liệu gì. String/ Iterator/ Dict, …
  • Muốn hold lại response để chỉnh sửa, thử dùng make_response()
from flask import make_response
 
@app.errorhandler(404)
def not_found(error):
    resp = make_response(render_template('error.html'), 404)
    resp.headers['X-Something'] = 'A value'
    return resp

APIs with JSON

  • Chỉ cần response trả về là dict hoặc list thì Flask sẽ tự động convert sang JSON response.

Session

  • Lưu trữ thông tin vào session, trao đổi với client qua cookies cryptographically. - User có thể đọc thông tin từ cookies nhưng không thể modify nó, trừ khi biết chính xác secret key được sử dụng cho chữ ký. (Cái này tương đương với Secret key trong Rails)

  • Generate good secret keys bằng lệnh:

Flask.secret_key
 
# python -c 'import secrets; print(secrets.token_hex())'
# '192b9bdd22ab9ed4d12e236c78afcb9a393ec15f71bbf5dc987d54727823bcbf'

Message Flashing

  • flash()
  • get_flashed_messages()

https://flask.palletsprojects.com/en/2.2.x/patterns/flashing/

Logging

app.logger.debug('A value for debugging')
app.logger.warning('A warning occurred (%d apples)', 42)
app.logger.error('An error occurred')

https://flask.palletsprojects.com/en/2.2.x/errorhandling/

Deploy

https://flask.palletsprojects.com/en/2.2.x/deploying/

Key takeaways

  1. Flask cũng có escapes khi render HTML. Cần tìm hiểu về strong parameters?
  2. Params được put vào trong views functions
  3. URL Building (giống URL helper trong Rails) bên này dùng url_for() từ thằng Flask luôn.
  4. Flask (mức basic) dồn hết resource về 1 function. Define routes, methods, code controller, render views, … trong hết 1 file???
  5. Để tránh việc render file views trong file controller luôn + escape automaticaly thì bên Flask sử dụng Jinja2 để hỗ trợ code render, sử dụng qua hàm render_template . Trong đó có thể access các hàm helper: config, request, session, g, url_for(), get_flashed_messages()
  6. Get information từ request object.
  7. searchword = request.args.get('key', '') to get args key

Questions

  1. Tại sao route và functions name không map nhau mà nó vẫn vào được? Tính theo block chăng?
  2. Strong parameters trong Flask?