จะแบ่งแอพพลิเคชั่นขวดเป็นหลาย ๆ ไฟล์ได้อย่างไร


146

ขณะนี้แอปพลิเคชันขวดของฉันประกอบด้วยtest.pyไฟล์เดียวที่มีหลายเส้นทางและmain()เส้นทางที่กำหนดไว้ มีวิธีที่ฉันสามารถสร้างtest2.pyไฟล์ที่มีเส้นทางที่ไม่ได้จัดการtest.pyหรือไม่?

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

ฉันกังวลว่ามีเส้นทางมากเกินไปtest.pyและต้องการทำให้มันเป็นแบบที่ฉันสามารถวิ่งpython test.pyได้ซึ่งจะรับเส้นทางในtest.pyราวกับว่ามันเป็นส่วนหนึ่งของไฟล์เดียวกัน การเปลี่ยนแปลงใดที่ฉันต้องทำในtest.pyและ / หรือรวมไว้ในtest2.pyการทำให้สิ่งนี้ทำงานได้

คำตอบ:


153

คุณสามารถใช้โครงสร้างแพ็คเกจ Python ตามปกติเพื่อแบ่งแอพของคุณเป็นหลาย ๆ โมดูลดูเอกสาร Flask

อย่างไรก็ตาม

Flask ใช้แนวคิดของพิมพ์เขียวสำหรับการทำส่วนประกอบแอปพลิเคชันและสนับสนุนรูปแบบทั่วไปภายในแอปพลิเคชันหรือข้ามแอปพลิเคชัน

คุณสามารถสร้างองค์ประกอบย่อยของแอปของคุณเป็นพิมพ์เขียวในไฟล์แยกต่างหาก:

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

จากนั้นใช้งานในส่วนหลัก:

from yourapplication.simple_page import simple_page

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

พิมพ์เขียวยังสามารถรวมทรัพยากรเฉพาะ: แม่แบบหรือไฟล์คงที่ โปรดดูเอกสาร Flaskสำหรับรายละเอียดทั้งหมด


1
เราจะมีพิมพ์เขียวเส้นทางในไฟล์อื่น ๆ ที่เริ่มต้นของพิมพ์เขียวนั้นได้อย่างไร
divyenduz

ถ้าฉันต้องการสร้างจุดสิ้นสุดที่ปลอดภัยโดยใช้ JWT แล้วจะทำเช่นนั้นในไฟล์ route.py ได้อย่างไร
Ashok Sri

19

คุณสามารถใช้เคล็ดลับง่าย ๆ ซึ่งเป็นการนำเข้าตัวแปรแอพพลิเคชั่นขวดจากหลักภายในไฟล์อื่นเช่น:

test-routes.py

from __main__ import app

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

และในไฟล์หลักที่คุณประกาศแอพพลิเคชั่นขวดนำเข้าเส้นทางทดสอบเช่น:

app.py

from flask import Flask, request, abort

app = Flask(__name__)

# import declared routes
import test-routes

มันทำงานได้จากด้านข้างของฉัน


2
มันเป็นเพียงตัวอย่างเท่านั้น__main__อ้างถึงไฟล์บันทึกของคุณนั่นแหละ!
nimeresam

3
ยอดเยี่ยมขอบคุณมาก พิมพ์เขียวหรือวิธีการแพคเกจข้างต้นเป็น overkills สำหรับแอปขนาดเล็ก
VH-NZZ

นี่คือลิงค์ไปยังเอกสารที่อธิบายวิธีการนี้: https://flask.palletsprojects.com/en/1.1.x/patterns/packages/
Christopher

1
@nimeresam มันใช้งานได้สำหรับฉัน แต่ฉันต้องเรียนรู้ว่าimport test-routesไม่สามารถอยู่ด้านบนสุดของapp.pyไฟล์ มันเกิดข้อผิดพลาดของ gunicorn แต่หลังจากย้ายการนำเข้าไปยังด้านล่างของไฟล์แล้วก็ใช้งานได้ "เพียงตรวจสอบให้แน่ใจว่ามีการนำเข้าโมดูลและเรากำลังทำเช่นนั้นที่ด้านล่างของไฟล์"
Niklas R.


5

การแบ่งแอพออกเป็นพิมพ์เขียวเป็นความคิดที่ดี อย่างไรก็ตามหากนี่ยังไม่เพียงพอและหากคุณต้องการแบ่งพิมพ์เขียวออกเป็นหลาย ๆ ไฟล์ก็สามารถทำได้โดยใช้ระบบการนำเข้าโมดูล Python ปกติแล้ววนซ้ำเส้นทางทั้งหมดที่นำเข้าจากไฟล์อื่น .

ฉันสร้าง Gist ด้วยรหัสสำหรับทำสิ่งนี้:

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

เท่าที่ฉันทราบนี่เป็นวิธีเดียวที่เป็นไปได้ในการแบ่งพิมพ์เขียวในขณะนี้ เป็นไปไม่ได้ที่จะสร้าง "พิมพ์เขียวย่อย" ใน Flask แม้ว่าจะมีปัญหาเกิดขึ้นกับการเปิดอภิปรายจำนวนมากเกี่ยวกับเรื่องนี้:

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

นอกจากนี้แม้ว่าจะเป็นไปได้ (และอาจเป็นไปได้ที่จะใช้ตัวอย่างบางส่วนจากเธรดปัญหานั้น) พิมพ์เขียวย่อยอาจ จำกัด มากเกินไปสำหรับกรณีการใช้งานของคุณต่อไป - เช่นหากคุณไม่ต้องการเส้นทางทั้งหมดใน โมดูลย่อยที่จะมีคำนำหน้าย่อย URL เดียวกัน


4

งานนี้สามารถทำได้โดยไม่ต้องพิมพ์เขียวและนำเข้าที่ยุ่งยากโดยใช้การแมป URL จากส่วนกลาง

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