Pisahkan aplikasi Python Flask menjadi beberapa file

91

Saya kesulitan memahami cara membagi aplikasi flask menjadi beberapa file.

Saya membuat layanan web dan saya ingin membagi api menjadi file yang berbeda (AccountAPI.py, UploadAPI.py, ...), jadi saya tidak punya satu file python yang besar.

Saya pernah membaca bahwa Anda dapat melakukan ini dengan Cetak Biru, tetapi saya tidak sepenuhnya yakin bahwa rute tersebut tepat untuk saya.

Akhirnya saya ingin menjalankan satu file python utama dan menyertakan file lain sehingga ketika berjalan, mereka dianggap satu file besar.

Misalnya jika saya memiliki Main.py dan AccountAPI.py saya ingin dapat melakukan ini:

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"

Saya tahu dengan contoh ini jelas tidak akan berhasil, tetapi apakah mungkin untuk melakukan sesuatu seperti itu?

Terima kasih

pengguna1751547
sumber

Jawaban:

163

Ya, Blueprint adalah cara yang tepat untuk melakukannya. Apa yang Anda coba lakukan dapat dicapai seperti ini:

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"

Jika ini adalah pilihan, Anda dapat mempertimbangkan untuk menggunakan awalan URL yang berbeda untuk API / Cetak Biru yang berbeda untuk memisahkannya dengan rapi. Ini dapat dilakukan dengan sedikit modifikasi pada register_blueprintpanggilan di atas :

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

Untuk dokumentasi lebih lanjut, Anda juga dapat melihat dokumen resmi .

cyroxx
sumber
Ini bekerja dengan sempurna untuk saya, terima kasih! Saya rasa saya seharusnya membaca dokumen Blueprint dengan lebih hati-hati.
pengguna1751547
Hei, saya punya pertanyaan. Pada kode di atas berikut, apakah url untuk accountList () cocok dengan 'domain / akun / akun'?
jeyraof
4
Dapatkah Main.py dan AccountAPI.py memiliki variabel global bersama yang ada di salah satu file?
matchifang
Apakah ada solusi sederhana untuk memasukkan accountListkelas ke dalam file yang sama?
GA1
Bekerja seperti pesona, lebih jauh bagaimana menambahkan titik akhir yang dilindungi dengan menggunakan JWT dalam file .py terpisah
Ashok Sri
41

Menggunakan BlueprintAnda dapat menambahkan rute Anda di routesdirektori.

Struktur

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)

Jika Anda ingin menambahkan file rute baru, katakanlah accounts.py, Anda hanya perlu membuat file accounts.pydi routesdirektori, seperti index.pydan users.py, lalu mengimpornya ke routes.__init__.pyfile

from .accounts import *
Searene
sumber
1
Ini melempar Kesalahan Impor
Abhishek Jebaraj
Mengimpor di tengah file dapat dianggap sebagai praktik yang buruk?
TomSawyer
3

Jika Anda menggunakan cetak biru dan ingin merutekan / mengarahkan ke url cetak biru Anda di dalam templat yang Anda gunakan, Anda perlu menggunakan pernyataan url_for yang benar.

Dalam kasus Anda, jika Anda ingin membuka akun url cetak biru Anda, Anda harus menyatakannya seperti ini di template Anda :

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

dan untuk aplikasi utama akan terlihat seperti ini:

redirect(url_for('account_api.account'))

Jika tidak, perpustakaan werkzeug akan membuat kesalahan.

Thomas Krickl
sumber
1

Satu cara lain untuk melakukan ini bisa dengan lazy loading , di mana Anda akan secara eksplisit melampirkan fungsi tampilan berdasarkan kebutuhan.

Bhaskar
sumber