2014-12-31 3 views
4

파이썬/플라스크 응용 프로그램을 작성 중이며 서버를 다시로드하는 기능을 추가하려고합니다.기능별 파이썬 플라스크 서버 새로 고침

나는 현재 다음과 같은 결과 다음과 같은 옵션

app.run(debug=True) 

와 서버를 실행하고있어, 때마다 코드를 변경 그러나 프로덕션 환경에서는

* Running on http://127.0.0.1:5000/ 
* Restarting with reloader 

를 발생, 차라리 것 debug=True을 설정하지 않아도되지만 필요할 때마다 응용 프로그램 서버 만 다시로드 할 수 있어야합니다.

나는 작업 두 가지를 얻으려고 :

  1. if reload_needed: reload_server()하고, 사용자가 관리자 패널에서 "새로 고침 서버"버튼을 클릭하면
  2. 에서, reload_server() 함수가 호출되어야한다.

그러나 코드가 변경된 후에 서버가 다시로드 되더라도 정확히 할 수있는 기능을 찾을 수 없었습니다.

가능한 경우 flask/werkzeug 내부 기능을 사용하고 싶습니다. 나는 gunicorn/nginx/apache 등과 같은 것들을 추가함으로써 내가 그런 것을 성취 할 수 있다는 것을 알고있다.

+0

이 WERKZEUG 관련 기능 같은데, 예를 들어 https://github.com/mitsuhiko/werkzeug/ blob/f9d0f4e74a78848740c53d7d7256487aa81a1be8/werkzeug/_reloader.py는 파일 시스템에서 (직접 또는'os.stat'를 통해) 재로드를 트리거하기 위해 심하게 하드 코딩되어 있습니다. _reloader를 수정해야한다고 생각합니다.py를 사용하고 파일 시스템이 아닌 트리거를 통해 다시로드 할 수 있도록 werkzeug의 작성자에게 패치를 제공하십시오. –

답변

2

나는 똑같은 문제를 안고 있다고 생각한다.

그래서 파이썬/플라스크 응용 프로그램 (XY.py)이 클라이언트에 있습니다. 나는이 파이썬 코드를 클라이언트에 배포하는 빌드 단계 (Teamcity)를 작성했습니다. XY.py가 이미 클라이언트에서 실행되고 있다고 가정 해 봅시다. 이 새로운/고정/수정 된 XY.py를 배포 한 후 실행중인 코드의 변경 사항을 적용하기 위해 다시 시작해야했습니다.

내가 겪었던 문제는 onlininer를 다시 시작한 후 os.execl(sys.executable, *([sys.executable]+sys.argv)) 내 포트가 앱에서 사용하는 포트가 여전히 사용 중이거나 설정 되었기 때문에 다시 시작한 후에 연결할 수 없습니다.

다음은 문제를 해결 한 방법입니다. 내 앱을 별도의 프로세스에서 실행하도록 배치하고 대기열을 만들었습니다. 좀 더 깨끗하게 보려면 여기를 누르십시오.

global some_queue = None 

@app.route('/restart') 
def restart(): 
    try: 
    some_queue.put("something") 
    return "Quit" 

def start_flaskapp(queue): 
    some_queue = queue 
    app.run(your_parameters) 

하면 메인이 추가 :

q = Queue() 
p = Process(target=start_flaskapp, args=[q,]) 
p.start() 
while True: #wathing queue, sleep if there is no call, otherwise break 
    if q.empty(): 
     time.sleep(1) 
    else: 
     break 
p.terminate() #terminate flaskapp and then restart the app on subprocess 
args = [sys.executable] + [sys.argv[0]] 
subprocess.call(args) 

은 깨끗하고 충분한 짧았다 희망과 당신에게 도움이!

관련 문제