2012-08-31 2 views

답변

9

참고로, "현재 로그인되어 있습니다"는 잘 정의 된 개념이 아닙니다. 로그인 할 수 있지만 컴퓨터에서 멀어 지거나 브라우저를 닫을 수 있습니다. 이 경우 아직 로그인 했습니까? 로그인 한 것으로 간주해서는 안되지만 서버가 사용자가 떠나거나 브라우저를 종료 한 것을 알지 못합니다. Auth 시스템은 auth_events 테이블에 로그인 및 로그 아웃 이벤트를 기록하므로 정의 된 기간 내에 로그인했지만 명시 적으로 로그 아웃하지 않은 모든 사용자를 찾는 것이 하나의 옵션입니다. 일부는 명시 적으로 로그 아웃하지 않고 사이트를 떠났을 수 있으므로 로그인 한 사용자의 수를 과장 할 수 있습니다. 여기에 몇 가지 코드가 있습니다 :

import datetime 
limit = request.now - datetime.timedelta(minutes=30) 
query = db.auth_event.time_stamp > limit 
query &= db.auth_event.description.contains('Logged-') 
events = db(query).select(db.auth_event.user_id, db.auth_event.description, 
    orderby=db.auth_event.user_id|db.auth_event.time_stamp) 
users = [] 
for i in range(len(events)): 
    last_event = ((i == len(events) - 1) or 
        events[i+1].user_id != events[i].user_id) 
    if last_event and 'Logged-in' in events[i].description: 
     users.append(events[i].user_id) 
logged_in_users = db(db.auth_user.id.belongs(users)).select() 

위의 내용은 지난 30 분 내에 로그인했지만 명시 적으로 로그 아웃되지 않은 모든 사용자를 보여줍니다.

더 복잡한 접근 방법은 로그인 한 사용자의 요청을 추적하여 누가 누가 애플리케이션을 적극적으로 사용하고 있는지 확인하는 것입니다. 로그인 한 각 사용자에 대한 가장 최근 요청의 시간 소인을 저장하는 사전을 캐시 할 수 있습니다. 보고서가 요청되면 최근 일정 시간 내에 타임 스탬프가있는 사용자를 표시하고 캐시가 지나치게 커지지 않도록 이전 타임 스탬프가있는 사용자를 삭제하십시오.

다른 옵션은 세션 파일을 검사하는 것입니다. 일정 기간 내에 수정 된 세션을 확인하십시오. 그 중 "auth"개체를 포함하는 항목을 찾고 마지막 요청 시간 동안 auth.last_visit를 확인하십시오 (실제로 auth.last_visit는 이전 방문 이후의 시간이 auth.settings의 1/10을 초과하는 경우에만 업데이트됩니다). . 흡기 시간, 기본값은 3600 초).

+0

안녕하세요 앤서니는 정말 고맙습니다. 답을 알려 주셔서 정말 정교하고 완성되었습니다. 나는 확실히 그것을 시도하고 결과와 함께 업데이트 할 것입니다 .. –

+0

네, 그 속임수를했습니다 .. 대단한 앤서니 감사합니다 .. –

관련 문제