Python Flask 앱은 웹을 처리하고 웹 소켓을 사용하여 다른 앱과 통신합니다.

양고기

다음을 위한 앱을 만들고 있습니다.

  1. 웹 페이지 요청 처리(db 읽기/쓰기)

  2. websockets 클라이언트가 다른 시스템과 통신하기 때문에(db 읽기/쓰기);

Python Flask 프레임워크를 사용하고 있습니다.

웹 페이지를 제공하고 템플릿을 렌더링하는 간단한 앱이 있으면 모두 괜찮습니다. 구현된 SQLAlchemy 단순 데이터베이스 - 웹 페이지에서 잘 작동합니다.

일부 정보를 쿼리하고 해당 정보를 내 로컬 데이터베이스에 저장하기 위해 일부 외부 시스템과 통신하기 위해 웹 소켓 클라이언트를 구현했습니다.

이 웹 소켓 클라이언트는 외부 시스템과 비동기식으로 통신하기 위해 별도의 스레드로 구현했습니다. 이 스레드는 정상적으로 작동합니다.

문제는 데이터베이스 액세스 및 사용에 있습니다. websockets 클라이언트 스레드에서 데이터베이스를 사용하려고 할 때 "RuntimeError: Working outside of application context" 오류가 발생합니다. 또는 "RuntimeError: 응용 프로그램을 찾을 수 없습니다. 보기 기능 내에서 작업하거나 응용 프로그램 컨텍스트를 푸시하십시오."

아래 내 코드를 참조하십시오(단순화). 나는 app_context로 플레이하려고 했지만 올바른 방법을 찾지 못했습니다.

동일한 앱의 외부 시스템에 대한 Flask 웹 앱 및 Websockets 클라이언트의 접근 방식이 나쁜 생각일까요? 다른 접근 방식을 선택해야 합니까?

대부분의 Flask 앱 및 Websockets 샘플은 웹 페이지와 웹 소켓이 함께 작동하는 방식으로 빌드됩니다. 그러나 내 상황에서는 외부 시스템과 통신하고 수신된 데이터를 다른 쪽 끝에서 웹 페이지 렌더링에 사용되는 동일한 데이터베이스에 저장하기 위해 websockets 클라이언트가 필요합니다.

class MyDataModel(db.Model):
  title = db.Column(db.String(80), unique=True, nullable=False, primary_key=True)

  def __repr__(self):
    return "<Title: {}>".format(self.title)

class WSClientThread(Thread):

  def on_message(ws, message):
    from flask import current_app
    # -----> PROBLEM HERE !!!
    with current_app.app_context():
      db.session.add(MyDataModel(title='AAA222'))
      db.session.commit()
    # <------ PROBLEM !!!

  def __init__(self):
    self.wsa = websocket.WebSocketApp('ws://IP:PORT', on_message=self.on_message)
    super(WSClientThread, self).__init__()

  def send(self, msg):
    self.wsa.send(msg)

  def run(self):
    self.wsa.run_forever()

Flask 앱 코드 생성:

def create_app(test_config=None):
    app = Flask(__name__, instance_relative_config=True)

    with app.app_context():
        db.init_app(app)

    wsc = WSClientThread()
    wsc.start()

    app.add_url_rule("/", endpoint="index")

    return app

데이터베이스 초기화 코드:

db = SQLAlchemy()

def init_app(app):
    app.cli.add_command(init_db_command)
    db.init_app(app)

@click.command("init-db")
@with_appcontext
def init_db_command():
    init_db()

def init_db():
    db.drop_all()
    db.create_all()
    # test data insert - works OK
    db.session.add(MyDataModel(title='AAA'))
    db.session.commit()
양고기

여기서 문제는 동일한 데이터베이스에 다른 스레드에서 액세스하는 방법입니다. 그리고 이 문제에 대한 해결책은 이 별도의 스레드를 위한 전용 db 세션을 만드는 것입니다.

다음과 같습니다.

  db_engine = create_engine(dburl, echo=False)
  DBSession = scoped_session(
    sessionmaker(
      autoflush=True,
      autocommit=False,
      bind=db_engine))
  DBSession.add(MyDataModel(title='AAA'))
  DBSession.commit()

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

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

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Python을 사용하여 JSON을 사용하여 웹 소켓과 통신

rest-api를 제공하고 웹 소켓을 처리하는 node.js 앱이 좋은 생각입니까?

Angular 앱과 composer-rest-server 간의 통신을 위해 웹 소켓을 사용하는 방법은 무엇입니까?

서비스 계정을 사용하여 Python 3.7에서 Gsheet 웹앱에 액세스하려고합니다.

iOS 앱은 Laravel 웹앱과 통신합니다.

웹 소켓에서받은 값을 다른 웹 소켓으로 전달하는 방법은 무엇입니까?

웹 소켓에서받은 값을 다른 웹 소켓으로 전달하는 방법은 무엇입니까?

fullCalender를 사용하여 작업 표 웹 앱을 만들려고합니다.

작은 웹앱을 구축하고 Wordpress에서 JSON API를 사용하여 작은 웹앱에 wordpress 게시물을 가져 오기 시작했습니다.

Powershell을 사용하여 웹앱의 특정 파일과 폴더를 Blob Storage에 백업하고 싶습니다.

mvc 웹 앱을 사용하여 다른 폴더에 크리스탈 보고서 표시

Quarkus 앱을 사용하여 다른 이전 CGI 웹 앱을 리버스 프록시

웹 소켓을 사용하는 것과 비교하여 매초마다 XMLHttpRequest를 사용할 수 있습니까?

Selenium과 Python을 사용하여 Morningstar 웹 사이트를 스크랩합니다. Selenium은 전체 웹 페이지를 다운로드하지 않습니다.

Python Flask 웹 앱을 배포하는 동안 Heroku가 at=error code=H10을 얻습니다.

클라이언트 측에서 서버 통신을 위해 웹 소켓을 사용하고 싶습니다.

웹 사이트 기능에 따라 웹 소켓 앱을 분리하면 어떤 이점이 있습니까?

비보안 웹 소켓 연결을 통해 통신해야하는 웹 사이트에서 getUserMedia를 사용합니다.

소켓을 제외하고 웹으로 Java와 Python 간에 통신하는 빠른 방법이 있습니까?

django를 react 및 webpack과 통합하여 다중 페이지 웹앱을 만드는 방법은 무엇입니까?

하나의 Flask 앱을 사용하여 여러 웹 페이지를 구현할 수 있습니까?

pythonanywhere를 사용하여 웹에 Python Flask 앱 배포

웹 소켓을 사용하는 web2py 앱을 어디에 배포합니까?

IIS에서 웹 앱을 게시하면 다른 오류가 발생합니다.

한 줄의 코드로 Flask 및 Python을 사용하여 Windows 10에서 로컬로 웹앱 호스팅 [Answered]

Angular 앱을 Vanilla JS 웹앱과 통합

Heroku에 내 웹 앱을 업로드하려고합니다.

다국어 Go 웹 앱을 처리하는 표준 / 관용적 방법은 무엇입니까?

Python에서 beautifulsoup을 사용하여 웹 페이지의 결과 목록을 작성하려고합니다.