Python Flask uygulamasını birden çok dosyaya bölün


91

Bir cep şişesi uygulamasını birden çok dosyaya nasıl böleceğimi anlamakta güçlük çekiyorum.

Bir web hizmeti oluşturuyorum ve API'leri farklı dosyalara bölmek istiyorum (AccountAPI.py, UploadAPI.py, ...), böylece tek bir büyük python dosyam yok.

Bunu Blueprints ile yapabileceğinizi okudum, ancak bu rotanın benim için doğru yol olduğundan tam olarak emin değilim.

Nihayetinde bir Ana python dosyası çalıştırmak ve diğer dosyaları dahil etmek istiyorum, böylece çalıştığında büyük bir dosya olarak kabul edilirler.

Örneğin, Main.py ve AccountAPI.py'ye sahipsem, bunu yapabilmek istiyorum:

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"

Bu örnekle açıkça işe yaramayacağını biliyorum, ancak böyle bir şey yapmak mümkün mü?

Teşekkürler

Yanıtlar:


163

Evet, Taslaklar bunu yapmanın doğru yoludur. Yapmaya çalıştığınız şey şu şekilde başarılabilir:

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"

Bu bir seçenekse, bunları temiz bir şekilde ayırmak için farklı API'ler / Taslaklar için farklı URL önekleri kullanmayı düşünebilirsiniz. Bu, yukarıdaki register_blueprintçağrıya küçük bir değişiklik yapılarak yapılabilir :

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

Daha fazla belge için resmi belgelere de bakabilirsiniz .


Bu benim için mükemmel çalıştı, teşekkürler! Plan belgelerini daha dikkatli okumalıydım sanırım.
user1751547

Hey, bir sorum var. Yukarıdaki kodu takip ederken, accountList () için url 'etki alanı / hesaplar / hesap' ile eşleşiyor mu?
jeyraof

4
Main.py ve AccountAPI.py dosyalardan birinde bulunan paylaşılan bir genel değişkene sahip olabilir mi?
matchifang

accountListBir sınıfı aynı dosyaya koymak için basit bir çözüm var mı ?
GA1

JWT'yi ayrı .py dosyalarında kullanarak korumalı uç noktayı nasıl ekleyeceğinizi daha da güzelleştirdi
Ashok Sri

41

Kullanarak Blueprintrotalarınızı routesdizine ekleyebilirsiniz .

Yapısı

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)

Yeni bir rota dosyası eklemek söylemek istiyorsanız accounts.py, sadece bir dosya oluşturmak için gereken accounts.pyde routestıpkı dizinde index.pyve users.pysonra bunu ithal routes.__init__.pydosyası

from .accounts import *

1
İçe Aktarma Hatası
veriyor

Dosyanın ortasından içe aktarmak kötü bir uygulama olarak kabul edilebilir mi?
TomSawyer

3

Planlar kullanıyorsanız ve kullandığınız şablonun içindeki planınızın bir URL'sine yönlendirmek / yeniden yönlendirmek istiyorsanız, doğru url_for ifadesini kullanmanız gerekir.

Sizin durumunuzda, planınızın url hesabını açmak istiyorsanız, bunu şablonunuzda şu şekilde belirtmelisiniz :

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

ve ana uygulama için şu şekilde görünür:

redirect(url_for('account_api.account'))

Aksi takdirde werkzeug kitaplığı bir hata atar.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.