MelRanG
719
2021-03-09 13:37:06 작성 2021-03-09 13:38:18 수정됨
4
158

flask로 요청 보낼 때 마다 갱신


안녕하십니까 플라스크로 실행시킨 서버에 변수값이 실시간으로 변경 되는지 체크하고 변경 여부에 따라 다른 문자를 리턴하는 프로그램을 설계하려고 하고 있습니다.

a.py

@app.route("/message")
def spring():
    c = check()
    if c:
        return "도서가 갱신 되었습니다."
    else:
        return "도서가 갱신 되지 않았습니다."

def check():
    return b.is_duplicate()

if __name__ == '__main__':
    app.run(debug=False, host="127.0.0.1", port=5000)


b.py

def is_duplicate():
    a = 1
    if a == 0:
        return False
    else:
        return True


플라스크를 실행시킨 후 b.py의 a값을 1과 0으로 제 마음대로 바꿔도

/message로 요청을 보낸다면 변경된 값에 따라 return메시지가 출력되도록 하고 싶은데

현재는 b.py를 실행시켜 값을 변경한 후 /message를 새로고침 해봐도 변경되지 않습니다.


쓰레싱이 해답일 것 같아 a.py에 쓰레싱을 추가해봤지만 마찬가지로 변경되지 않습니다.

혹시 이 두가지만 활용해서 플라스크에서 다른 파일에 변수값이 변경됐다는 걸 알 수 있는 방법이 있을까요?



0
  • 답변 4

  • WRITE_IN_DART✎
    2021-03-09 16:45:36 작성 2021-03-09 17:25:28 수정됨

    무엇이 하고 싶으신지 잘 모르겠습니다.

    b.py의 변수를 바꾸는데 a.py에서 그 변수에 접근 하려면 공유메모리를 사용하셔야 합니다만, 그걸 하시려고 하는건 아니라고 생각합니다.

    1. 꼭 그 두가지만 써야하는지

    2. 쓰레싱을 추가했다는게 무엇인지, 그 구현과 목적

    3. 꼭 두 스크립트를 분리해야하는지

    4. 기존에 구현하신 전체 코드

    이상의 정보가 있으면 답변이 더 쉬워지지 않을까 합니다.

  • WRITE_IN_DART✎
    2021-03-09 17:02:00
    • 책정보 객체를 정의합니다.

      • 책정보는 책에 관한 정보와 isUpdated 속성을 갖습니다.

      • 책정보updateisDiff 메서드를 갖습니다.

        • isDiff는 새 책정보를 받아 기존의책정보와 비교하고 다르면 true를 반환합니다.

        • updateisDiff메서드를 사용하여 책정보가 다른지 확인하고 다르다면 책정보를 교체하고 isUpdatedtrue로 바꿉니다.

    • 스크립트는 내부적으로 Map<책식별자, 책정보>를 전역변수로 갖습니다.

    • 스크립트는 http endpoint /book/책식별자/updated를 노출하고 해당 endpoint로 요청이 들어오면 대응하는 책정보를 찾아 반환하고 isUpdatedfalse로 바꿉니다.

    • 스크립트는 주기적으로 쓰레드를 생성해 책 정보를 업데이트합니다.

    이렇게 하면 하나의 스크립트와 쓰레드를 사용하여 동작 가능합니다.

  • WRITE_IN_DART✎
    2021-03-09 17:11:04

    대충 이런식으로 하면 될 것 같습니다.

    type BookItem {
      isUpdated: bool = false
      bookInfo: BookInfo
       
      isUpdated(bookInfo: BookInfo) : bool {
          return this.bookInfo == bookinfo
      }
       
      update(bookInfo: BookInfo) : {
          if isUpdated(bookInfo){
              this.isUpdated = true
              this.bookInfo = bookInfo
          }      
      }
    }

    var BookManager: Map<BookId, BookItem>

    @app.route("/book/:id/updated")
    func spring(request) {
      var id = request.param.id
      return bookManager.id.isUpdated
    }

    func updateManager() {
      delay(12hour)
      // update books
    }

    thread.run(updateManager)
    app.run()

  • WRITE_IN_DART✎
    2021-03-09 17:19:46 작성 2021-03-09 17:22:06 수정됨

    두 스크립트를 별개의 프로그램으로 분리하고 싶으시면 IPC에 대해 알아보셔야합니다.

    Shared Momory, Signal 이 두개는 굉장히 low level이고,

    Socket, http api, RPC등을 사용 할 수 있습니다.


    이 경우에는 http api가 제일 무난해보이네요.

    flask서버는 값을 받는 end point를 추가로 노출하고 다른 스크립트에서 http client로 동작하면 됩니다.

  • 로그인을 하시면 답변을 등록할 수 있습니다.