Bagaimana cara membagi aplikasi labu menjadi beberapa file py?


146

Aplikasi labu saya saat ini terdiri dari satu test.pyfile dengan banyak rute dan main()rute yang ditentukan. Apakah ada cara saya bisa membuat test2.pyfile yang berisi rute yang tidak ditangani test.py?

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

Saya khawatir ada terlalu banyak rute di test.pydan ingin membuatnya sehingga saya dapat menjalankan python test.py, yang juga akan mengambil rute test.pyseolah-olah itu adalah bagian dari file yang sama. Perubahan apa yang harus saya lakukan test.pydan / atau sertakan untuk membuatnya test2.pyberfungsi?

Jawaban:


152

Anda dapat menggunakan struktur paket Python biasa untuk membagi Aplikasi Anda menjadi beberapa modul, lihat dokumen Flask.

Namun,

Flask menggunakan konsep cetak biru untuk membuat komponen aplikasi dan mendukung pola umum dalam aplikasi atau lintas aplikasi.

Anda dapat membuat sub-komponen aplikasi Anda sebagai Cetak Biru di file terpisah:

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

Dan kemudian menggunakannya di bagian utama:

from yourapplication.simple_page import simple_page

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

Cetak biru juga dapat menggabungkan sumber daya spesifik: templat atau file statis. Silakan merujuk ke Flask docs untuk semua detailnya.


1
bagaimana kita dapat memiliki rute cetak biru dalam file lain yang init dari cetak biru itu?
divyenduz

jika saya ingin membuat titik akhir yang aman menggunakan JWT maka bagaimana melakukannya di setiap file route.py
Ashok Sri

18

Anda dapat menggunakan trik sederhana yang mengimpor variabel aplikasi labu dari utama di dalam file lain, seperti:

test-routes.py

from __main__ import app

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

dan di file utama Anda, tempat Anda mendeklarasikan aplikasi labu, impor rute uji, seperti:

app.py

from flask import Flask, request, abort

app = Flask(__name__)

# import declared routes
import test-routes

Ini bekerja dari sisi saya.


2
Ini hanya sebuah contoh, __main__mengacu ke file entri Anda, itu saja!
nimeresam

3
Cemerlang, terima kasih banyak. Cetak biru atau pendekatan paket di atas adalah terlalu banyak untuk aplikasi kecil.
VH-NZZ

Berikut ini tautan ke dokumen tempat metode ini dijelaskan: https://flask.palletsprojects.com/en/1.1.x/patterns/packages/
Christopher

1
@nimeresam Ini bekerja untuk saya, tetapi saya harus belajar bahwa import test-routestidak bisa di bagian atas app.pyfile. Itu crash gunicorn tapi kemudian setelah memindahkan impor ke bagian bawah file kemudian berhasil. "hanya memastikan modul diimpor dan kami melakukan itu di bagian bawah file"
Niklas R.


5

Membagi aplikasi menjadi cetak biru adalah ide bagus. Namun, jika ini tidak cukup, dan jika Anda ingin membagi Blueprint itu sendiri menjadi beberapa file py, ini juga dimungkinkan menggunakan sistem impor modul Python biasa, dan kemudian mengulang semua rute yang diimpor dari file lain .

Saya membuat intisari dengan kode untuk melakukan ini:

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

Sejauh yang saya ketahui, ini adalah satu-satunya cara yang layak untuk membagi Cetak Biru saat ini. Tidak mungkin membuat "sub-cetak biru" di Flask, meskipun ada masalah terbuka dengan banyak diskusi tentang ini:

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

Juga, bahkan jika itu mungkin (dan mungkin bisa dilakukan dengan menggunakan beberapa snippet dari utas masalah itu), sub-cetak biru mungkin terlalu membatasi untuk kasus penggunaan Anda - misalnya jika Anda tidak ingin semua rute dalam suatu sub-modul memiliki sub-awalan URL yang sama.


4

Tugas ini dapat diselesaikan tanpa cetak biru dan impor rumit menggunakan Peta URL Terpusat

app.py

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)

views.py

from flask import render_template

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

def other():
    return render_template('other.html')
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.