python flask admin RuntimeError: maximum recursion depth exceeded 발생할 때

조회수 491회
@babel.localeselector
def get_locale():
    print 'check2'
    if 'lang' in session:
        cur_lang = session['lang']
        if cur_lang in app.config['SUPPORTED_LANGUAGES'].keys():
            return cur_lang
        else:
            return request.accept_languages.best_match(app.config['SUPPORTED_LANGUAGES'].keys())
    else:
        best_lang = request.accept_languages.best_match(app.config['SUPPORTED_LANGUAGES'].keys())
        session['lang'] = best_lang
        return request.accept_languages.best_match(app.config['SUPPORTED_LANGUAGES'].keys())

기본적으로 flask 로 웹페이지 구현해둔 것에 babel을 사용하고 있습니다. 그런데 admin 경로로 이동만하면 위에 있는 함수가 무한 반복 실행 되더군요. check2가 계속 찍히다가 RuntimeError: maximum recursion depth exceeded 에러가 발생합니다. 일반 경로에서는 페이지 이동할 때 한 번만 실행 되는 함수인데 왜 admin페이지로 가면 저 함수만 무한으로 찍힐까요?

그리고 @babel.localeselector이것은 어디서 호출 되는 뭘 의미하는 명령어인가요?

1 답변

  • 하기의 사이트에서 문서를 읽어보시면 @babel.localeselector 상세한 설명을 볼 수 있습니다.

    https://pythonhosted.org/Flask-Babel/

    간단히 설명하면 babel 은 국제화 처리를 위해 사용합니다.

    @babel.localeselector 데코레이터를 사용했으면 en, ko 같은 locale 정보를 리턴하면 됩니다.

    check2 여러번 찍힌다는 것은 그 함수가 잘못된 것이 아니라 get_locale 를 여러번 호출하고 있다는 것이겠죠.

    pdb 를 이용해서 print 'check2' 라인에 브레이크 포인터를 설정하고 멈추었을때 call stack 을 확인하면 caller 을 알 수 있습니다.

    pycharm 같은 ide를 사용할 수 있다면 더 쉽게 파악할 수 있습니다.

    • pdb test 코드

    abcd.py

    import pdb
    
    def add(a, b):
        breakpoint()    # python 3.7 이하버전인 경우 pdb.set_trace() 로 해야함
        return a + b
    def main():
        return add(3, 4)
    
    if __name__ == '__main__':
        print(main())
    
    • pdb 로 call stack 보기 위에서 아래로 봅니다. 테스트한 소스코드랑 라인과 확인해보면 call 순서를 파악할 수 있습니다.
    (py37)  allinux@lghnh # python abcd.py
    > /home/allinux/abcd.py(5)add()
    -> return a + b
    (Pdb) w
      /home/allinux/abcd.py(10)<module>()
    -> print(main())
      /home/allinux/abcd.py(7)main()
    -> return add(3, 4)
    > /home/allinux/abcd.py(5)add()
    -> return a + b
    (Pdb)
    
    

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)