Flask의 jsonify를 사용할 때 datetime.date를 'yyy-mm-d' 형식으로 유지합니다.
어떤 이유에서인지jsonify함수는 내 데이터를 변환하고 있습니다.datetime.dateHTTP 날짜로 보입니다.어떻게 하면 날짜를 지킬 수 있을까요?yyyy-mm-dd사용 시 포맷jsonify?
test_date = datetime.date(2017, 4, 27)
print(test_date) # 2017-04-27
test_date_jsonify = jsonify(test_date)
print(test_date_jsonify.get_data(as_text=True)) # Thu, 27 Apr 2017 00:00:00 GMT
댓글에 제시된 바와 같이jsonify(str(test_date))원하는 형식을 반환합니다.단, 다음 경우를 고려해 주십시오.
test_dict = {"name": "name1", "date":datetime.date(2017, 4, 27)}
print(test_dict) # {"name": "name1", "date":datetime.date(2017, 4, 27)}
test_dict_jsonify = jsonify(test_dict)
print(test_dict_jsonify.get_data(as_text=True)) # {"date": "Thu, 27 Apr 2017 00:00:00 GMT", "name": "name1"}
test_dict_jsonify = jsonify(str(test_dict))
print(test_dict_jsonify.get_data(as_text=True)) # "{"date": datetime.date(2017, 4, 27), "name": "name1"}"
이 경우,str()솔루션이 작동하지 않습니다.
edit: 이 답변은 Flask 버전 2.3+에 비해 너무 오래되었습니다.
커스터마이즈 할 필요가 있습니다.json_provider_class; 레퍼런스:https://flask.palletsprojects.com/en/2.2.x/api/?highlight=json_encoder#flask.Flask.json_provider_class
이 스니펫에 따라서, 다음의 조작을 실시할 수 있습니다.
from flask.json import JSONEncoder
from datetime import date
class CustomJSONEncoder(JSONEncoder):
def default(self, obj):
try:
if isinstance(obj, date):
return obj.isoformat()
iterable = iter(obj)
except TypeError:
pass
else:
return list(iterable)
return JSONEncoder.default(self, obj)
app = Flask(__name__)
app.json_encoder = CustomJSONEncoder
경로:
import datetime as dt
@app.route('/', methods=['GET'])
def index():
now = dt.datetime.now()
return jsonify({'now': now})
datetime.date는 JSON 타입이 아니기 때문에 기본적으로는 시리얼화할 수 없습니다.대신 후크를 추가하여 날짜를 RFC 1123 형식의 문자열에 덤프합니다.이것은 HTTP 요청 및 응답의 다른 부분과 일치합니다.
형식을 변경하려면 커스텀 JSON 인코더를 사용합니다.서브클래스로 설정합니다.
from flask import Flask
from flask.json import JSONEncoder
class MyJSONEncoder(JSONEncoder):
def default(self, o):
if isinstance(o, date):
return o.isoformat()
return super().default(o)
class MyFlask(Flask):
json_encoder = MyJSONEncoder
app = MyFlask(__name__)
ISO 8601을 사용하여 값을 전송하고 저장하는 것이 좋습니다.JavaScript(및 기타 파서)에 의해 명확하게 해석할 수 있습니다.출력 형식은 저장할 때가 아니라 출력할 때 선택합니다.
RFC 2822 또는 ISO 8601 날짜를 나타내는 문자열(기타 형식을 사용할 수 있지만 결과가 예기치 않을 수 있습니다).
데이터를 로드할 때 값이 문자열이 아닌 날짜인지 알 수 없기 때문에(날짜가 JSON 유형이 아니기 때문에) 이 값을 얻을 수 없습니다.datetime.date돌아가면 끈을 얻을 수 있어요. (그리고 만약 데이트 상대가 생겼다면, 어떻게 다시 돌아올 수 있을까요?date대신datetime?)
플라스크 2.2는 권장 해제 경고를 보여줍니다.
'JSONEncoder' is deprecated and will be removed in Flask 2.3. Use 'Flask.json' to provide an alternate JSON implementation instead.
이를 제거하거나 플라스크 2.3+에서 작동시키려면 업데이트가 필요합니다.플라스크 저장소의 다른 예시는 다음과 같습니다.
from datetime import datetime, date
from flask import Flask
from flask.json.provider import DefaultJSONProvider
class UpdatedJSONProvider(DefaultJSONProvider):
def default(self, o):
if isinstance(o, date) or isinstance(o, datetime):
return o.isoformat()
return super().default(o)
app = Flask(__name__)
app.json = UpdatedJSONProvider(app)
앱의 속성을 변경하여 해당 형식의 다양한 날짜를 구현할 수 있습니다.
언급URL : https://stackoverflow.com/questions/43663552/keep-a-datetime-date-in-yyyy-mm-dd-format-when-using-flasks-jsonify
'programing' 카테고리의 다른 글
| Wordpress REST API V2가 모든 게시물을 반환합니다. (0) | 2023.04.01 |
|---|---|
| Linux용 JSON 명령줄 포맷 도구 (0) | 2023.04.01 |
| 도커 컨테이너의 디스크 사용량을 분석하는 방법 (0) | 2023.04.01 |
| Angular 요소의 지시 템플릿 고유 IDJS (0) | 2023.04.01 |
| 리액트 JSX에서 rest는 무엇을 의미합니까? (0) | 2023.04.01 |