SQLAlchemy를 사용하여 애플리케이션에서 모델을 올바르게 분리하는 Python 방식

라파 보르게스

내 응용 프로그램을 실행하는 데 어려움을 겪고 있습니다. Flask-SQLAlchemy 확장은 패키지에서 모듈을 분리하려고 할 때마다 빈 데이터베이스를 만듭니다. 내가하는 일을 더 잘 설명하기 위해 프로젝트가 어떻게 구성되어 있는지 보여 드리겠습니다.

Project
|
|-- Model
|   |-- __init__.py
|   |-- User.py
|
|-- Server
|   |-- __init__.py
|
|-- API
|   |-- __init__.py

아이디어는 간단합니다. 단일 패키지로 코드를 퍼뜨리는 것을 좋아하지 않기 때문에 모델 용 패키지를 만들고 앞으로는 블루 프린트를 사용하여 더 나아질 것이므로 별도의 "하위"프로젝트 (예 : API)를 만들고 싶습니다. 하위 앱을 분리합니다.

코드는 매우 간단합니다.

첫째, Model.__init__.py:

from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()

SQLAlchemy()패키지 전체에 단일 객체 를 사용하기 위해서만 이것을 만들었습니다 . 아니요, Model.User로 이동합니다.

from Model import db

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    Name = db.Column(db.String(80))
    Age = db.Column(db.Integer)
    ...

동일한 db 개체를 허용하는 데 사용한 from Model import db를 다시 한 번 확인합니다.

마지막으로 다음과 같이 Server.__init__.py진행됩니다.

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import Model, API
db = Model.db


def main():
    app = Flask("__main__")
    db = SQLAlchemy(app)
    db.create_all()
    API.SetAPIHookers(app)
    app.run(host="0.0.0.0", port=5000, debug=True)

if __name__ == "__main__":
    main()

내 관점에서 보면 db = SQLAlchemy(app)순환 참조를 만들지 않고도 앱 개체를 전달할 수 있습니다.

문제는이 코드를 실행할 때마다 sqlite 데이터베이스 파일이 비어 있다는 것입니다. 그것은 아마도 파이썬이 내가 생각했던 것과 같은 것을 가져 오지 않는다고 생각하게 만들었다. 그래서 가져 오기 모델을 제거하고 서버 내부에서 직접 사용자를 생성하여 내 이론을 테스트했습니다.

이제 내 질문이 온다 : 내가 원하는대로 모듈을 올바르게 분리하는 '파이썬'방법이 있습니까 아니면 모든 것을 동일한 패키지에 두어야합니까?

마크 힐 드레스

지금은 " Application Factory "패턴 (Flask 문서에서 불림) 과 대략적으로 동등한 것을 사용하여 애플리케이션을 설정했습니다 . 이것은 Python 아이디어가 아니라 Flask 아이디어입니다. 몇 가지 장점이 있지만 init_appSQLAlchemy 생성자가 아닌 메서드를 사용하여 SQLAlchemy 개체를 초기화하는 등의 작업을 수행해야 함을 의미하기도합니다 . 이 방법으로 "잘못된"것은 없지만 응용 프로그램 컨텍스트create_all() 내에서 와 같은 메서드를 실행해야 함을 의미합니다. 현재는 메서드 에서 실행하려고하면 그렇지 않습니다 .main()

이 문제를 해결할 수있는 몇 가지 방법이 있지만 원하는 방법을 결정하는 것은 귀하에게 달려 있습니다 (정답 없음).

애플리케이션 팩토리 패턴을 사용하지 마십시오.

이런 식으로 함수에서 앱을 만들지 않습니다. 대신 어딘가에 배치합니다 (예 :) project/__init__.py. 귀하의 project/__init__.py파일을 가져올 수 있습니다 models그동안, 패키지를 models패키지를 가져올 수 있습니다 app에서 project. 이것은 순환 참조이지만 에서 가져 오기 시도하기 전에 먼저 패키지 app에서 객체를 생성 하는 한 괜찮 습니다 . 패키지를 여러 패키지로 분할 할 수 있지만 이러한 다른 패키지가 순환 참조 를 사용하여 객체 를 사용할 수 있도록하는 예 더 큰 애플리케이션 패턴에 대한 Flask 문서를 참조하세요. 문서는 심지어 다음과 같이 말합니다.projectmodelapppackageapp

모든 파이썬 프로그래머는 그것들을 싫어하지만 우리는 순환 가져 오기를 추가했습니다. [...] 이것은 일반적으로 나쁜 생각이지만 여기에서는 실제로 괜찮습니다.

이렇게하면 생성자에서 앱에 대한 참조를 Models/__init__.py사용하여 SQLAlchemy개체 를 빌드하도록 파일을 변경할 수 있습니다 . 이러한 방식으로 Flask-SQLAlchemy 설명서에 설명 된대로 개체 create_all()drop_all()메서드를 사용할 수 있습니다 .SQLAlchemy

현재 상태를 유지하되 request_context ()에서 빌드하십시오.

지금 가지고있는 작업을 계속하면 (함수에서 앱 만들기), 생성자의 일부로 개체를 사용하지 않고 패키지 에서 SQLAlchemy개체 를 빌드해야합니다 (완료 한대로). 주요 방법에서 변경 ...Modelsapp

db = SQLAlchemy(app)

...에게 ...

db.init_app(app)

그런 다음 create_all()메서드를 애플리케이션 컨텍스트 내부의 함수로 이동해야합니다 . 프로젝트 초기에 이것을 수행하는 일반적인 방법은 before_first_request()데코레이터 를 활용하는 것입니다 ....

app = Flask(...)

@app.before_first_request
def initialize_database():
    db.create_all()

"initialize_database"메소드는 첫 번째 요청이 Flask에서 처리되기 전에 실행됩니다. 다음 app_context()방법 을 사용하여 언제든지이 작업을 수행 할 수도 있습니다 .

app = Flask(...)
with app.app_context():
    # This should work because we are in an app context.
    db.create_all()

애플리케이션 팩토리 패턴을 계속 사용하려면 애플리케이션 컨텍스트가 작동하는 방식을 실제로 이해해야합니다. 처음에는 혼란 스러울 수 있지만 "응용 프로그램이 db 인스턴스에 등록되지 않았고 현재 컨텍스트에 바인딩 된 응용 프로그램이 없습니다"와 같은 오류가 무엇을 의미하는지 알아야합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

쉘에서 애플리케이션을 "올바르게"시작하는 방법

분류에서Dev

이벤트 소스 저축 계좌 애플리케이션에서이자 누적을 올바르게 모델링하는 방법은 무엇입니까?

분류에서Dev

MVVM Android 애플리케이션에서 리포지토리 패턴과 라이브 데이터를 사용하여 목록을 올바르게 정렬하는 방법은 무엇입니까?

분류에서Dev

일반 Python 애플리케이션을 PySpark 버전으로 올바르게 변환하는 방법

분류에서Dev

AC # 애플리케이션에서 API 자격 증명을 올바르게 보호하는 방법

분류에서Dev

모바일 애플리케이션 용 Android Studio에서 CNN Keras 모델을 사용하는 방법

분류에서Dev

dart에서 jsonEncode / jsonDecode를 사용하여 모델을 문자열로 올바르게 전달하는 방법

분류에서Dev

학습 된 keras 모델을 사용하여 Android 애플리케이션에서 분류를 수행하는 방법

분류에서Dev

React js 애플리케이션을 MongoDB 데이터베이스에 올바르게 연결하는 방법

분류에서Dev

Windows Store (2016)에서 모바일 애플리케이션을 올바르게 게시 취소 (제거)하는 방법

분류에서Dev

Startup-ipi를 올바르게 사용하여 애플리케이션 프로세서를 시작하는 방법은 무엇입니까?

분류에서Dev

헤더와 데이터를 사용하여 Python에서 http 요청을 올바르게 수행하는 방법

분류에서Dev

Thymeleaf를 사용하도록 SpringMVC 4 애플리케이션을 올바르게 구성하는 방법은 무엇입니까?

분류에서Dev

malloc ()을 사용하여 메모리를 올바르게 할당하는 방법을 이해하기 어려움

분류에서Dev

반응 후크를 사용하여 동적 양식을 올바르게 처리하는 방법 useState

분류에서Dev

여러 파일을 사용하여 Python에서 다중 처리를 올바르게 사용하는 방법은 무엇입니까?

분류에서Dev

OLeDB 쿼리를 사용하여 DataTable을 올바르게 채우는 방법

분류에서Dev

예측 모델이있는 Python 함수를 Flask 애플리케이션에 적용하는 방법

분류에서Dev

PHP 애플리케이션에서 DB 쿼리를 올바르게 주석 처리하는 방법은 무엇입니까?

분류에서Dev

Python을 사용하여 JSON에 데이터를 올바르게 추가하는 방법

분류에서Dev

Webpack을 사용하여 AngularJS 애플리케이션 (1.x)에서 TypeScript를 사용하는 방법

분류에서Dev

URL 체계를 사용하여 Xamarin iOS의 내 애플리케이션에서 다른 애플리케이션을 여는 방법

분류에서Dev

Python에서 하위 프로세스를 사용하여 OSX 애플리케이션을 정상적으로 종료하는 방법

분류에서Dev

모델 내에서 Tensorflow 함수를 올바르게 사용하는 방법

분류에서Dev

공백이있는 인수를 사용하여 Bash에서 애플리케이션을 호출하는 방법

분류에서Dev

IIS에서 CGI를 사용하여 Python 애플리케이션을 배포하는 방법은 무엇입니까?

분류에서Dev

C # 애플리케이션을 올바르게 종료하고 모든 리소스를 해제합니다.

분류에서Dev

javaee, javafx, jpa를 사용하여 애플리케이션 레이어를 올바르게 설정하는 방법은 무엇입니까?

분류에서Dev

iOS에서 빠른 애플리케이션을 사용하여 Wi-Fi를 공유하는 방법

Related 관련 기사

  1. 1

    쉘에서 애플리케이션을 "올바르게"시작하는 방법

  2. 2

    이벤트 소스 저축 계좌 애플리케이션에서이자 누적을 올바르게 모델링하는 방법은 무엇입니까?

  3. 3

    MVVM Android 애플리케이션에서 리포지토리 패턴과 라이브 데이터를 사용하여 목록을 올바르게 정렬하는 방법은 무엇입니까?

  4. 4

    일반 Python 애플리케이션을 PySpark 버전으로 올바르게 변환하는 방법

  5. 5

    AC # 애플리케이션에서 API 자격 증명을 올바르게 보호하는 방법

  6. 6

    모바일 애플리케이션 용 Android Studio에서 CNN Keras 모델을 사용하는 방법

  7. 7

    dart에서 jsonEncode / jsonDecode를 사용하여 모델을 문자열로 올바르게 전달하는 방법

  8. 8

    학습 된 keras 모델을 사용하여 Android 애플리케이션에서 분류를 수행하는 방법

  9. 9

    React js 애플리케이션을 MongoDB 데이터베이스에 올바르게 연결하는 방법

  10. 10

    Windows Store (2016)에서 모바일 애플리케이션을 올바르게 게시 취소 (제거)하는 방법

  11. 11

    Startup-ipi를 올바르게 사용하여 애플리케이션 프로세서를 시작하는 방법은 무엇입니까?

  12. 12

    헤더와 데이터를 사용하여 Python에서 http 요청을 올바르게 수행하는 방법

  13. 13

    Thymeleaf를 사용하도록 SpringMVC 4 애플리케이션을 올바르게 구성하는 방법은 무엇입니까?

  14. 14

    malloc ()을 사용하여 메모리를 올바르게 할당하는 방법을 이해하기 어려움

  15. 15

    반응 후크를 사용하여 동적 양식을 올바르게 처리하는 방법 useState

  16. 16

    여러 파일을 사용하여 Python에서 다중 처리를 올바르게 사용하는 방법은 무엇입니까?

  17. 17

    OLeDB 쿼리를 사용하여 DataTable을 올바르게 채우는 방법

  18. 18

    예측 모델이있는 Python 함수를 Flask 애플리케이션에 적용하는 방법

  19. 19

    PHP 애플리케이션에서 DB 쿼리를 올바르게 주석 처리하는 방법은 무엇입니까?

  20. 20

    Python을 사용하여 JSON에 데이터를 올바르게 추가하는 방법

  21. 21

    Webpack을 사용하여 AngularJS 애플리케이션 (1.x)에서 TypeScript를 사용하는 방법

  22. 22

    URL 체계를 사용하여 Xamarin iOS의 내 애플리케이션에서 다른 애플리케이션을 여는 방법

  23. 23

    Python에서 하위 프로세스를 사용하여 OSX 애플리케이션을 정상적으로 종료하는 방법

  24. 24

    모델 내에서 Tensorflow 함수를 올바르게 사용하는 방법

  25. 25

    공백이있는 인수를 사용하여 Bash에서 애플리케이션을 호출하는 방법

  26. 26

    IIS에서 CGI를 사용하여 Python 애플리케이션을 배포하는 방법은 무엇입니까?

  27. 27

    C # 애플리케이션을 올바르게 종료하고 모든 리소스를 해제합니다.

  28. 28

    javaee, javafx, jpa를 사용하여 애플리케이션 레이어를 올바르게 설정하는 방법은 무엇입니까?

  29. 29

    iOS에서 빠른 애플리케이션을 사용하여 Wi-Fi를 공유하는 방법

뜨겁다태그

보관