Làm thế nào để chia ứng dụng bình thành nhiều tập tin py?


146

Ứng dụng bình của tôi hiện bao gồm một test.pytệp duy nhất có nhiều tuyến và main()tuyến được xác định. Có cách nào để tôi có thể tạo một test2.pytệp chứa các tuyến đường không được xử lý test.pykhông?

@app.route('/somepath')
def somehandler():
    # Handler code here

Tôi lo ngại rằng có quá nhiều tuyến đường trong test.pyvà muốn làm cho nó có thể chạy được python test.py, nó cũng sẽ chọn các tuyến đường test.pynhư thể nó là một phần của cùng một tệp. Những thay đổi nào tôi phải thực hiện test.pyvà / hoặc bao gồm test2.pyđể thực hiện điều này?

Câu trả lời:


152

Bạn có thể sử dụng cấu trúc gói Python thông thường để chia Ứng dụng của bạn thành nhiều mô-đun, xem tài liệu Flask.

Tuy nhiên,

Flask sử dụng khái niệm kế hoạch chi tiết để tạo các thành phần ứng dụng và hỗ trợ các mẫu phổ biến trong một ứng dụng hoặc trên các ứng dụng.

Bạn có thể tạo một thành phần phụ của ứng dụng dưới dạng Bản thiết kế trong một tệp riêng biệt:

simple_page = Blueprint('simple_page', __name__, template_folder='templates')
@simple_page.route('/<page>')
def show(page):
    # stuff

Và sau đó sử dụng nó trong phần chính:

from yourapplication.simple_page import simple_page

app = Flask(__name__)
app.register_blueprint(simple_page)

Bản thiết kế cũng có thể gói các tài nguyên cụ thể: mẫu hoặc tệp tĩnh. Vui lòng tham khảo tài liệu Flask để biết tất cả các chi tiết.


1
Làm thế nào chúng ta có thể có các tuyến kế hoạch chi tiết trong tập tin khác với init của kế hoạch đó?
divyenduz

nếu tôi muốn tạo một điểm cuối được bảo mật bằng JWT thì làm thế nào để làm điều đó trong mọi tệp tin của way.py
Ashok Sri


17

Bạn có thể sử dụng thủ thuật đơn giản là nhập biến ứng dụng bình từ chính trong tệp khác, như:

test -outes.py

from __main__ import app

@app.route('/test', methods=['GET'])
def test():
    return 'it works!'

và trong các tệp chính của bạn, nơi bạn đã khai báo ứng dụng bình, nhập các tuyến kiểm tra, như:

ứng dụng

from flask import Flask, request, abort

app = Flask(__name__)

# import declared routes
import test-routes

Nó hoạt động từ phía tôi.


2
Đó chỉ là một ví dụ, __main__đề cập đến tệp nhập của bạn, đó là nó!
nimeresam

3
Rực rỡ, cảm ơn nhiều. Kế hoạch chi tiết hoặc cách tiếp cận gói ở trên là quá mức cần thiết cho các ứng dụng nhỏ.
VH-NZZ

Đây là một liên kết đến các tài liệu nơi phương pháp này được giải thích: https://flask.palletsprojects.com/en/1.1.x/potypes/packages/
Christopher

5

Chia ứng dụng thành các bản thiết kế là một ý tưởng tuyệt vời. Tuy nhiên, nếu điều này là không đủ và nếu bạn muốn sau đó chia Blueprint thành nhiều tệp py, thì điều này cũng có thể sử dụng hệ thống nhập mô-đun Python thông thường, sau đó lặp qua tất cả các tuyến đường được nhập từ các tệp khác .

Tôi đã tạo một Gist với mã để làm điều này:

https://gist.github.com/Jaza/61f879f577bc9d06029e

Theo như tôi biết, đây là cách khả thi duy nhất để phân chia Kế hoạch chi tiết tại thời điểm này. Không thể tạo "bản thiết kế phụ" trong Flask, mặc dù có một vấn đề mở với rất nhiều cuộc thảo luận về điều này:

https://github.com/mitsuhiko/flask/issues/593

Ngoài ra, ngay cả khi điều đó là có thể (và có lẽ không thể sử dụng một số đoạn trích từ luồng vấn đề đó), các bản thiết kế phụ có thể quá hạn chế cho trường hợp sử dụng của bạn - ví dụ: nếu bạn không muốn tất cả các tuyến đường trong mô-đun phụ để có cùng tiền tố URL.


4

Nhiệm vụ này có thể được thực hiện mà không cần kế hoạch chi tiết và nhập khẩu khó khăn bằng Bản đồ URL tập trung

ứng dụng

import views
from flask import Flask

app = Flask(__name__)

app.add_url_rule('/', view_func=views.index)
app.add_url_rule('/other', view_func=views.other)

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

lượt xem

from flask import render_template

def index():
    return render_template('index.html')

def other():
    return render_template('other.html')
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.