Chính xác thì Flask Blueprints là gì?


180

Tôi đã đọc tài liệu Flask chính thức trên Blueprints và thậm chí một hoặc hai bài đăng trên blog về việc sử dụng chúng.

Tôi thậm chí đã sử dụng chúng trong ứng dụng web của mình, nhưng tôi hoàn toàn không hiểu chúng là gì hoặc chúng phù hợp với ứng dụng của tôi như thế nào. Làm thế nào nó giống với một phiên bản của ứng dụng của tôi nhưng không hoàn toàn? Các tài liệu này là toàn diện nhưng tôi tìm kiếm một lời giải thích giáo dân hoặc một sự tương tự khai sáng để châm ngòi cho tôi. Tôi đã đủ bối rối khi một đồng nghiệp yêu cầu tôi giải thích một bản thiết kế Flask cho họ mà tôi đã chọn để hỏi ở đây.

Câu trả lời:


287

Bản kế hoạch chi tiết là một mẫu để tạo ra một "phần" của ứng dụng web. Bạn có thể nghĩ về nó như một khuôn mẫu:

Một khuôn huy chương với một huy chương vàng mới được lấy ra từ nó

Bạn có thể lấy bản thiết kế và áp dụng nó vào ứng dụng của bạn ở một số nơi. Mỗi khi bạn áp dụng nó, bản thiết kế sẽ tạo ra một phiên bản mới của cấu trúc của nó trong phần ứng dụng của bạn.

# An example
from flask import Blueprint

tree_mold = Blueprint("mold", __name__)

@tree_mold.route("/leaves")
def leaves():
    return "This tree has leaves"

@tree_mold.route("/roots")
def roots():
    return "And roots as well"

@tree_mold.route("/rings")
@tree_mold.route("/rings/<int:year>")
def rings(year=None):
    return "Looking at the rings for {year}".format(year=year)

Đây là một khuôn mẫu đơn giản để làm việc với cây - nó nói rằng bất kỳ ứng dụng nào liên quan đến cây đều phải cung cấp quyền truy cập vào lá, rễ và vòng của nó (theo năm). Chính nó, nó là một cái vỏ rỗng - nó không thể định tuyến, nó không thể đáp ứng, cho đến khi nó bị ấn tượng bởi một ứng dụng:

from tree_workshop import tree_mold

app.register_blueprint(tree_mold, url_prefix="/oak")
app.register_blueprint(tree_mold, url_prefix="/fir")
app.register_blueprint(tree_mold, url_prefix="/ash")

Khi được tạo, nó có thể "gây ấn tượng" cho ứng dụng bằng cách sử dụng register_blueprintchức năng - điều này "gây ấn tượng" cho khuôn của bản thiết kế trên ứng dụng tại các vị trí được chỉ định bởi url_prefix.


5
Đây là một bài viết hay cho cấu trúc ứng dụng bằng cách sử dụng bản thiết kế. explflask.com/en/latest/blueprints.html
Devasish

5
Tôi vẫn còn bối rối. Điều đó có nghĩa oak/leavesfir\leavessẽ trỏ tot cùng một mã? Ngoài ra, mục đích của chuỗi moldtrongBlueprint("mold", __name__)
Codevalley

8
Có, cả hai oak/leavesfir/leavessẽ được xử lý bởi def leaves. "mold"là tên của bản thiết kế và được sử dụng để định hướng khi đề cập đến các tuyến đường (ví dụ someBlueprint.routeNameso với anotherBlueprint.routeName).
Sean Vieira

2
Làm thế nào tôi có thể truy cập url_prefixvào chức năng? Nói, để kiểm tra xem nó là gỗ sồi hay linh sam? tree_mold.url_prefixcho tôi mộtNone
Mellkor

3
@Mellkor - chỉ cần sử dụng url_for('.relative_route_name')(lưu ý dấu chấm hàng đầu). Ví dụ: url_for('.roots')sẽ tự động cung cấp một URL phạm vi chính xác tại mỗi điểm được gắn.
Sean Vieira

6

Như được chỉ ra trong một bình luận của @Devasish , bài viết này cung cấp một câu trả lời hay:

http://exploreflask.com/en/latest/blueprints.html

Trích dẫn từ bài viết:

Một ví dụ về điều này sẽ là Facebook. Nếu Facebook sử dụng Flask, nó có thể có bản thiết kế cho các trang tĩnh (ví dụ: nhà đăng xuất, đăng ký, về, v.v.), bảng điều khiển (tức là nguồn cấp tin tức), hồ sơ (/ robert / about và / robert / ảnh), cài đặt (/ cài đặt / bảo mật và / cài đặt / quyền riêng tư) và nhiều hơn nữa. Các thành phần này đều có chung bố cục và kiểu dáng, nhưng mỗi kiểu cũng có bố cục riêng.

Đây là một cách giải thích rất tốt, đặc biệt là phần "nếu Facebook sử dụng Flask". Nó cho chúng ta một tình huống cụ thể để hình dung cách Blueprint thực sự hoạt động.


3

Tôi cũng chỉ vấp phải điều này và đã bối rối sau khi đọc một vài nguồn tài liệu. Lúc đầu, tôi nghĩ nó giống như kiểu triển khai C # / Java khi bạn xác định một số thứ nhưng không phải lo lắng về việc định nghĩa nó cho đến sau. Tuy nhiên, tôi tình cờ thấy trang này đặt nó trong các điều khoản rất rất (và các sự kiện hiện tại khá vui nhộn). https://hackersandslackers.com/flask-blueprints/

Về cơ bản, một lợi ích được đề cập trong liên kết và cung cấp cho tôi một ý tưởng rõ ràng về việc sử dụng trong thế giới thực là tôi có thể tổ chức / phân chia ứng dụng một cách hiệu quả thành nhiều phần chỉ cần quan tâm đến các vấn đề riêng của nó. Vì vậy, nó cung cấp một số đóng gói được thiết kế.

Chỉnh sửa: Tôi hiện đang sử dụng nó để phân đoạn mã ứng dụng web của mình. Đó cũng là một quyết định tốt bởi vì tôi thấy nhà thiết kế chính muốn tạo ra lối vào trong Vue.js. Mà tôi chưa sử dụng nhưng nhìn vào các tệp dự án của nó sẽ trông lộn xộn hơn nhiều và có thể cung cấp nhiều sự va chạm dễ đặt tên.


0

Đối với các dự án lớn hơn, tất cả mã của bạn không nên nằm trong cùng một tệp. Thay vào đó, bạn có thể phân đoạn hoặc phân chia các mã lớn hơn thành tệp riêng biệt, chủ yếu dựa trên chức năng. Giống như những viên gạch tạo thành một bức tường.

Hy vọng điều này sẽ giúp. Vì đây là một câu hỏi lý thuyết, không đăng mã.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.