แยกแอพ Python Flask เป็นไฟล์หลาย ๆ ไฟล์


91

ฉันมีปัญหาในการทำความเข้าใจวิธีแยกแอปขวดออกเป็นหลายไฟล์

ฉันกำลังสร้างบริการเว็บและฉันต้องการแยก api ออกเป็นไฟล์ต่างๆ (AccountAPI.py, UploadAPI.py, ... ) ดังนั้นฉันจึงไม่มีไฟล์ python ขนาดใหญ่สักไฟล์

ฉันได้อ่านมาว่าคุณสามารถทำสิ่งนี้ได้ด้วยพิมพ์เขียว แต่ฉันไม่แน่ใจว่าเส้นทางนั้นเหมาะกับฉัน

ในที่สุดฉันต้องการเรียกใช้ไฟล์ Python หลักหนึ่งไฟล์และรวมไฟล์อื่น ๆ เพื่อให้เมื่อมันทำงานไฟล์เหล่านั้นจะถือว่าเป็นไฟล์ขนาดใหญ่

ตัวอย่างเช่นหากฉันมี Main.py และ AccountAPI.py ฉันต้องการที่จะทำได้:

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"

ฉันรู้ด้วยตัวอย่างนี้เห็นได้ชัดว่ามันใช้ไม่ได้ แต่เป็นไปได้ไหมที่จะทำอะไรแบบนั้น?

ขอบคุณ

คำตอบ:


163

ใช่พิมพ์เขียวเป็นวิธีที่ถูกต้อง สิ่งที่คุณพยายามทำสามารถทำได้ดังนี้:

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"

หากเป็นตัวเลือกคุณอาจพิจารณาใช้คำนำหน้า URL ที่แตกต่างกันสำหรับ API / พิมพ์เขียวที่แตกต่างกันเพื่อแยกออกจากกันอย่างหมดจด ซึ่งสามารถทำได้ด้วยการปรับเปลี่ยนเล็กน้อยกับการregister_blueprintโทรด้านบน:

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

สำหรับเอกสารเพิ่มเติมคุณสามารถดูเอกสารอย่างเป็นทางการได้


สิ่งนี้ทำงานได้อย่างสมบูรณ์แบบสำหรับฉันขอบคุณ! ฉันเดาว่าฉันควรอ่านเอกสาร Blueprint อย่างระมัดระวังมากกว่านี้
user1751547

เฮ้ฉันมีคำถาม ตามโค้ดด้านบน url สำหรับ accountList () ตรงกับ 'domain / accounts / account' หรือไม่
jeyraof

4
Main.py และ AccountAPI.py สามารถมีตัวแปรส่วนกลางที่ใช้ร่วมกันซึ่งอยู่ในไฟล์ใดไฟล์หนึ่งได้หรือไม่
matchifang

มีวิธีง่ายๆในการใส่accountListในคลาสในไฟล์เดียวกันหรือไม่?
GA1

ทำงานได้อย่างมีเสน่ห์วิธีเพิ่มจุดสิ้นสุดที่ได้รับการป้องกันโดยใช้ JWT ในไฟล์. py แยกต่างหาก
Ashok Sri

41

การใช้Blueprintคุณสามารถเพิ่มเส้นทางของคุณในroutesไดเร็กทอรี

โครงสร้าง

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)

หากคุณต้องการเพิ่มไฟล์เส้นทางใหม่บอกว่าaccounts.pyคุณก็ต้องสร้างไฟล์accounts.pyในroutesไดเรกทอรีเช่นเดียวindex.pyและusers.pyจากนั้นนำเข้าไว้ในroutes.__init__.pyแฟ้ม

from .accounts import *

1
มีข้อผิดพลาดในการนำเข้า
Abhishek Jebaraj

การนำเข้ากลางไฟล์ถือได้ว่าเป็นการปฏิบัติที่ไม่ดี?
TomSawyer

3

หากคุณกำลังใช้พิมพ์เขียวและต้องการกำหนดเส้นทาง / เปลี่ยนเส้นทางไปยัง URL ของพิมพ์เขียวของคุณภายในเทมเพลตที่คุณใช้อยู่คุณจำเป็นต้องใช้คำสั่ง url_for ที่ถูกต้อง

ในกรณีของคุณหากคุณต้องการเปิดบัญชี url ของพิมพ์เขียวคุณต้องระบุไว้ในเทมเพลตของคุณ:

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

และสำหรับแอปหลักจะมีลักษณะดังนี้:

redirect(url_for('account_api.account'))

มิฉะนั้นไลบรารี werkzeug จะแสดงข้อผิดพลาด


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.