Chuỗi mã hóa cứng python

Không lập trình viên nào mã mà không có lỗi. Tuy nhiên, có rất nhiều lỗi mà cơ bản chúng ta nên tránh để tạo ra ít lỗi hơn, mã sạch hơn và trong sáng hơn, dễ bảo quản hơn, đỡ bị ăn kiêng hơn,…

1. Xử lý quá nhiều thứ trong một chức năng

Theo nguyên tắc Trách nhiệm đơn lẻ, một chức năng chỉ nên thực hiện một và chỉ một nhiệm vụ duy nhất. Nhiều lập trình viên hoặc viết một chức năng vừa lấy dữ liệu, xử lý dữ liệu và hiển thị dữ liệu. Thay vì như vậy, hãy chia nhỏ chức năng này ra làm 3 chức năng. Hàm lấy dữ liệu, hàm xử lý dữ liệu và hàm hiển thị dữ liệu

Việc giữ một chức năng chỉ tập trung thực hiện một nhiệm vụ sẽ giúp mã dễ đọc và dễ bảo trì hơn. Như ví dụ trên, giả sử API để lấy dữ liệu bị thay đổi, ta chỉ cần cập nhật lại chức năng lấy dữ liệu, không ảnh hưởng đến các thao tác ở sau

2. Code is comment

Trong một ứng dụng có nhiều lập trình viên tham gia, nhiều khi bạn sẽ thấy có các hàm, mã đoạn được nhận xét. Bạn sẽ không hiểu đoạn mã được bình luận này để làm gì, ý đồ của tác giả là gì. Các thành viên lập trình khác có thể sẽ không quan tâm xóa đoạn mã này vì có thể tác động giả mạo đoạn nhận xét còn cần đến nó

Nếu gặp trường hợp như vậy và project có sử dụng hệ thống quản lý code như git, svn,… thì hãy mạnh dạng xóa đoạn code này đi, code sẽ trở nên sạch đẹp hơn. Còn sau đây nếu tác giả của đoạn mã muốn tìm lại thì chúng sẽ phải tự tìm trong các cam kết cũ

3. Đặt tên biến, tên hàm không rõ ràng

Đặt tên biến là một công việc khó nhưng cũng rất quan trọng. Một biến tên rõ ràng sẽ giúp việc đọc mã trở nên dễ dàng, dễ hiểu

Hãy đặt tên biến mô tả đúng chức năng, ý nghĩa của nó, dài một chút cũng được. Tránh đặt tên biến kiểu viết tắt (ngoại trừ trường hợp biến phổ biến hoặc biến đã có hệ thống nhất từ ​​trước) hoặc tên biến không có ý nghĩa như a, b, c, …

4. Số ma thuật và chuỗi

Số ma thuật và chuỗi là giá trị duy nhất được sử dụng nhiều lần trong ứng dụng mà không có giải thích ý nghĩa rõ ràng. Những giá trị này hoàn toàn có thể thay thế bằng các biến (với biến điều kiện phải được đặt tên rõ ràng)

Ví dụ với đoạn mã sau

for ($i = 1; $i <= 52; $i++) {
    ...
}

Trong ví dụ trên thì 52 là một con số kỳ diệu, và người đọc mã sẽ không hiểu được 52 có nghĩa là gì. Lại chí kể cả tác giả đoạn mã, sau một thời gian quay lại đọc lại mã của mình cũng không hiểu, phải dò lại toàn bộ chương trình

Đoạn mã trên có thể viết lại như sau

$cardDeckSize = 52;
for ($i = 1; $i <= $cardDeckSize; $i++) {
    ...
}

Như vậy đọc đoạn mã này sẽ hiểu ngay là đang thực hiện một vòng lặp qua từng quân bài trong bộ bài và 52 có nghĩa là số lá bài trong bộ bài. Ở các phần bên dưới cũng có thể sử dụng lại biến $cardDeckSize và khi cần thay đổi giá trị số lượng lá bài trong bộ bài ta cũng chỉ cần thay đổi giá trị của biến này một lần duy nhất thay vì phải chỉnh sửa nhiều nơi

Tương tự với số, ta cũng có sợi dây thần kỳ

if (userPasswordIsValid($user, "6yP4cZ".$password)) {
    ...
}

Thay vì viết như trên ta viết lại

$salt = "6yP4cZ";
if (userPasswordIsValid($user, $salt.$password)) {
    ...
}

và mã sẽ trở nên dễ hiểu hơn

5. Định dạng mã lộn ngược

Với những lập trình viên không có kinh nghiệm và cẩu thả thì họ sẽ viết mã lộn xộn, không có định dạng. Code không format sẽ rất khó đọc và dễ dẫn đến code sai cú pháp và rất khó debug. Ví dụ như mã HTML có thẻ mở mà không có thẻ đóng dẫn đến mã cấu trúc sai làm hỏng cả CSS, lỗi này cũng khó gỡ lỗi vì dù mã sai thì cũng sẽ không thông báo lỗi khi duyệt trình duyệt

Đa số các IDE hoặc trình soạn thảo mã hiện đều có hỗ trợ mã định dạng chức năng theo từng ngôn ngữ hoặc do người dùng chủ động cài đặt thêm các plugin, tiện ích mở rộng Hỗ trợ mã định dạng cho công việc. Trong một dự án nếu các thành viên lập trình sử dụng chung một mã định dạng chuẩn cũng sẽ giúp mã đồng bộ và ít xung đột hơn

6. Mã cứng

Mã cứng là dữ liệu được nhập trực tiếp vào trong mã nguồn, dữ liệu này được sửa phần cứng và không thay đổi, cấu hình được

Trong một số trường hợp chúng tôi vẫn sử dụng mã cứng, tuy nhiên nếu mã của bạn bị mã cứng quá nhiều tức là đang có vấn đề. Thay vì mã cứng dữ liệu trong mã nguồn, hãy tách chúng ra bằng cách lấy dữ liệu qua tệp cấu hình, lấy từ cơ sở dữ liệu hoặc API, hoặc qua biến môi trường, …

Bài viết được biên dịch lại từ phương tiện. com


Ngày 2/3/2020, Techmaster khai giảng khóa Lộ trình đào tạo Web Frontend chuyên sâu (5 tháng - cam kết việc làm) tại cơ sở 48 Tố Hữu, Hà Nội. Khoá học dành cho bất cứ ai mong muốn xây dựng sự nghiệp của mình với lĩnh vực lập trình CNTT về mảng Web Frontend. Không yêu cầu kiểm tra đầu vào

Háo hức để bắt đầu? . Nó giả sử bạn đã cài đặt Flask. Nếu không, hãy đến phần

Một ứng dụng tối thiểu

Một ứng dụng Flask tối thiểu trông giống như thế này

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, World!'

Vậy mã đó đã làm gì?

  1. Đầu tiên chúng tôi nhập lớp. Một thể hiện của lớp này sẽ là ứng dụng WSGI của chúng tôi

  2. Tiếp theo chúng ta tạo một thể hiện của lớp này. Đối số đầu tiên là tên của mô-đun hoặc gói của ứng dụng. Nếu bạn đang sử dụng một mô-đun duy nhất (như trong ví dụ này), bạn nên sử dụng

    PS C:\path\to\app> $env:FLASK_APP = "hello.py"
    
    9 vì tùy thuộc vào việc nó được bắt đầu dưới dạng ứng dụng hay được nhập dưới dạng mô-đun, tên sẽ khác (
    $ export FLASK_APP=hello.py
    $ python -m flask run
     * Running on http://127.0.0.1:5000/
    
    0 so với tên nhập thực tế). Điều này là cần thiết để Flask biết nơi tìm mẫu, tệp tĩnh, v.v. Để biết thêm thông tin, hãy xem tài liệu

  3. Sau đó, chúng tôi sử dụng trình trang trí để cho Flask biết URL nào sẽ kích hoạt chức năng của chúng tôi

  4. Hàm được đặt tên cũng được sử dụng để tạo URL cho chức năng cụ thể đó và trả về thông báo mà chúng tôi muốn hiển thị trong trình duyệt của người dùng

Chỉ cần lưu nó dưới dạng

$ export FLASK_APP=hello.py
$ python -m flask run
 * Running on http://127.0.0.1:5000/
3 hoặc một cái gì đó tương tự. Đảm bảo không gọi ứng dụng của bạn là
$ export FLASK_APP=hello.py
$ python -m flask run
 * Running on http://127.0.0.1:5000/
4 vì điều này sẽ xung đột với chính Flask

Để chạy ứng dụng, bạn có thể sử dụng lệnh jar hoặc công tắc

$ export FLASK_APP=hello.py
$ python -m flask run
 * Running on http://127.0.0.1:5000/
5 của python với Flask. Trước khi bạn có thể làm điều đó, bạn cần báo cho thiết bị đầu cuối của mình biết ứng dụng sẽ hoạt động bằng cách xuất biến môi trường
$ export FLASK_APP=hello.py
$ python -m flask run
 * Running on http://127.0.0.1:5000/
6

$ export FLASK_APP=hello.py
$ flask run
 * Running on http://127.0.0.1:5000/

Nếu bạn đang dùng Windows, cú pháp biến môi trường phụ thuộc vào trình thông dịch dòng lệnh. Trên dấu nhắc lệnh

C:\path\to\app>set FLASK_APP=hello.py

Và trên PowerShell

PS C:\path\to\app> $env:FLASK_APP = "hello.py"

Ngoài ra, bạn có thể sử dụng python -m bình

$ export FLASK_APP=hello.py
$ python -m flask run
 * Running on http://127.0.0.1:5000/

Điều này khởi chạy một máy chủ dựng sẵn rất đơn giản, đủ tốt để thử nghiệm nhưng có lẽ không phải thứ bạn muốn sử dụng trong sản xuất. Để biết các tùy chọn triển khai, hãy xem

Bây giờ hãy truy cập http. //127. 0. 0. 1. 5000/, và bạn sẽ thấy lời chào thế giới của bạn

Máy chủ hiển thị bên ngoài

Nếu bạn chạy máy chủ, bạn sẽ nhận thấy rằng máy chủ chỉ có thể truy cập được từ máy tính của bạn, không thể truy cập từ bất kỳ máy chủ nào khác trong mạng. Đây là mặc định vì trong chế độ gỡ lỗi, người dùng ứng dụng có thể thực thi mã Python tùy ý trên máy tính của bạn

Nếu bạn đã tắt trình gỡ lỗi hoặc tin tưởng người dùng trên mạng của mình, bạn có thể đặt máy chủ ở chế độ công khai chỉ bằng cách thêm

$ export FLASK_APP=hello.py
$ python -m flask run
 * Running on http://127.0.0.1:5000/
7 vào dòng lệnh

$ flask run --host=0.0.0.0

Điều này yêu cầu hệ điều hành của bạn lắng nghe trên tất cả các IP công cộng

Phải làm gì nếu Máy chủ không khởi động

Trong trường hợp python -m bình bị lỗi hoặc bình không tồn tại, có nhiều lý do có thể xảy ra trường hợp này. Trước hết bạn cần xem thông báo lỗi

Phiên bản cũ của Flask

Các phiên bản Flask cũ hơn 0. 11 đã từng có nhiều cách khác nhau để khởi động ứng dụng. Nói tóm lại, lệnh jar không tồn tại và python -m jar cũng vậy. Trong trường hợp đó bạn có hai lựa chọn. nâng cấp lên các phiên bản Flask mới hơn hoặc xem tài liệu để xem phương pháp thay thế để chạy máy chủ

Tên nhập không hợp lệ

Biến môi trường

$ export FLASK_APP=hello.py
$ python -m flask run
 * Running on http://127.0.0.1:5000/
6 là tên của mô-đun cần nhập khi chạy bình. Trong trường hợp mô-đun đó được đặt tên không chính xác, bạn sẽ gặp lỗi nhập khi bắt đầu (hoặc nếu tính năng gỡ lỗi được bật khi bạn điều hướng đến ứng dụng). Nó sẽ cho bạn biết những gì nó đã cố gắng nhập và tại sao nó không thành công

Lý do phổ biến nhất là do lỗi đánh máy hoặc do bạn không thực sự tạo một đối tượng

$ export FLASK_APP=hello.py
$ python -m flask run
 * Running on http://127.0.0.1:5000/
9

Chế độ kiểm tra sửa lỗi

(Bạn chỉ muốn ghi nhật ký lỗi và ngăn xếp dấu vết? Xem phần )

Tập lệnh bình rất tốt để khởi động máy chủ phát triển cục bộ, nhưng bạn sẽ phải khởi động lại thủ công sau mỗi lần thay đổi mã của mình. Điều đó không hay lắm và Flask có thể làm tốt hơn. Nếu bạn bật hỗ trợ gỡ lỗi, máy chủ sẽ tự tải lại khi mã thay đổi và nó cũng sẽ cung cấp cho bạn trình gỡ lỗi hữu ích nếu xảy ra sự cố

Để kích hoạt tất cả các tính năng phát triển (bao gồm cả chế độ gỡ lỗi), bạn có thể xuất biến môi trường

$ flask run --host=0.0.0.0
0 và đặt nó thành
$ flask run --host=0.0.0.0
1 trước khi chạy máy chủ

$ export FLASK_ENV=development
$ flask run

(Trên Windows, bạn cần sử dụng

$ flask run --host=0.0.0.0
2 thay vì
$ flask run --host=0.0.0.0
3. )

Điều này làm những điều sau đây

  1. nó kích hoạt trình gỡ lỗi

  2. nó kích hoạt trình tải lại tự động

  3. nó kích hoạt chế độ gỡ lỗi trên ứng dụng Flask

Bạn cũng có thể kiểm soát chế độ gỡ lỗi riêng biệt với môi trường bằng cách xuất

$ flask run --host=0.0.0.0
4

Có nhiều tham số được giải thích trong tài liệu

Chú ý

Mặc dù trình gỡ lỗi tương tác không hoạt động trong môi trường forking (khiến nó gần như không thể sử dụng trên các máy chủ sản xuất), nhưng nó vẫn cho phép thực thi mã tùy ý. Điều này làm cho nó trở thành một rủi ro bảo mật lớn và do đó nó không bao giờ được sử dụng trên các máy sản xuất

Ảnh chụp màn hình của trình gỡ lỗi đang hoạt động

Chuỗi mã hóa cứng python

Thông tin thêm về cách sử dụng trình gỡ lỗi có thể được tìm thấy trong

Có một trình gỡ lỗi khác trong tâm trí?

Lộ trình

Các ứng dụng web hiện đại sử dụng các URL có ý nghĩa để giúp người dùng. Người dùng có nhiều khả năng thích một trang và quay lại nếu trang sử dụng một URL có ý nghĩa mà họ có thể nhớ và sử dụng để truy cập trực tiếp vào trang

Sử dụng trình trang trí để liên kết một hàm với một URL

@app.route('/')
def index():
    return 'Index Page'

@app.route('/hello')
def hello():
    return 'Hello, World'

bạn có thể làm nhiều hơn. Bạn có thể tạo các phần của URL động và đính kèm nhiều quy tắc vào một chức năng

Quy tắc biến

Bạn có thể thêm các phần có thể thay đổi vào một URL bằng cách đánh dấu các phần bằng

$ flask run --host=0.0.0.0
6. Sau đó, chức năng của bạn sẽ nhận được
$ flask run --host=0.0.0.0
6 làm đối số từ khóa. Theo tùy chọn, bạn có thể sử dụng trình chuyển đổi để chỉ định loại đối số như
$ flask run --host=0.0.0.0
8

from markupsafe import escape

@app.route('/user/')
def show_user_profile(username):
    # show the user profile for that user
    return 'User %s' % escape(username)

@app.route('/post/')
def show_post(post_id):
    # show the post with the given id, the id is an integer
    return 'Post %d' % post_id

@app.route('/path/')
def show_subpath(subpath):
    # show the subpath after /path/
    return 'Subpath %s' % escape(subpath)

các loại bộ chuyển đổi

$ flask run --host=0.0.0.0
9

(mặc định) chấp nhận bất kỳ văn bản nào không có dấu gạch chéo

$ export FLASK_ENV=development
$ flask run
0

chấp nhận số nguyên dương

$ export FLASK_ENV=development
$ flask run
1

chấp nhận các giá trị dấu phẩy động dương

$ export FLASK_ENV=development
$ flask run
2

như

$ flask run --host=0.0.0.0
9 nhưng cũng chấp nhận dấu gạch chéo

$ export FLASK_ENV=development
$ flask run
4

chấp nhận chuỗi UUID

URL duy nhất / Hành vi chuyển hướng

Hai quy tắc sau đây khác nhau về cách sử dụng dấu gạch chéo ở cuối

@app.route('/projects/')
def projects():
    return 'The project page'

@app.route('/about')
def about():
    return 'The about page'

URL chuẩn cho điểm cuối

$ export FLASK_ENV=development
$ flask run
5 có dấu gạch chéo ở cuối. Nó tương tự như một thư mục trong một hệ thống tập tin. Nếu bạn truy cập URL mà không có dấu gạch chéo ở cuối, Flask sẽ chuyển hướng bạn đến URL chuẩn có dấu gạch chéo ở cuối

URL chuẩn cho điểm cuối

$ export FLASK_ENV=development
$ flask run
6 không có dấu gạch chéo ở cuối. Nó tương tự như tên đường dẫn của một tập tin. Truy cập URL có dấu gạch chéo tạo ra lỗi 404 “Không tìm thấy”. Điều này giúp giữ cho các URL là duy nhất cho các tài nguyên này, giúp các công cụ tìm kiếm tránh lập chỉ mục hai lần cho cùng một trang

Xây dựng URL

Để tạo URL cho một chức năng cụ thể, hãy sử dụng chức năng. Nó chấp nhận tên của hàm làm đối số đầu tiên và bất kỳ số lượng đối số từ khóa nào, mỗi đối số tương ứng với một phần biến của quy tắc URL. Các phần biến không xác định được thêm vào URL dưới dạng tham số truy vấn

Tại sao bạn muốn tạo URL bằng chức năng đảo ngược URL thay vì mã hóa cứng chúng vào mẫu của bạn?

  1. Đảo ngược thường mang tính mô tả hơn là mã hóa cứng các URL

  2. Bạn có thể thay đổi các URL của mình trong một lần thay vì phải nhớ thay đổi các URL được mã hóa cứng theo cách thủ công

  3. Xây dựng URL xử lý thoát các ký tự đặc biệt và dữ liệu Unicode một cách minh bạch

  4. Các đường dẫn được tạo luôn tuyệt đối, tránh hành vi không mong muốn của các đường dẫn tương đối trong trình duyệt

  5. Nếu ứng dụng của bạn được đặt bên ngoài thư mục gốc của URL, ví dụ: trong

    $ export FLASK_ENV=development
    $ flask run
    
    9 thay vì
    @app.route('/')
    def index():
        return 'Index Page'
    
    @app.route('/hello')
    def hello():
        return 'Hello, World'
    
    0, hãy xử lý đúng cách cho bạn

Ví dụ, ở đây chúng tôi sử dụng phương pháp để thử. yêu cầu Flask hành xử như thể nó đang xử lý một yêu cầu ngay cả khi chúng ta sử dụng trình bao Python. Nhìn thấy

$ export FLASK_APP=hello.py
$ flask run
 * Running on http://127.0.0.1:5000/
0

$ export FLASK_APP=hello.py
$ flask run
 * Running on http://127.0.0.1:5000/
1

Phương thức HTTP

Các ứng dụng web sử dụng các phương thức HTTP khác nhau khi truy cập các URL. Bạn nên tự làm quen với các phương thức HTTP khi làm việc với Flask. Theo mặc định, một route chỉ trả lời cho _______25_______5 yêu cầu. Bạn có thể sử dụng đối số

@app.route('/')
def index():
    return 'Index Page'

@app.route('/hello')
def hello():
    return 'Hello, World'
6 của trình trang trí để xử lý các phương thức HTTP khác nhau

$ export FLASK_APP=hello.py
$ flask run
 * Running on http://127.0.0.1:5000/
2

Nếu có

@app.route('/')
def index():
    return 'Index Page'

@app.route('/hello')
def hello():
    return 'Hello, World'
5, Flask sẽ tự động thêm hỗ trợ cho phương thức
@app.route('/')
def index():
    return 'Index Page'

@app.route('/hello')
def hello():
    return 'Hello, World'
9 và xử lý yêu cầu
@app.route('/')
def index():
    return 'Index Page'

@app.route('/hello')
def hello():
    return 'Hello, World'
9 theo HTTP RFC. Tương tự như vậy,
from markupsafe import escape

@app.route('/user/')
def show_user_profile(username):
    # show the user profile for that user
    return 'User %s' % escape(username)

@app.route('/post/')
def show_post(post_id):
    # show the post with the given id, the id is an integer
    return 'Post %d' % post_id

@app.route('/path/')
def show_subpath(subpath):
    # show the subpath after /path/
    return 'Subpath %s' % escape(subpath)
1 được triển khai tự động cho bạn

Tệp tĩnh

Các ứng dụng web động cũng cần các tệp tĩnh. Đó thường là nơi các tệp CSS và JavaScript đến từ. Lý tưởng nhất là máy chủ web của bạn được định cấu hình để phục vụ chúng cho bạn, nhưng trong quá trình phát triển, Flask cũng có thể làm điều đó. Chỉ cần tạo một thư mục có tên là

from markupsafe import escape

@app.route('/user/')
def show_user_profile(username):
    # show the user profile for that user
    return 'User %s' % escape(username)

@app.route('/post/')
def show_post(post_id):
    # show the post with the given id, the id is an integer
    return 'Post %d' % post_id

@app.route('/path/')
def show_subpath(subpath):
    # show the subpath after /path/
    return 'Subpath %s' % escape(subpath)
2 trong gói của bạn hoặc bên cạnh mô-đun của bạn và thư mục đó sẽ có sẵn tại
from markupsafe import escape

@app.route('/user/')
def show_user_profile(username):
    # show the user profile for that user
    return 'User %s' % escape(username)

@app.route('/post/')
def show_post(post_id):
    # show the post with the given id, the id is an integer
    return 'Post %d' % post_id

@app.route('/path/')
def show_subpath(subpath):
    # show the subpath after /path/
    return 'Subpath %s' % escape(subpath)
3 trên ứng dụng

Để tạo URL cho các tệp tĩnh, hãy sử dụng tên điểm cuối

from markupsafe import escape

@app.route('/user/')
def show_user_profile(username):
    # show the user profile for that user
    return 'User %s' % escape(username)

@app.route('/post/')
def show_post(post_id):
    # show the post with the given id, the id is an integer
    return 'Post %d' % post_id

@app.route('/path/')
def show_subpath(subpath):
    # show the subpath after /path/
    return 'Subpath %s' % escape(subpath)
4 đặc biệt

$ export FLASK_APP=hello.py
$ flask run
 * Running on http://127.0.0.1:5000/
3

Tệp phải được lưu trữ trên hệ thống tệp dưới dạng

from markupsafe import escape

@app.route('/user/')
def show_user_profile(username):
    # show the user profile for that user
    return 'User %s' % escape(username)

@app.route('/post/')
def show_post(post_id):
    # show the post with the given id, the id is an integer
    return 'Post %d' % post_id

@app.route('/path/')
def show_subpath(subpath):
    # show the subpath after /path/
    return 'Subpath %s' % escape(subpath)
5

Mẫu kết xuất

Tạo HTML từ bên trong Python không thú vị và thực sự khá cồng kềnh vì bạn phải tự thoát HTML để giữ an toàn cho ứng dụng. Do đó, Flask sẽ tự động định cấu hình công cụ mẫu Jinja2 cho bạn

Để kết xuất một mẫu, bạn có thể sử dụng phương thức. Tất cả những gì bạn phải làm là cung cấp tên của mẫu và các biến bạn muốn chuyển đến công cụ mẫu dưới dạng đối số từ khóa. Đây là một ví dụ đơn giản về cách kết xuất một mẫu

$ export FLASK_APP=hello.py
$ flask run
 * Running on http://127.0.0.1:5000/
4

Flask sẽ tìm các mẫu trong thư mục

from markupsafe import escape

@app.route('/user/')
def show_user_profile(username):
    # show the user profile for that user
    return 'User %s' % escape(username)

@app.route('/post/')
def show_post(post_id):
    # show the post with the given id, the id is an integer
    return 'Post %d' % post_id

@app.route('/path/')
def show_subpath(subpath):
    # show the subpath after /path/
    return 'Subpath %s' % escape(subpath)
7. Vì vậy, nếu ứng dụng của bạn là một mô-đun, thì thư mục này nằm bên cạnh mô-đun đó, nếu đó là một gói thì nó thực sự nằm trong gói của bạn

Trường hợp 1. một mô-đun

$ export FLASK_APP=hello.py
$ flask run
 * Running on http://127.0.0.1:5000/
5

trường hợp 2. một gói

$ export FLASK_APP=hello.py
$ flask run
 * Running on http://127.0.0.1:5000/
6

Đối với các mẫu, bạn có thể sử dụng toàn bộ sức mạnh của các mẫu Jinja2. Truy cập Tài liệu mẫu Jinja2 chính thức để biết thêm thông tin

Đây là một mẫu ví dụ

$ export FLASK_APP=hello.py
$ flask run
 * Running on http://127.0.0.1:5000/
7

Bên trong các mẫu, bạn cũng có quyền truy cập vào các đối tượng và chức năng

Các mẫu đặc biệt hữu ích nếu sử dụng tính kế thừa. Nếu bạn muốn biết nó hoạt động như thế nào, hãy xem tài liệu về mẫu. Về cơ bản, kế thừa mẫu giúp giữ lại một số thành phần nhất định trên mỗi trang (như đầu trang, điều hướng và chân trang)

Tự động thoát được bật, vì vậy nếu

@app.route('/projects/')
def projects():
    return 'The project page'

@app.route('/about')
def about():
    return 'The about page'
2 chứa HTML thì nó sẽ tự động thoát. Nếu bạn có thể tin cậy một biến và bạn biết rằng biến đó sẽ là HTML an toàn (ví dụ vì nó đến từ một mô-đun chuyển đổi đánh dấu wiki sang HTML), bạn có thể đánh dấu biến đó là an toàn bằng cách sử dụng lớp
@app.route('/projects/')
def projects():
    return 'The project page'

@app.route('/about')
def about():
    return 'The about page'
3 hoặc bằng cách sử dụng bộ lọc
@app.route('/projects/')
def projects():
    return 'The project page'

@app.route('/about')
def about():
    return 'The about page'
4 trong . Truy cập tài liệu Jinja 2 để biết thêm ví dụ

Đây là phần giới thiệu cơ bản về cách hoạt động của lớp

@app.route('/projects/')
def projects():
    return 'The project page'

@app.route('/about')
def about():
    return 'The about page'
3

$ export FLASK_APP=hello.py
$ flask run
 * Running on http://127.0.0.1:5000/
8

Nhật ký thay đổi

Đã thay đổi trong phiên bản 0. 5. Tự động thoát không còn được bật cho tất cả các mẫu. Các phần mở rộng sau cho các mẫu kích hoạt tự động thoát.

@app.route('/projects/')
def projects():
    return 'The project page'

@app.route('/about')
def about():
    return 'The about page'
6,
@app.route('/projects/')
def projects():
    return 'The project page'

@app.route('/about')
def about():
    return 'The about page'
7,
@app.route('/projects/')
def projects():
    return 'The project page'

@app.route('/about')
def about():
    return 'The about page'
8,
@app.route('/projects/')
def projects():
    return 'The project page'

@app.route('/about')
def about():
    return 'The about page'
9. Các mẫu được tải từ một chuỗi sẽ bị tắt tự động thoát.

Không chắc đối tượng đó là gì?

Truy cập dữ liệu yêu cầu

Đối với các ứng dụng web, điều quan trọng là phải phản ứng với dữ liệu mà máy khách gửi đến máy chủ. Trong Flask, thông tin này được cung cấp bởi đối tượng toàn cầu. Nếu bạn có một số kinh nghiệm với Python, bạn có thể tự hỏi làm thế nào đối tượng đó có thể là toàn cầu và cách Flask quản lý để vẫn an toàn cho luồng. Câu trả lời là bối cảnh địa phương

Bối cảnh địa phương

Thông tin nội bộ

Nếu bạn muốn hiểu cách thức hoạt động của nó và cách bạn có thể triển khai các thử nghiệm với ngữ cảnh cục bộ, hãy đọc phần này, nếu không thì hãy bỏ qua nó

Một số đối tượng trong Flask là các đối tượng toàn cầu, nhưng không thuộc loại thông thường. Các đối tượng này thực sự là proxy cho các đối tượng cục bộ trong một ngữ cảnh cụ thể. Thật là một mồm. Nhưng điều đó thực sự khá dễ hiểu

Hãy tưởng tượng bối cảnh là luồng xử lý. Một yêu cầu đến và máy chủ web quyết định tạo ra một luồng mới (hoặc một cái gì đó khác, đối tượng cơ bản có khả năng xử lý các hệ thống tương tranh không phải là luồng). Khi Flask bắt đầu xử lý yêu cầu nội bộ, nó chỉ ra rằng luồng hiện tại là ngữ cảnh hoạt động và liên kết ứng dụng hiện tại cũng như môi trường WSGI với ngữ cảnh (luồng) đó. Nó thực hiện điều đó một cách thông minh để một ứng dụng có thể gọi ứng dụng khác mà không bị hỏng

Vậy nó có nghĩa gì đối với bạn? . Bạn sẽ nhận thấy rằng mã phụ thuộc vào đối tượng yêu cầu sẽ đột ngột bị hỏng vì không có đối tượng yêu cầu. Giải pháp là tự tạo một đối tượng yêu cầu và liên kết nó với ngữ cảnh. Giải pháp đơn giản nhất để kiểm tra đơn vị là sử dụng trình quản lý bối cảnh. Kết hợp với câu lệnh

$ export FLASK_APP=hello.py
$ flask run
 * Running on http://127.0.0.1:5000/
04, nó sẽ ràng buộc một yêu cầu kiểm tra để bạn có thể tương tác với nó. Đây là một ví dụ

$ export FLASK_APP=hello.py
$ flask run
 * Running on http://127.0.0.1:5000/
9

Khả năng khác là chuyển toàn bộ môi trường WSGI sang phương thức

C:\path\to\app>set FLASK_APP=hello.py
0

Đối tượng yêu cầu

Đối tượng yêu cầu được ghi lại trong phần API và chúng tôi sẽ không đề cập chi tiết về nó ở đây (xem ). Dưới đây là tổng quan về một số hoạt động phổ biến nhất. Trước hết, bạn phải nhập nó từ mô-đun

$ export FLASK_APP=hello.py
$ flask run
 * Running on http://127.0.0.1:5000/
07

C:\path\to\app>set FLASK_APP=hello.py
1

Phương thức yêu cầu hiện tại có sẵn bằng cách sử dụng thuộc tính. Để truy cập dữ liệu biểu mẫu (dữ liệu được truyền trong yêu cầu

$ export FLASK_APP=hello.py
$ flask run
 * Running on http://127.0.0.1:5000/
09 hoặc
$ export FLASK_APP=hello.py
$ flask run
 * Running on http://127.0.0.1:5000/
10), bạn có thể sử dụng thuộc tính. Dưới đây là một ví dụ đầy đủ về hai thuộc tính được đề cập ở trên

C:\path\to\app>set FLASK_APP=hello.py
2

Điều gì xảy ra nếu khóa không tồn tại trong thuộc tính

$ export FLASK_APP=hello.py
$ flask run
 * Running on http://127.0.0.1:5000/
11? . Bạn có thể bắt nó như một tiêu chuẩn nhưng nếu bạn không làm như vậy, trang lỗi HTTP 400 Bad Request sẽ được hiển thị thay thế. Vì vậy, trong nhiều tình huống, bạn không phải giải quyết vấn đề đó

Để truy cập các tham số được gửi trong URL (

$ export FLASK_APP=hello.py
$ flask run
 * Running on http://127.0.0.1:5000/
15), bạn có thể sử dụng thuộc tính

C:\path\to\app>set FLASK_APP=hello.py
3

Chúng tôi khuyên bạn nên truy cập các tham số URL bằng get hoặc bằng cách bắt bởi vì người dùng có thể thay đổi URL và hiển thị cho họ một trang yêu cầu không hợp lệ 400 trong trường hợp đó là không thân thiện với người dùng

Để biết danh sách đầy đủ các phương thức và thuộc tính của đối tượng yêu cầu, hãy xem tài liệu

Tải lên tệp

Bạn có thể xử lý các tệp đã tải lên bằng Flask một cách dễ dàng. Chỉ cần đảm bảo không quên đặt thuộc tính

$ export FLASK_APP=hello.py
$ flask run
 * Running on http://127.0.0.1:5000/
19 trên biểu mẫu HTML của bạn, nếu không trình duyệt sẽ hoàn toàn không truyền tệp của bạn

Các tệp đã tải lên được lưu trữ trong bộ nhớ hoặc tại một vị trí tạm thời trên hệ thống tệp. Bạn có thể truy cập các tệp đó bằng cách xem thuộc tính

$ export FLASK_APP=hello.py
$ flask run
 * Running on http://127.0.0.1:5000/
20 trên đối tượng yêu cầu. Mỗi tệp đã tải lên được lưu trữ trong từ điển đó. Nó hoạt động giống như một đối tượng
$ export FLASK_APP=hello.py
$ flask run
 * Running on http://127.0.0.1:5000/
21 tiêu chuẩn của Python, nhưng nó cũng có một phương thức cho phép bạn lưu trữ tệp đó trên hệ thống tệp của máy chủ. Đây là một ví dụ đơn giản cho thấy nó hoạt động như thế nào

C:\path\to\app>set FLASK_APP=hello.py
4

Nếu bạn muốn biết cách tệp được đặt tên trên máy khách trước khi nó được tải lên ứng dụng của bạn, bạn có thể truy cập thuộc tính. Tuy nhiên, xin lưu ý rằng giá trị này có thể bị giả mạo nên đừng bao giờ tin vào giá trị đó. Nếu bạn muốn sử dụng tên tệp của máy khách để lưu trữ tệp trên máy chủ, hãy chuyển nó qua chức năng mà Werkzeug cung cấp cho bạn

C:\path\to\app>set FLASK_APP=hello.py
5

Để biết một số ví dụ tốt hơn, hãy kiểm tra mẫu

Bánh quy

Để truy cập cookie, bạn có thể sử dụng thuộc tính. Để đặt cookie, bạn có thể sử dụng phương thức đối tượng phản hồi. Thuộc tính của các đối tượng yêu cầu là một từ điển với tất cả các cookie mà máy khách truyền tải. Nếu bạn muốn sử dụng phiên, không sử dụng cookie trực tiếp mà thay vào đó hãy sử dụng trong Flask để thêm một số bảo mật trên cookie cho bạn

Đọc cookie

C:\path\to\app>set FLASK_APP=hello.py
6

Lưu trữ cookie

C:\path\to\app>set FLASK_APP=hello.py
7

Lưu ý rằng cookie được đặt trên các đối tượng phản hồi. Vì thông thường bạn chỉ cần trả về các chuỗi từ chế độ xem nên các hàm Flask sẽ chuyển đổi chúng thành các đối tượng phản hồi cho bạn. Nếu bạn muốn làm điều đó một cách rõ ràng, bạn có thể sử dụng chức năng này và sau đó sửa đổi nó

Đôi khi bạn có thể muốn đặt cookie tại điểm mà đối tượng phản hồi chưa tồn tại. Điều này có thể thực hiện được bằng cách sử dụng mẫu

Đối với điều này cũng xem

Chuyển hướng và lỗi

Để chuyển hướng người dùng đến một điểm cuối khác, hãy sử dụng hàm;

C:\path\to\app>set FLASK_APP=hello.py
8

Đây là một ví dụ khá vô nghĩa vì người dùng sẽ được chuyển hướng từ chỉ mục đến trang mà họ không thể truy cập (401 có nghĩa là quyền truy cập bị từ chối) nhưng nó cho thấy cách thức hoạt động của nó

Theo mặc định, một trang lỗi đen trắng được hiển thị cho mỗi mã lỗi. Nếu bạn muốn tùy chỉnh trang lỗi, bạn có thể sử dụng trình trang trí

C:\path\to\app>set FLASK_APP=hello.py
9

Lưu ý

$ export FLASK_APP=hello.py
$ flask run
 * Running on http://127.0.0.1:5000/
32 sau cuộc gọi. Điều này nói với Flask rằng mã trạng thái của trang đó phải là 404, nghĩa là không tìm thấy. Theo mặc định, 200 được giả định có nghĩa là. tất cả đều tốt

Xem để biết thêm chi tiết

Giới thiệu về phản hồi

Giá trị trả về từ chức năng xem được tự động chuyển đổi thành đối tượng phản hồi cho bạn. Nếu giá trị trả về là một chuỗi thì nó được chuyển đổi thành một đối tượng phản hồi với chuỗi dưới dạng nội dung phản hồi, mã trạng thái

$ export FLASK_APP=hello.py
$ flask run
 * Running on http://127.0.0.1:5000/
34 và kiểu mô phỏng văn bản/html. Nếu giá trị trả về là một lệnh, thì
$ export FLASK_APP=hello.py
$ flask run
 * Running on http://127.0.0.1:5000/
35 được gọi để tạo phản hồi. Logic mà Flask áp dụng để chuyển đổi giá trị trả về thành đối tượng phản hồi như sau

  1. Nếu một đối tượng phản hồi thuộc loại chính xác được trả về thì nó sẽ được trả về trực tiếp từ dạng xem

  2. Nếu đó là một chuỗi, một đối tượng phản hồi được tạo với dữ liệu đó và các tham số mặc định

  3. Nếu đó là lệnh, một đối tượng phản hồi được tạo bằng cách sử dụng

    $ export FLASK_APP=hello.py
    $ flask run
     * Running on http://127.0.0.1:5000/
    
    36

  4. Nếu một bộ dữ liệu được trả về, các mục trong bộ dữ liệu có thể cung cấp thêm thông tin. Các bộ dữ liệu như vậy phải ở dạng

    $ export FLASK_APP=hello.py
    $ flask run
     * Running on http://127.0.0.1:5000/
    
    37,
    $ export FLASK_APP=hello.py
    $ flask run
     * Running on http://127.0.0.1:5000/
    
    38 hoặc
    $ export FLASK_APP=hello.py
    $ flask run
     * Running on http://127.0.0.1:5000/
    
    39. Giá trị
    $ export FLASK_APP=hello.py
    $ flask run
     * Running on http://127.0.0.1:5000/
    
    40 sẽ ghi đè mã trạng thái và
    $ export FLASK_APP=hello.py
    $ flask run
     * Running on http://127.0.0.1:5000/
    
    41 có thể là danh sách hoặc từ điển các giá trị tiêu đề bổ sung

  5. Nếu không cái nào hoạt động, Flask sẽ coi giá trị trả về là một ứng dụng WSGI hợp lệ và chuyển đổi nó thành một đối tượng phản hồi

Nếu bạn muốn giữ đối tượng phản hồi kết quả bên trong dạng xem, bạn có thể sử dụng chức năng

Hãy tưởng tượng bạn có một cái nhìn như thế này

PS C:\path\to\app> $env:FLASK_APP = "hello.py"
0

Bạn chỉ cần bọc biểu thức trả về và nhận đối tượng phản hồi để sửa đổi nó, sau đó trả về

PS C:\path\to\app> $env:FLASK_APP = "hello.py"
1

API với JSON

Định dạng phản hồi phổ biến khi viết API là JSON. Thật dễ dàng để bắt đầu viết một API như vậy với Flask. Nếu bạn trả về một

$ export FLASK_APP=hello.py
$ flask run
 * Running on http://127.0.0.1:5000/
44 từ một chế độ xem, nó sẽ được chuyển đổi thành phản hồi JSON

PS C:\path\to\app> $env:FLASK_APP = "hello.py"
2

Tùy thuộc vào thiết kế API của bạn, bạn có thể muốn tạo phản hồi JSON cho các loại khác với

$ export FLASK_APP=hello.py
$ flask run
 * Running on http://127.0.0.1:5000/
44. Trong trường hợp đó, hãy sử dụng hàm sẽ tuần tự hóa mọi loại dữ liệu JSON được hỗ trợ. Hoặc xem xét các tiện ích mở rộng cộng đồng Flask hỗ trợ các ứng dụng phức tạp hơn

PS C:\path\to\app> $env:FLASK_APP = "hello.py"
3

phiên

Ngoài đối tượng yêu cầu, còn có một đối tượng thứ hai được gọi là cho phép bạn lưu trữ thông tin cụ thể cho người dùng từ yêu cầu này sang yêu cầu tiếp theo. Điều này được triển khai trên các cookie cho bạn và ký tên vào các cookie bằng mật mã. Điều này có nghĩa là người dùng có thể xem nội dung cookie của bạn nhưng không sửa đổi nó, trừ khi họ biết khóa bí mật được sử dụng để ký

Để sử dụng phiên, bạn phải đặt khóa bí mật. Đây là cách các phiên làm việc

PS C:\path\to\app> $env:FLASK_APP = "hello.py"
4

Điều được đề cập ở đây sẽ thoát cho bạn nếu bạn không sử dụng công cụ mẫu (như trong ví dụ này)

Cách tạo khóa bí mật tốt

Khóa bí mật phải càng ngẫu nhiên càng tốt. Hệ điều hành của bạn có nhiều cách để tạo dữ liệu khá ngẫu nhiên dựa trên trình tạo mã hóa ngẫu nhiên. Sử dụng lệnh sau để nhanh chóng tạo giá trị cho

$ export FLASK_APP=hello.py
$ flask run
 * Running on http://127.0.0.1:5000/
49 (hoặc )

PS C:\path\to\app> $env:FLASK_APP = "hello.py"
5

Một lưu ý về các phiên dựa trên cookie. Flask sẽ lấy các giá trị bạn đưa vào đối tượng phiên và tuần tự hóa chúng thành cookie. Nếu bạn thấy một số giá trị không tồn tại trong các yêu cầu, cookie thực sự đã được bật và bạn không nhận được thông báo lỗi rõ ràng, hãy kiểm tra kích thước của cookie trong phản hồi trang của bạn so với kích thước được trình duyệt web hỗ trợ

Bên cạnh các phiên dựa trên phía máy khách mặc định, thay vào đó, nếu bạn muốn xử lý các phiên ở phía máy chủ, có một số tiện ích mở rộng Flask hỗ trợ điều này

Tin nhắn nhấp nháy

Các ứng dụng và giao diện người dùng tốt là tất cả về thông tin phản hồi. Nếu người dùng không nhận được đủ phản hồi, họ có thể sẽ ghét ứng dụng đó. Flask cung cấp một cách thực sự đơn giản để đưa ra phản hồi cho người dùng với hệ thống nhấp nháy. Về cơ bản, hệ thống nhấp nháy cho phép ghi lại một tin nhắn ở cuối yêu cầu và truy cập nó trong yêu cầu tiếp theo (và chỉ tiếp theo). Điều này thường được kết hợp với một mẫu bố cục để hiển thị thông báo

Để flash một tin nhắn, hãy sử dụng phương pháp này, để giữ các tin nhắn, bạn có thể sử dụng phương thức này cũng có sẵn trong các mẫu. Kiểm tra ví dụ đầy đủ

ghi nhật ký

Nhật ký thay đổi

Mới trong phiên bản 0. 3

Đôi khi bạn có thể rơi vào tình huống xử lý dữ liệu lẽ ra phải chính xác nhưng thực tế lại không phải vậy. Ví dụ: bạn có thể có một số mã phía máy khách gửi yêu cầu HTTP đến máy chủ nhưng nó rõ ràng là không đúng định dạng. Điều này có thể do người dùng giả mạo dữ liệu hoặc mã máy khách bị lỗi. Hầu hết thời gian bạn có thể trả lời bằng ____11_______53 trong tình huống đó, nhưng đôi khi điều đó không hiệu quả và mã phải tiếp tục hoạt động

Bạn vẫn có thể muốn đăng nhập rằng một cái gì đó khó hiểu đã xảy ra. Đây là nơi logger có ích. Kể từ bình 0. 3 một bộ ghi được cấu hình sẵn để bạn sử dụng

Dưới đây là một số cuộc gọi nhật ký ví dụ

PS C:\path\to\app> $env:FLASK_APP = "hello.py"
6

Tệp đính kèm là nhật ký tiêu chuẩn, vì vậy hãy truy cập tài liệu chính thức để biết thêm thông tin

Đọc thêm về

Kết nối trong Phần mềm trung gian WSGI

Để thêm phần mềm trung gian WSGI vào ứng dụng Flask của bạn, hãy bọc thuộc tính

$ export FLASK_APP=hello.py
$ flask run
 * Running on http://127.0.0.1:5000/
57 của ứng dụng. Ví dụ: để áp dụng phần mềm trung gian của Werkzeug để chạy phía sau Nginx

PS C:\path\to\app> $env:FLASK_APP = "hello.py"
7

Đóng gói

$ export FLASK_APP=hello.py
$ flask run
 * Running on http://127.0.0.1:5000/
59 thay vì
$ export FLASK_APP=hello.py
$ python -m flask run
 * Running on http://127.0.0.1:5000/
9 có nghĩa là
$ export FLASK_APP=hello.py
$ python -m flask run
 * Running on http://127.0.0.1:5000/
9 vẫn trỏ vào ứng dụng Flask của bạn, không phải vào phần mềm trung gian, vì vậy bạn có thể tiếp tục sử dụng và định cấu hình trực tiếp
$ export FLASK_APP=hello.py
$ python -m flask run
 * Running on http://127.0.0.1:5000/
9

Sử dụng tiện ích mở rộng Flask

Tiện ích mở rộng là các gói giúp bạn hoàn thành các tác vụ thông thường. Ví dụ: Flask-SQLAlchemy cung cấp hỗ trợ SQLAlchemy giúp việc sử dụng Flask trở nên đơn giản và dễ dàng