• 장고 time.now()를 쓰면 디비에 이상한 시간이 들어간다

    2017. 11. 22. 17:07

    by. 위지원


    그래 자꾸 view.py의 now() 시간이랑 디비에 저장되는 시간이 달랐다. 파라미터로 그냥 전달해도 왜!!!


    결론부터 보면 문제는 now()로 넣어놔도 디비에는 UTC기준으로 들어가는것이문제

    TIME_ZONE = 'Asia/Seoul'

    먼저 setting.py에 타임존을 한국 시간으로 맞춰놨다.



    이렇게 설정하면 내가 했던 datetime.now()로 가져오면 타임존 설정에 따라 다르지만 정작 저장할때는 utc로 저장됨 

    *time zone 정보가 없는 naive datetime 객체라고한다


    그래서 다시 읽어서 보면 time-zone-aware datetime..

    그래.. 에러 화면에서 봤다...  naive ... aware.....


    TypeError: can't subtract offset-naive and offset-aware datetimes

    "GET /?beaconId=2&gridId=2&userId=5 HTTP/1.1" 500 16201



    그래서 중요한 해결방법은


    datetime.now()를 쓰면 안되고 


    1.from django.conf import timezone 의 timezone.now를 사용

    아래걸로 해야한다.

    from django.utils import timezone

    2.setting.py의  use_TZ를 false로 변경 (local  time 쓰게 하려고)

    USE_TZ = False




    하러갔더니 안된다 아ㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ


      File "/home/weejw/queryTester/tester/views.py", line 4, in <module>

        from django.conf import timezone

    ImportError: cannot import name 'timezone'



    검색해보니 장고가 최신버전이 아니라서 그렇단다 (현재버전1.1) 왜이렇게 낮은가?... 잘모르겠지만 이것은 장고 1.4에 새로 추가된거라고한다. 업그레이드를 해보자

    $pip uninstall django

    $python setup.py install

    1.7을 설치하고서 미들웨어를 전부 변경해준다. https://django.readthedocs.io/en/1.7.x/topics/http/middleware.html
    MIDDLEWARE_CLASSES = (
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
    )
    nowTime = timezone.now()
    print(nowTime)

    프린트를 한번 해봤다. 잘된다 .ㅎ


    2017-11-22 17:44:02.126631 [22/Nov/2017 17:44:02] "GET /?beaconId=2&gridId=2&userId=5 HTTP/1.1" 200 59

    디비에도 잘 저장된다.


    [변경전] mysql> select * from tester_user;

    +--------+---------------------+---------------------+

    | userId | lastUpdateTime      | stayTime            |

    +--------+---------------------+---------------------+

    |      5 | 2017-11-22 08:02:46 | 2017-11-22 08:02:46 |

    +--------+---------------------+---------------------+

    1 row in set (0.00 sec)




    [변경후] mysql> select * from tester_user;

    +--------+---------------------+---------------------+

    | userId | lastUpdateTime      | stayTime            |

    +--------+---------------------+---------------------+

    |      5 | 2017-11-22 17:44:37 | 2017-11-22 17:44:37 |

    +--------+---------------------+---------------------+



    그래서 내가 결국 하려던 시간차이는 이렇게 항 - 오퍼레이션이 그냥 되다니 너모 기모찡

    if (nowTime-stayTime)>timezone.timedelta(minutes=50)




    profile
    위지원

    데이터 엔지니어로 근무 중에 있으며 데이터와 관련된 일을 모두 좋아합니다!. 특히 ETL 부분에 관심이 가장 크며 데이터를 빛이나게 가공하는 일을 좋아한답니다 ✨

    '2017년 > Python' 카테고리의 다른 글

    장고 makemigrations/migrate error  (0) 2017.11.27
    redis  (0) 2017.11.22
    장고 ajax통신 코드  (0) 2017.11.16
    장고 에러로그 파일로 남기기  (0) 2017.11.16
    장고 view,url  (0) 2017.11.15