Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 

파이썬 - <class 'AttributeError'> module 'flask.json' has no attribute 'JSONEncoder'

개인적으로, 파이썬의 패키지 관리가 좀 마음에 들지 않습니다. ^^; 파이썬 경력이 얼마 없지만, 그사이 이상한 충돌 현상을 겪은 것이 서너 번 정도 되는 것 같습니다.

예를 들어, WSL + Ubuntu 20.04가 설치된 환경에서 python 3.8.10을 설치 후 Flask와, Flask-Migrate를 설치하면,

$ python3 -m pip install Flask==2.2.2
$ python3 -m pip install Flask-Migrate==3.1.0

지정한 버전 그대로 설치가 됩니다. 그런데, container 이미지인 "python:3.8-slim-buster"로 구성한 환경(파이썬 버전 3.8.12)에서 위의 설치 명령을 실행하면, Flask-Migrate 설치 과정에서 아래와 같이 Flask를 2.3.2 버전으로 업데이트를 해버립니다.

# python3 -m pip install Flask==2.2.2
# pip install Flask-Migrate==3.1.0
Requirement already satisfied: Flask-Migrate==3.1.0 in /usr/local/lib/python3.8/site-packages (3.1.0)
Requirement already satisfied: Flask>=0.9 in /usr/local/lib/python3.8/site-packages (from Flask-Migrate==3.1.0) (2.2.2)
...[생략]...
Installing collected packages: Flask
  Attempting uninstall: Flask
    Found existing installation: Flask 2.2.2
    Uninstalling Flask-2.2.2:
      Successfully uninstalled Flask-2.2.2
Successfully installed Flask-2.3.2

출력을 보면, 분명히 "Requirement already satisfied: Flask>=0.9"라고 해서 조건을 만족하는 것으로 나오는데 새롭게 2.3.2 버전을 설치하고 있습니다. 여기서 문제는, 위와 같은 조건의 환경에서 Flask App을 실행하면 이런 예외가 발생하면서 Flask 환경 구성에 실패한다는 점입니다.

Traceback (most recent call last):,
  File "./wsgi.py", line 4, in <module>,
    application = pybo.create_app(),
  File "/app/build_root/flask_sample/./pybo/__init__.py", line 45, in create_app,
    from .views import main_views, question_views, answer_views, auth_views,
  File "/app/build_root/flask_sample/./pybo/views/question_views.py", line 3, in <module>,
    from ..forms import QuestionForm, AnswerForm,
  File "/app/build_root/flask_sample/./pybo/forms.py", line 1, in <module>,
    from flask_wtf import FlaskForm,
  File "/usr/local/lib/python3.8/site-packages/flask_wtf/__init__.py", line 4, in <module>,
    from .recaptcha import Recaptcha,
  File "/usr/local/lib/python3.8/site-packages/flask_wtf/recaptcha/__init__.py", line 1, in <module>,
    from .fields import RecaptchaField,
  File "/usr/local/lib/python3.8/site-packages/flask_wtf/recaptcha/fields.py", line 3, in <module>,
    from . import widgets,
  File "/usr/local/lib/python3.8/site-packages/flask_wtf/recaptcha/widgets.py", line 6, in <module>,
    JSONEncoder = json.JSONEncoder,
AttributeError: module 'flask.json' has no attribute 'JSONEncoder',

해결 방법은, 설치 순서를 바꾸면 됩니다. ^^;

# python:3.8-slim-buster 환경에서, 아래는 Flask 2.3.2 버전을 설치하고,
pip install Flask-Migrate==3.1.0

# 위에서 설치한 2.3.2를 제거하고 2.2.2로 새롭게 설치
pip install Flask==2.2.2




관련해서 검색해 보면,

Flask AttributeError: module 'flask.json' has no attribute 'JSONEncoder'
; https://stackoverflow.com/questions/76107450/flask-attributeerror-module-flask-json-has-no-attribute-jsonencoder/76325779#76325779

이 문제가 Flask-WTF 모듈과도 연관이 있다고 나옵니다. 따라서 만약 Flask-Migrate가 원하는 대로 2.3.2 버전의 Flask 업데이트 상황에서도 정상적으로 사용하고 싶다면 Flask-WTF 모듈을 1.1.1 버전 이상으로 업데이트하면 됩니다.

# python:3.8-slim-buster 환경에서, 아래는 Flask 2.2.2 버전을 설치하지만,
pip install Flask==2.2.2

# 아래의 명령으로 인해 Flask 2.3.2 버전이 설치되고,
pip install Flask-Migrate==3.1.0

# Flask-WTF 버전을 1.1.1 이상으로 올림으로써 AttributeError 예외가 나지 않도록 구성
pip install Flask-WTF==1.1.1




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 6/20/2023]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 106  107  108  109  110  111  112  113  114  115  [116]  117  118  119  120  ...
NoWriterDateCnt.TitleFile(s)
11059정성태10/11/201628940.NET Framework: 609. WPF - 다중 스레드 환경에서 데이터 바인딩의 INotifyPropertyChanged.PropertyChanged에 대한 배려 [1]파일 다운로드1
11058정성태10/8/201624043개발 환경 구성: 303. Windows 10 Bash Shell - 한글 환경을 영문으로 바꾸고 싶다면?
11057정성태10/8/201618562오류 유형: 358. Windows 10 bash shell - sudo: unable to resolve host ...
11056정성태10/8/201622364개발 환경 구성: 302. Windows 10 bash shell 시작 시 [...] packages can be updated.
11055정성태10/8/201623408.NET Framework: 608. double 값을 구할 때는 반드시 피연산자를 double로 형변환! [6]
11054정성태10/5/201627425개발 환경 구성: 301. "Let's Encrypt" SSL 인증서를 Azure Cloud Services(classic)에 업데이트하는 방법
11053정성태10/5/201622048.NET Framework: 607. C# try/catch/finally의 IL 코드 표현
11052정성태9/27/201635953개발 환경 구성: 300. C# DLL에서 Win32 C/C++처럼 dllexport 함수를 제공하는 방법 [7]파일 다운로드1
11051정성태9/25/201623167개발 환경 구성: 299. docker - c:\programdata\docker\windowsfilter 폴더 정리하는 방법파일 다운로드1
11050정성태9/24/201628026VC++: 101. 반올림하지 않고 double 변수 값 출력하는 방법 [3]
11049정성태9/24/201622374오류 유형: 357. 윈도우 백업 시 오류 - 0x81000037
11048정성태9/24/201623428VC++: 100. 전역 변수 유형별 실행 파일 크기 차이점
11047정성태9/21/201627339기타: 61. algospot.com - 양자화(Quantization) 문제 [2]파일 다운로드1
11046정성태9/15/201629024개발 환경 구성: 298. Windows 10 - bash 실행 시 시작 디렉터리 자동 변경
11045정성태9/15/201621672Windows: 119. Windows 10 - bash 명령어 창을 실행했는데 바로 닫히는 경우
11044정성태9/15/201621890VS.NET IDE: 112. Visual Studio 확장 - 편집 화면 내에서 링크를 누르면 외부 웹 브라우저에서 열기
11043정성태9/15/201622594.NET Framework: 606. .NET 스레드 콜 스택 덤프 (7) - ClrMD(Microsoft.Diagnostics.Runtime)를 이용한 방법 [1]파일 다운로드1
11042정성태9/14/201620669오류 유형: 356. Unknown custom metadata item kind: 6
11041정성태9/10/201620830.NET Framework: 605. CLR4 보안 - yield 구문 내에서 SecurityCritical 메서드 사용 불가 - 2번째 이야기
11040정성태9/10/201628285.NET Framework: 604. C# Windows Forms - Drag & Drop 예제 코드 [2]파일 다운로드1
11039정성태9/9/201624095오류 유형: 355. Visual Studio 빌드 오류 - error CS0122: '__ComObject' is inaccessible due to its protection level
11038정성태9/9/201626717VC++: 99. 서로 다른 프로세스에서 WM_DROPFILES 메시지를 전송하는 방법파일 다운로드1
11037정성태9/8/201629923.NET Framework: 603. socket - shutdown 호출이 필요한 사례파일 다운로드1
11036정성태8/29/201625725개발 환경 구성: 297. 소스 코드가 없는 닷넷 어셈블리를 디버깅할 때 지역 변숫값을 확인하는 방법
11035정성태8/29/201621647오류 유형: 354. .NET Reflector - PDB 생성 화면에서 "Clear Store"를 하면 "Index and length must refer to a location within the string" 예외 발생
11034정성태8/25/201625672개발 환경 구성: 296. .NET Core 프로젝트를 NuGet Gallery에 배포하는 방법 [2]
... 106  107  108  109  110  111  112  113  114  115  [116]  117  118  119  120  ...