lOMoARcPSD| 58736390
HƯỚNG DẪN LẬP TRÌNH PYTHON VỚI FLASK
Flask là loại framework web phổ biến được viết bằng trình lập ngôn ngữ Python. Công ngh
thường được sử dụng để xây dựng trang web từ những ứng dụng đơn giản đến những hệ thống
phức tạp hơn.
Flask được thiết kế để hoạt động và mở rộng một cách, đồng thời nó cũng cung cấp các công
cụ và thư viện cần thiết để phát triển ứng dụng web hiệu quả. Flask cũng có cộng đồng sáng
tạo và hỗ trợ mạnh mẽ từ cộng đồng Python.
Đây bài viết hướng dẫn bản việc sử dụng Flask từ việc tạo môi trường hoạt động cho
Flask tới việc khởi tạo Project, cách thực thi. Kèm theo đó là một số bài tập.
1. Tạo môi trường hoạt động cho Flask
Trong phần này, chúng ta sẽ xây dựng cấu trúc dự án của mình. Chúng ta thể đặt tên cho
thư mục gốc của dự án theo bất kỳ cách nào mình muốn.
1.1 Tạo môi trường ảo với venv.
Bước 1: Vào thư mục làm việc
Bước 2: Dùng câu lệnh sau để tạo môi trường ảo và kích hoạt chúng
Bước 2.1 Với những hệ điều hành Linux/MacOS thực thi theo cấu trúc lệnh sau
No.
Lệnh thực hiện trong CMD
Ý nghĩa
#1
python -m venv <tên môi trường>
tạo môi trường ảo với tên
gọi <tên môi trường>
#2
source <tên môi trường>/bin/activate
Kích hoạt môi trường ảo
Ví dụ: kích hoạt môi trường ảo trên MacOS venv với tên gọi flask_venv
2.2 Với hệ điều hành Windows thực thi theo cấu trúc lệnh sau
lOMoARcPSD| 58736390
No.
Lệnh thực hiện trong CMD
Ý nghĩa
#1
python -m venv <tên môi trường>
tạo môi trường ảo với tên gọi
<tên môi trường>
#2
.\<tên môi trường\Script\activate
Kích hoạt môi trường ảo
Ví dụ: kích hoạt môi trường ảo venv trên Windows với tên gọi practice_flask
1.2 Thêm phụ thuộc / dependencies
phần này, chúng ta cần cài đặt Flask với pip sau khi thực hiện xong Mục 1.1 bằng cách thực
hiện lệnh sau:
(practice_flask) $ python -m pip install Flask
Bên dưới là ví dụ về cách cài đặt Flask trên Windows và Linux/MacOS
lOMoARcPSD| 58736390
2. Khởi tạo Project với Flask
2.1 Tạo app
Dự án Flask thể bản như một tập tin Python, thường được đặt tên app.py. Hãy thử
bằng cách tạo app.py trong practice_flask/ và thêm nội dung sau:
from flask import Flask
app = Flask(__name__)
@app.route("/") def
home():
return "Welcome to Flask!"
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8000, debug=True)
lOMoARcPSD| 58736390
Diễn giải các dòng lệnh
Ở dòng #1: chúng ta import module Flask
Ở dòng #3: khởi tạo một thể hiện của Flask với tên gọi __name__
Ở dòng #5: Chúng ta định tuyến “/” với hàm home.
dòng #10: Chúng ta cho thực thi Flask với host 0.0.0.0 port là 8000 chế
độ debug
2.2 Thực thi app
Để chạy ứng dụng Flask chúng ta vào CMD/Command Promt thực thi lệnh sau:
python app.py
Mở trình duyệt và truy cập các liên kết bên trên.
lOMoARcPSD| 58736390
Hoặc truy cập trên Command promt với curl (tự tìm hiểu cách cài đặt và sử dụng CURL)
3. Các dạng phương thức HTTP trên Flask route
Mục 2 chúng ta đã thực hành được cách tạo 1 project thực thi “hello world” đơn giản.
Tuy nhiên, để thực hiện các chương trình phức tạp hơn như truyền tham số, chúng ta cần nhiều
kiến thức hơn về HTTP method. Phần này sẽ trình bày chi tiết hơn.
Phương thức HTTP các hành động có thể được thực hiện trên i nguyên web. Chúng chỉ
định loại hoạt động máy khách muốn thực hiện trên tài nguyên được xác định bởi URL.
Các phương thức HTTP được sử dụng phổ biến nhất là:
GET Lấy thông tin về tài nguyên từ máy chủ. được sử dụng để yêu cầu dữ liệu
từ máy chủ và không sửa đổi tài nguyên.
lOMoARcPSD| 58736390
POST Gửi dữ liệu để được xử bởi tài nguyên được xác định bởi URL. được
sử dụng để gửi dữ liệu đến máy chủ, chẳng hạn như gửi biểu mẫu hoặc tạo tài nguyên mới.
PUTCập nhật tài nguyên hiện có với dữ liệu mới. được sử dụng để cập nhật dữ
liệu của tài nguyên hiện có trên máy chủ.
DELETEXóa tài nguyên được xác định bởi URL. Nó được sử dụng để yêu cầu máy
chủ xóa tài nguyên.
PATCH Cập nhật một phần tài nguyên hiện bằng dữ liệu mới. tương tự như
PUT nhưng chỉ cập nhật một phần tài nguyên thay vì thay thế toàn bộ tài nguyên.
HEAD Chỉ truy xuất các tiêu đề của phản hồi không nội dung phản hồi.
tương tự như GET nhưng không trả về nội dung thực tế của tài nguyên.
OPTIONS – Truy xuất thông tin về các tùy chọn liên lạc sẵn cho một tài nguyên.
Nó được sử dụng để yêu cầu thông tin về các tùy chọn liên lạc được máy chủ hỗ trợ cho một
tài nguyên cụ thể.
4. Ví dụ về phương thức đăng nhập trên Flask
4.1 Source code Đăng nhập với Flask
Client
R
equest
v
i
U
rl
-
Method
Flask
Project
X
route
v
i
URL
tương
ng
/
d
ef
hom
e
()
/
login
def
l
ogin
()
def
fn_
name
()
Response
/
url
lOMoARcPSD| 58736390
App.py
from flask import Flask, render_template, request, redirect, session
app = Flask(__name__)
# Set a secret key for encrypting session data app.secret_key
= 'my_secret_key'
# dictionary to store user and password users
= {
'kunal': '1234',
'user2': 'password2'
}
# To render a login form
@app.route('/') def
view_form():
return render_template('login.html')
# For handling get request form we can get
# the form inputs value by using args attribute.
# this values after submitting you will see in the urls.
# e.g http://127.0.0.1:5000/handle_get?username=kunal&password=1234 #
this exploits our credentials so that's
# why developers prefer POST request.
@app.route('/handle_get', methods=['GET']) def
handle_get():
if request.method == 'GET': username =
request.args['username'] password =
request.args['password'] print(username, password)
if username in users and users[username] == password:
return '<h1>Welcome!!!</h1>' else:
return '<h1>invalid credentials!</h1>'
else:
return render_template('login.html')
# For handling post request form we can get the form
# inputs value by using POST attribute.
# this values after submitting you will never see in the urls.
@app.route('/handle_post', methods=['POST']) def
handle_post():
if request.method == 'POST':
username = request.form['username'] password
= request.form['password'] print(username, password)
if username in users and users[username] == password:
return '<h1>Welcome!!!</h1>'
else:
return '<h1>invalid credentials!</h1>'
else:
lOMoARcPSD| 58736390
return render_template('login.html')
if __name__ ==
'__main__': app.run()
login.html
<!-- templates/login.html-->
<html>
<head>
<title>Handling of http get and post request</title>
<style>
div {
width: 400px;
border: 1px solid green;
padding: 10px; margin-bottom:
5px;
}
</style>
</head>
<body>
<div>
<!-- url_for will route the forms request to
appropriate function that user made to handle it.-->
<!--we will Retrieve submitted values of inputs on
the backend side using 'name' field of form.-->
<h1>Handle GET Request</h1>
<form method="GET"
action="{{ url_for('handle_get') }}">
<input type="text"
name="username"
placeholder="Username">
<input type="password"
name="password"
placeholder="Password">
<button type="submit">submit</button>
</form>
</div>
<div>
<h1>Handle POST Request</h1>
<form method="POST"
action="{{ url_for('handle_post') }}">
<input type="text"
name="username"
placeholder="Username">
<input type="password"
name="password"
placeholder="Password">
<button type="submit">submit</button>
</form>
lOMoARcPSD| 58736390
</div>
</body>
</html>
4.2 Phân tích
lOMoARcPSD| 58736390
a) Import
from flask import Flask, render_template, request, redirect, session
Câu lệnh này giúp import các module Flask, render_template, request, redirect, session
Module Flask: Như đã đề cập ở phần mở đầu
render_template: giúp tạo ra một phiên bản html để phản hồi với Client trong một số
trường hợp cần hiển thị thông tin cho người dùng dạng web. (Xem thêm từ tập tin
templating.py trong Flask)
request: Đây một m hỗ trợ trong Flask đthể kiểm tra các thông tin từ Client
gửi đến. (Xem thêm từ tập tin globals.py trong Flask)
redirect: Đây là một helper trong Flask (Xem thêm từ tập tin helpers.py trong Flask)
session: tương tự như request (Xem thêm từ tập tin globals.py trong Flask) b) Khởi
tạo
app = Flask(__name__)
# Set a secret key for encrypting session data app.secret_key =
'my_secret_key'
# dictionary to store user and password users = {
'kunal': '1234',
'user2': 'password2' }
Tạo app, thêm khoá mật với app.secret_key. Giả lập sở dữ liệu với từ điển users. c)
Route /
# To render a login form @app.route('/')
def view_form(): return
render_template('login.html')
Trả về mã render_template của login.html khi Client gọi route “/”
d) Route /handle_get với methods GET
lOMoARcPSD| 58736390
@app.route('/handle_get', methods=['GET']) def
handle_get():
if request.method == 'GET': username =
request.args['username'] password =
request.args['password'] print(username, password)
if username in users and users[username] == password:
return '<h1>Welcome!!!</h1>'
else: return '<h1>invalid
credentials!</h1>' else: return
render_template('login.html')
Trả về render_template của login.html khi Client gọi route “/handle_get”, phương thức gọi
là GET. Trong đó, việc xử lý như sau.
Kiểm tra thông tin method,
Nếu là GET thì lấy thông tin username, passowrd mà Client gửi đến thông qua request.args
Kiểm tra username và password có trùng khớp với CSDL hay không.
Nếu khớp thì trả về html là <h1>Welcome!!!</h1>
Ngược lại thì trả về <h1>Invalid Credentials!!!</h1>
Nếu không phải là GET thì
Trả về render_template(“login.html”)
e) Route /handle_post với methods POST
@app.route('/handle_post', methods=['POST'])
def handle_post(): if request.method ==
'POST':
username = request.form['username'] password
= request.form['password'] print(username, password)
if username in users and users[username] == password:
return '<h1>Welcome!!!</h1>'
else:
return '<h1>invalid credentials!</h1>'
else:
return render_template('login.html')
Tương tự như mục d. Chỉ khác là chúng ta chuyển sang method là POST
f) Gọi hàm main
if __name__ == '__main__':
app.run()
4.3 Chạy ví dụ
lOMoARcPSD| 58736390
4.3.1 Truy cập trang /
Thực thi app.py trên Server Gọi tới http://127.0.0.1:5000. Flask trả về login.html. Nếu dùng
trình duyệt sẽ hiển thị như bên dưới.
4.3.1 Đăng nhập với route /handle_get
lOMoARcPSD| 58736390
Thực thi app.py trên Server và Gọi tới
http://127.0.0.1:5000/handle_get?username=kunal&password=1234. Flask trả về
<h1>Welcome!!!</h1>. Nếu dùng trình duyệt sẽ hiển thị như bên dưới.
4.3.2 Đăng nhập với route /handle_post
Trong trường hợp sai mật khẩu. Flask sẽ trả về Form đăng nhập theo mẫu login.html
4.3.3 Đăng nhập với route /handle_post
Tương tự như handle_get. Chỉ khác cách truyền nhận dữ liệu từ Client thông qua method
là POST. Bên dưới là ví dụ khi gọi handle_post thông qua CURL post.
lOMoARcPSD| 58736390
Nếu dùng trình duyệt, cần nhập đúng username và password vào ô nhập thông tin.
5. Bài tập
lOMoARcPSD| 58736390
5.1 Tạo App tính tiền điện
Viết một app tính tiền điện với Flask, người dùng cần đăng nhập vào hệ thống và có các chức
năng sau:
Xem tiền điện theo từng tháng.
Xem thông tin khách hàng
Biết rằng giá điện sinh hoạt từ ngày 04/05/2023 như sau
Ngày 04/5/2023, Bộ Công Thương ban hành Quyết định 1062/QĐ-BCT quy định giá bán lẻ
điện cho các nhóm khách hàng sử dụng điện và giá bán điện cho các đơn vị bán lẻ điện.
Theo đó, đối với nhóm khách hàng sinh hoạt gồm 6 bậc, theo nguyên tắc dùng càng nhiều
điện giá điện càng cao.
Cụ thể,
Bậc 1 có giá thấp nhất là 1.728 đồng/kWh (giá cũ là 1.678 đồng).
Bậc 2 có giá là 1.786 đồng/kWh (giá cũ là 1.734 đồng).
Bậc 3 có giá là 2.074 đồng/kWh (giá cũ là 2.014 đồng).
Bậc 4 có giá là 2.612 đồng/kWh (giá cũ là 2.536 đồng).
Bậc 5 có giá là 2.919 đồng/kWh (giá cũ là 2.834 đồng)
Bậc 6 có giá là 3.015 đồng/kWh (giá cũ là 2.927 đồng)
Lưu ý rằng: dữ liệu về lịch sử điện năng tiêu thụ của khách hàng có trước tháng
05/2023 đến thời điểm hiện tại.
lOMoARcPSD| 58736390
5.2 Viết app với Flask để chuyển đổi một văn bản và trả về một văn bản đã được mã
hoá. Biết rằng thuật toán mã hoá bao gồm các loại như sau:
Affine
Caesar
AES
DES
RSA
Có thể sử dụng các thư viện mã hoá.
5.3 Viết app với Flask để trả về
n số Fibonnaci đầu tiên
n số nguyên tố đầu tiên
n số Hoàn hảo đầu tiên
n số Armstrong đầu tiên
n số Harshad
ước số chung lớn nhất của hai số tự nhiên
bội số chung nhỏ nhất của hai số tự nhiên
Kiểm tra
một số có phải là số hoàn hảo hay không
một số có phải là số Nguyên tố hay không
một số có phải là số Harshad hay không
một số có phải là sArmstrong hay không
2 số tự nhiên có phải là hai số nguyên tố cùng nha
Lưu ý: Lịch sử truy cập của Client phải được lưu lại trên hệ thống trong thư mục logs

Preview text:

Handle GET Request
action="{{ url_for('handle_get') }}"> name="username" placeholder="Username"> name="password" placeholder="Password"> submit Handle POST Request
action="{{ url_for('handle_post') }}"> name="username" placeholder="Username"> name="password" placeholder="Password"> submit lOMoAR cPSD| 58736390