Flask Tutorial Part 1: introduction to Flask

Tutorial Lists

  1. introduction to Flask
  2. Static files and database setup with Flask
  3. User Authentication and Basic Form in Flask

Trong rất nhiều web framework của Python, Flask được biết đến như là một micro-framework, tức là bản thân Flask không chứ nhiều các thành phần phức tạp khác nhau, nó chỉ gồm các thành phần cơ bản nhất, các thành phần khác sẽ được thêm qua các extension. Theo trang chủ: "Flask is a microframework for Python based on Werkzeug, Jinja 2 and good intentions. And before you ask: It's BSD licensed!"

Điểm mạnh của flask đó chính là sự nhỏ gọn, bạn hoàn toàn có thê tạo lên một trang web nhanh chóng dùng vào việc thử nghiệm cho các ý tưởng chợt lóe lên trong đầu, ta sẽ thấy sự đơn giản của flask ngay sau đây qua việc tạo một trang web giới thiệu sách đơn giản.

Đầu tiên là cài đặt, các bước cài đặt thông thường như với bất cứ một package python nào:

  • Tạo virtual enviroment:

virtualenv venv

  • Active virtual enviroment:

Ta sẽ tạo một file là requirements.txt chứa tất cả các package cần dùng. Hiện giờ ta chỉ cần package flask nên nội dung file requirements.txt như sau:


flask==0.10.1

Cài đặt các package:


pip install -r requirements.txt

ta tạo một thư mục đóng vai trò là package cho trang:


mkdir app
cd app
touch app/__init__.py

File init.py sẽ có nhiệm vụ import và thiết lập một số biến cho app:


from flask import Flask

app = Flask(__name__)

đơn giản là ta tạo một biến Flask application. Thêm một file chạy cho server: run.py


# !venv/bin/python

from app import app

if __name__ == '__main__':
    app.run(host='0.0.0.0', debug = True)

Ta import app được tạo trong package và run web server với tùy chọn debug = True. Với mode debug thì khi có thay đổi trên file controller hoặc server thì server sẽ tự động restart để cập nhaaotj các thay đổi đó. Run thử:


(venv)[[email protected] ~/flask-intro (master)]$ ./run.py
 * Running on http://0.0.0.0:5000/
 * Restarting with reloader

Vậy là server đã chạy, nhưng vấn đề là ta vẫn chưa có router cho web. Hãy tạo một route đơn giản như sau ở file: app/views.py


from app import app
from flask import render_template

@app.route('/', methods=['GET', 'POST'])
@app.route('/index', methods=['GET', 'POST'])
def index():
    return render_template(
        'index.html',
    )

Ta sẽ nói qua về các thành phần của file view này:

  • Decorator app.route đóng vai trò là router cho app. Như trên thì các request có URI là http://localhost:5000/ hoặc http://localhost:5000/index sẽ được xử lý bởi function index

  • function index đơn giản render ra nội dung của teamplate index.html. Nếu truy cập vào địa chỉ http://localhost:5000, ta thấy báo lỗi jinja2.exceptions.TemplateNotFound do ta chưa tạo file template.

  • Ta có thể quy định các method mà ta muốn xử lý có route này bằng keyword argument: methods. Nếu method mà client gửi lên không phù hợp, server sẽ trả về 405.

    Vậy ta cần tạo file template. File template sẽ mặc định nằm trong thư mục templates. Ta tạp đơn giản như sau:


mkdir templates
cd templates
touch index.html

và nội dung file index.html:


Hello World !

và import file view vào trong file init.py


from flask import Flask

app = Flask(__name__)

from app import views

Truy cập đến http://localhost:5000/ hoặc http://localhost:5000/index ta sẽ được kết quả như mong muốn.

Bạn thấy đó, trong vòng chưa đến 15 phút, ta đã có một web server và một controller đơn giản, ko chút phần thừa 😄

Hãy tiến thêm một bước phức tạp hơn bằng cách truyền thêm tham số từ URL vào: truy cập đến http://localhost:5000/hello/vigo sẽ hiện ra câu chào: Hello vigo !. Ta tạo function mới để xử lý như sau:


# views.py

@app.route('/hello', methods=['GET', 'POST'])
@app.route('/hello/<user>', methods=['GET', 'POST'])
def hello(user = "guest"):
    return render_template(
        'hello.html',
        user=user,
    )

ta sử dụng regular expression để bắt tên người dùng truyền vào rồi chuyển cho hàm bằng keyword argument user, nếu ko có thì user mặc định là guest rồi truyền sang biến user ở template


# hello.html

Hello {{ user }}!

Flask sử dụng Jinja 2 để render template. Cú pháp {{ }} sẽ render biến bên trong ra. Khá dễ dàng phải không, sau này ta sẽ sử dụng nhiều cấu trúc phức tạp và cả filter nữa.

Bài tiếp: Static files and database setup with Flask

Reference:

https://github.com/vigov5/flask-intro

http://flask.pocoo.org/