2013-01-05 2 views
0

파이썬에서 긴 폴링에 관한 몇 가지 스레드를 보았지만 내 문제는 토네이도 등의 추가 키트를 사용하는 것이 조금 아닙니다. js 클라이언트가 있습니다. 그것은/longpolling 페이지에 요청을 보내고 응답을 기다립니다. 일단 응답이나 타임 아웃이 발생하면 새로운 응답을 보냅니다. 이것은 잘 작동하고 있습니다. 내/longpolling 핸들러 함수입니다 :Simpliest python long polling

currentTime = datetime.datetime.now() 
lastUpdate = datetime.datetime.strptime(req.GET["ts"], "%Y-%m-%dT%H:%M:%S.%f") 
response = { 
    "added": [], 
    "updated": [], 
    "deleted": [] 
} 
while (datetime.datetime.now() - currentTime).seconds < 600: 
    time.sleep(2) 
    now = datetime.datetime.now() 
    #query = Log.objects.filter(time__range = (lastUpdate, now)) 
    query = Log.objects.raw("SELECT * FROM ...log WHERE time BETWEEN %s and %s", [lastUpdate, now]) 
    exist = False 
    for log in query: 
     exist = True 
     type = { 
      NEW: "added", 
      UPDATED: "updated", 
      DELETED: "deleted" 
     }[log.type] 
     response[type].append(json.loads(log.data)) 
    if exist: 
     response["ts"] = now.isoformat() 
     return JsonResponse(response) 
response["ts"] = datetime.datetime.now().isoformat() 
return JsonResponse(response) 

내가 JS 클라이언트를 통지하는 DB의 새로운 로그인 인스턴스를 확인하려면 10 분 동안 매 2 초. phpMyAdmin을 통해 로그 레코드를 수동으로 삽입하려고 시도했지만 다음 Log.objects.filter (time__range = (lastUpdate, now))는 빈 QuerySet을 반환합니다. .query attr의 원시 쿼리를 복사합니다.

SELECT ... FROM ... 사이에 어디에서 ... 2013-01-05 03:30:36 및 2013-01-05 03:45:18

따라서 2013-01-05 03:30:36 및 2013-01-05 03:45:18을 인용하여 phpMyAdmin을 통해이 SQL을 실행하고 추가 된 레코드를 반환했습니다. 나는 tryed :

쿼리 = Log.objects.filter (time__range 지금 = (LASTUPDATE))

쿼리 = Log.objects.raw ("SELECT * FROM ... 로그 WHERE %의 S와 % S ", [지금 LASTUPDATE,]) 사이의 시간

012,351,
query.iterate에서 로그()에 대한

:

그러나 그것은 항상 빈 검색어 세트하지만 결코 내 추가 된 레코드를 반환합니다. 캐싱이 있다고 생각하지만 어디서? 또는 True : 루프가 수행되고있는 동안 까지 새 레코드를 삽입하는 것이 문제입니까? 아니면 일부 스레드 보호가 있습니까? 왜 phpMyAdmin은 레코드를 참조하지만 장고는 그렇지 않습니까? 도와주세요, 제가 붙어 있습니다.

+1

쿼리하기 바로 전에 django 코드를 사용하여 로그 항목을 삽입 해보십시오. 어쩌면 phpMyAdmin을 django를 가리키는 곳과 다른 데이터베이스에서 가리키는 것이 가능합니까? 디버그와 프로덕션 DB 또는 다른 것의 차이점은 무엇입니까? – dokkaebi

+0

방금 ​​전에 새로운 로그 항목을 삽입하는 것이 좋습니다. 시도하고 대답하겠습니다. 그리고 아니, 그들은 동일한 데이터베이스에 연결되어 있습니다. –

+0

Okey, 쿼리하기 전에 새 로그 항목을 만들면 QuerySet에서 가져오고 응답 개체에 올바르게 추가되어 클라이언트에 응답합니다. 클라이언트가 예상대로 새 요청을 보낸 후에 지금 무엇을해야합니까? –

답변

1

이 문제가 발생하지 않아 확실하지 않습니다. 당신이 의견에 링크 된 스레드 @ DanielRoseman의 답변에 따라이 작업을 수행 할 수 있습니다

with transaction.commit_on_success(): 
    query = Log.objects.raw("SELECT * FROM ...log WHERE time BETWEEN %s and %s", [lastUpdate, now]) 

그것은 당신이 당신의 로그 항목을 삽입 라인을 포장 할 것이다, 그러나, 가능성이 보인다 commit_on_success 데코레이터. 나는 당신의 코드에서 로그 엔트리가 어디에 삽입되어 있는지 모르겠습니다.

관련 문제