2012-04-08 3 views
1

GAE python 팀의 의견을 듣고 자합니다.GAE SDK 1.6.4 dev_appserver 데이터 저장소 플러시

dev_appserver 데이터 저장소가 앱 종료시 디스크로 플러시되는 방식과 관련하여 1.6.3, 1.6.4 사이에서 변경된 사항이 있습니까?

저는 django-nonrel을 사용하고 있으며, 1.6.3 이전에는 파이썬 셸을로드 할 수있었습니다. python manage.py 쉘 (manage.py는 django-nonrel에서 제공)

그런 다음 모델을 가져 와서 데이터 저장소를 활성화하고 엔터티를 수정 한 다음 종료 할 수 있습니다.

1.6.4에서이를 수행 할 수 있었지만 종료하면 변경 사항이 데이터 저장소에 저장되지 않습니다. django-nonrel을 WSGI 앱으로 실행하면 제대로 저장되고 나면 종료 메시지가 표시됩니다 ("보류중인 모든 트랜잭션 적용 및 데이터 저장소 저장").

+0

뭔가 바뀌 었습니다. 나는 주변에서 물어볼 것이다. –

+0

감사합니다. Guido, 나는 django-nonrel 픽스를 해킹했다. 필자는 파이썬 셸을 통해 데이터 저장소에 들어가기를 원하는 다른 파이썬 사용자가 비슷한 문제가 있다고 의심합니다. – dragonx

+0

설명 및 출처 링크는 http://stackoverflow.com/questions/10047315/app-engine-local-datastore-content-does-not-persist에 대한 Alfred Fuller의 답변을 참조하십시오. –

답변

3

그의 솔루션과 정보를 이용해 dragonx에게 감사드립니다. Eclipse에서 내 devserver를 실행하고 1.6.4로 업그레이드 한 후 내 데이터가 저장되지 않는 것을보고 놀랐습니다. 모든 웹 요청 후에 데이터베이스에 플러시를 추가하여 모든 요청에 ​​대해 기본 클래스를 구현했으며 재정의 파견 :

developmentServer = False 

if os.environ.get('SERVER_SOFTWARE','').startswith('Development'): 
    developmentServer = True 

class BaseRequestHandler(webapp2.RequestHandler): 
    def dispatch(self): 
     retValue = super(BaseRequestHandler, self).dispatch() 
     if developmentServer: 
       from google.appengine.tools import dev_appserver 
       dev_appserver.TearDownStubs() 

     return retValue 

릴리스 노트에서 그런 행동의 변화를 알리는 내 업그레이드에서 무엇이 잘못되었는지 검색하는 나에게 이일을 저장 한 것입니다.

+0

위의 코드는 Windows에서 작동하지 않습니다. Eclipse를 사용하여 개발 서버 (1)에서 응용 프로그램을 시작하고 (2) Google App Engine Launcher를 사용하여 응용 프로그램을 시작하려고했습니다. 어느 경우 든, (1) Eclipse에서 콘솔을 종료하고 (2) 실행 프로그램에서 응용 프로그램을 중지하면 트랜잭션이 개발 데이터 스토어에 저장되지 않습니다. Windows에서 비슷한 문제가있는 사람은 누구입니까? 이것에 대한 의견을 제시 할 수있는 사람은 누구입니까? – cv12

+0

Windows에서 확인되었지만 작동하지 않습니다. –

+0

나는 이클립스에서 일할 수있는 솔루션을 바꿨다. 데이터베이스 업데이트를 할 때마다 매번 데이터베이스를 저장한다. – user1325188

2

변경된 것처럼 보입니다. 나는 다음과 같은 문제를 해결할 수 있었다.

from google.appengine.tools import dev_appserver 
import atexit 
atexit.register(dev_appserver.TearDownStubs) 

이렇게하면 출구에서 데이터 저장소가 플러시된다.

+0

"python manage.py shell"또는 "python manage.py createsuperuser"를 실행중인 경우. 이 사건들은 전에는 효과가 없었습니다. "python manage.py runserver"를 실행하면 SDK 핸들러에서 한 번, 추가 한 추가 핸들러에서 한 번 두 번 플러시됩니다.SDK에서 빠진 파이썬 셸 exit()를 SIGTERM/KeyInterrupt (예 : SDK에서 가져옴)에서 구별하는 방법을 모르겠다. – dragonx

+0

감사합니다. 내 게시물에서 내가 뭘 잘못했는지 모르겠다. 복사 및 붙여 넣기가 잘못되었지만 소스 트리의 코드는 내가 가진 것입니다. 나는 그것을 고치기 위해 그것을 편집했다. – dragonx

0

1.6.4 이전에는 모든 쓰기 후에 데이터 저장소가 저장되었습니다. 이 방법은 High Replication Datastore에서 발견 된 트랜잭션 모델을 시뮬레이션 할 때 작동하지 않습니다. 그것은 또한 비효율적이다. 데이터 저장소 dev 스텁이 모든 쓰기를 플러시하고 종료시 상태를 저장하도록 변경했습니다. 코드에 따라

: 서버가 (TERM 시그널 또는 KeyInterrupt과) 완전히 종료 된 경우 manage.py 작동합니다 같은

  1. https://bitbucket.org/wkornewald/djangoappengine/src/60c2b3339a9f/management/commands/runserver.py#cl-154
  2. http://code.google.com/p/googleappengine/source/browse/trunk/python/google/appengine/tools/dev_appserver_main.py#683

것 같습니다.

+0

바로 그게 내가보고있는 것입니다. TERM 신호 또는 KeyInterrupt를 사용하여 종료하면 올바르게 플러시됩니다. 파이썬 셸에서 exit()를 사용하여 종료하지 않습니다. 내 위의 게시물을 참조하십시오. 쉘은 KeyInterrupt를 잡아서 파이썬 쉘을 사용할 때 그런 식으로 종료 할 수 없습니다. – dragonx

+1

Alfred, Windows에서 일어날 일에 대해 자세히 설명해 주시겠습니까? 1.6.4 py_dev 디버깅을 멈추거나 실행기에서 응용 프로그램을 중지하지 않습니다. –

관련 문제