Python Flask 앱을 ​​여러 파일로 분할


88

플라스크 앱을 여러 파일로 분할하는 방법을 이해하는 데 문제가 있습니다.

웹 서비스를 만들고 있는데 API를 다른 파일 (AccountAPI.py, UploadAPI.py, ...)로 나누고 싶습니다. 그래서 거대한 파이썬 파일이 하나도 없습니다.

블루 프린트로이 작업을 수행 할 수 있다는 것을 읽었지만 경로가 나에게 적합한 경로인지 완전히 확신 할 수 없습니다.

궁극적으로 하나의 Main 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"

이 예제에서는 분명히 작동하지 않을 것이라는 것을 알고 있지만 이와 같은 작업을 수행 할 수 있습니까?

감사

답변:


159

예, 블루 프린트가 올바른 방법입니다. 다음과 같이하려는 작업을 수행 할 수 있습니다.

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"

이것이 옵션 인 경우 명확하게 구분하기 위해 서로 다른 API / Blueprint에 대해 서로 다른 URL 접두사를 사용하는 것을 고려할 수 있습니다. 위의 register_blueprint호출 을 약간 수정하면됩니다 .

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

추가 문서 는 공식 문서 를 참조 할 수도 있습니다 .


이것은 나를 위해 완벽하게 작동했습니다. 블루 프린트 문서를 좀 더주의 깊게 읽어야했던 것 같습니다.
user1751547

이봐 요, 질문이 있습니다. 위의 코드에서 accountList ()의 url이 'domain / accounts / account'와 일치합니까?
jeyraof 2013 년

4
Main.py 및 AccountAPI.py가 파일 중 하나에있는 공유 전역 변수를 가질 수 있습니까?
matchifang

accountList같은 파일의 클래스 안에 넣는 간단한 솔루션이 있습니까?
GA1 2017-07-14

마법처럼 일했다, 별도의 평 파일에 JWT를 사용하여 보호 끝점을 추가하는 또 다른 방법
쇼크 스리랑카를

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

Blueprint를 사용하고 있고 사용중인 템플릿 내에서 Blueprint의 URL로 라우팅 / 리디렉션하려면 올바른 url_for 문을 사용해야합니다.

귀하의 경우 청사진의 URL 계정을 열려면 템플릿에 다음 과 같이 명시해야합니다 .

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

메인 앱의 경우 다음과 같습니다.

redirect(url_for('account_api.account'))

그렇지 않으면 werkzeug 라이브러리에서 오류가 발생합니다.


1

이를 수행하는 또 다른 방법은 필요에 따라 명시 적으로 뷰 함수를 첨부 하는 lazy loading 을 사용하는 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.