Chia ứng dụng Python Flask thành nhiều tệp


88

Tôi đang gặp khó khăn khi hiểu cách chia ứng dụng bình thành nhiều tệp.

Tôi đang tạo một dịch vụ web và tôi muốn chia api thành các tệp khác nhau (AccountAPI.py, UploadAPI.py, ...), để tôi không có một tệp python lớn.

Tôi đã đọc rằng bạn có thể làm điều này với Bản thiết kế, nhưng tôi không hoàn toàn chắc chắn rằng lộ trình đó là phù hợp với tôi.

Cuối cùng, tôi muốn chạy một tệp python chính và bao gồm các tệp khác để khi nó chạy, chúng được coi là một tệp lớn.

Ví dụ: nếu tôi có Main.py và AccountAPI.py, tôi muốn có thể thực hiện việc này:

Main.py:

from flask import Flask
import AccountAPI

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run()

AccountAPI.py:

@app.route("/account")
def accountList():
    return "list of accounts"

Tôi biết với ví dụ này rõ ràng là nó sẽ không hoạt động, nhưng liệu có thể làm điều gì đó như vậy không?

Cảm ơn

Câu trả lời:


158

Vâng, Bản thiết kế là cách thích hợp để làm điều đó. Những gì bạn đang cố gắng làm có thể đạt được như sau:

Main.py

from flask import Flask
from AccountAPI import account_api

app = Flask(__name__)

app.register_blueprint(account_api)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run()

AccountAPI.py

from flask import Blueprint

account_api = Blueprint('account_api', __name__)

@account_api.route("/account")
def accountList():
    return "list of accounts"

Nếu đây là một tùy chọn, bạn có thể cân nhắc sử dụng các tiền tố URL khác nhau cho các API / Bản thiết kế khác nhau để tách chúng một cách rõ ràng. Điều này có thể được thực hiện với một sửa đổi nhỏ đối với lệnh register_blueprintgọi trên :

app.register_blueprint(account_api, url_prefix='/accounts')

Để biết thêm tài liệu, bạn cũng có thể xem các tài liệu chính thức .


Điều này làm việc hoàn hảo cho tôi cảm ơn! Tôi đoán lẽ ra tôi nên đọc các tài liệu về Kế hoạch chi tiết một cách cẩn thận hơn.
user1751547 Ngày

Này, tôi có một câu hỏi. Trong đoạn mã trên, url cho accountList () có khớp với 'domain / account / account' không?
jeyraof

4
Main.py và AccountAPI.py có thể có một biến chung được chia sẻ trong một trong các tệp không?
matchifang

Có giải pháp đơn giản nào để đặt accountListbên trong một lớp trong cùng một tệp không?
GA1

Làm việc như một nét duyên dáng, tiếp tục làm thế nào để thêm điểm cuối được bảo vệ bằng cách sử dụng JWT trong file py riêng
Ashok Sri

41

Sử dụng Blueprintbạn có thể thêm các tuyến đường của mình trong routesdanh bạ.

Kết cấu

app.py
routes
    __init__.py
    index.py
    users.py

__init__.py

from flask import Blueprint
routes = Blueprint('routes', __name__)

from .index import *
from .users import *

index.py

from flask import render_template
from . import routes

@routes.route('/')
def index():
    return render_template('index.html')

users.py

from flask import render_template
from . import routes

@routes.route('/users')
def users():
    return render_template('users.html')

app.py

from routes import *
app.register_blueprint(routes)

Nếu bạn muốn thêm tệp tuyến đường mới, chẳng hạn như accounts.pybạn chỉ cần tạo tệp accounts.pytrong routesthư mục, giống như index.pyusers.pysau đó nhập tệp đó vào routes.__init__.pytệp

from .accounts import *

1
Nó đang gặp phải một lỗi nhập
Abhishek Jebaraj

Nhập vào giữa tệp có thể được coi là hành vi xấu?
TomSawyer

3

Nếu bạn đang sử dụng bản thiết kế và muốn định tuyến / chuyển hướng đến một url của bản thiết kế bên trong một mẫu bạn đang sử dụng, bạn cần phải sử dụng câu lệnh url_for đúng.

Trong trường hợp của bạn, nếu bạn muốn mở tài khoản url của bản thiết kế, bạn phải nêu nó như thế này trong mẫu của bạn :

href="{{ url_for('account_api.account') }}"

và đối với ứng dụng chính, nó sẽ trông như thế này:

redirect(url_for('account_api.account'))

Nếu không, thư viện werkzeug sẽ báo lỗi.


1

Một cách khác để làm điều này có thể là tải chậm , nơi bạn sẽ đính kèm rõ ràng các chức năng xem trên cơ sở cần thiết.

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.