Contentful Content Management API에 대한 해킹 포인트 설명
13482 단어 contentful
무엇
Contentful은 Headless CMS Service입니다.https://www.contentful.com/
이번에 하고 싶은 거.
이전 블로그 시스템, Contentful+Netlify+Nuxt.js로 바꿨어요.
낡은 블로그 보도도 새로운 시스템으로 옮겨야 하기 때문에 과도 스크립트를 썼다.생각보다 좌절이 많기 때문에 다른 사람을 도울 수 있도록 필기를 남깁니다.
전환 방법
변환 시 Python 및 csv 파일이 사용됩니다.Python의 실행 환경을 설명하지 않습니다.나는 3과를 사용한다.
문서
어려우면 공식 문서로 갔으면 좋겠는데 실패한 부분도 있어요.
발목을 잡다
Create에서 ID를 명시적으로 전달해야 합니다.
문서에 다음과 같은 설명이 갑자기 나타납니다.
new_asset = client.assets('my_space_id', 'environment_id').create(
'new_asset_id',
file_attributes
)
응,'new'asset_아이디라니요?자원을 다시 만들 때 시스템이 자동으로 번호를 매겨야 한다고 생각했는데 그렇지 않았다.나는 이 ID가 전 세계에서 유일무이한 (다른 세입자와도 쓸 수 없는) 것이 필요한지 전혀 모르겠다. 자신의 세입자 안에서 유일무이한 것이 좋은지, 아니면 그 모델에서 유일무이한 것이 좋은지 모르겠다.
이후의 용례를 고려하면'자신의 세입자 내에서 독특하면 좋겠다'는 생각이 든다.나는 아래의 함수로 차를 더럽혔다.
# resouce_name: モデル名やAsset名を渡す
def getRandomString(resource_name):
return resource_name + ''.join(random.choice(string.ascii_uppercase + string.ascii_lowercase + string.digits) for _ in range(30))
추기
When creating resources, you can specify an ID or let the API generate a random ID for you.
https://www.contentful.com/developers/docs/references/content-management-api/#/introduction/resource-ids
파이썬 SDK가 아니라 API 규격서에 ID가 자동 번호라고 적혀 있다.사용하기만 하면 아이디를 안 내면 틀릴 것 같아요.
asset의publish 타이밍
안구 포착 등의 이미지를 업로드해야 한다.
참고로 콘텐츠풀은 로컬에서 파일을 업로드할 수 있을 뿐만 아니라 공개 링크에서 이미지를 다운로드할 수 있다.매우 간단한 프로그램을 쓸 수도 있고 수동 이미지 변환을 쉽게 할 수 있어 매우 편리하다.이번 프로젝트는 Google Drive의 공개 링크에서 이미지를 전송하기로 결정했습니다.
GUI를 통해서도 동일한 작업을 수행할 수 있습니다.↓
그러면 공식 문서를 보면 이런 스크립트를 쓸 수 있다.
fid = 'hoge'
downloadLink = 'https://docs.google.com/uc?export=download&id=hoge'
attributes = {
'fields': {
'title': {
'en-US': fid
},
'file': {
'en-US': {
'contentType': 'image',
'fileName': fid,
'upload': downloadLink
}
}
}
}
asset = environment.assets().create(
getRandomString('image'), # この関数は前述
attributes
)
asset.process() # ダウンロード処理
asset.publish() # 公開
이렇게 하면publish에 이런 오류가 발생할 수 있습니다.Message: Version mismatch error. The version you specified was incorrect. This may be due to someone else editing the content.
이게 뭐야?Transaction 같은 개념이 있나요?그런 생각도 없고, 어떻게 피해야 할지 몰라 고전했다.
알림은 공식 문서에 있습니다.
Processing an asset:
asset.process()
This will process the file for every available locale and provide you with a downloadable URL within Contentful.처음에 제가 빠뜨렸어요.
downloadable URL
발매되면 프로세스가 끝납니까!눈치챘어.따라서 요점은 프로세스와publish 사이에 다음과 같은 방법이 끼어 있다는 것이다.
asset.process()
while 'url' not in asset.fields()['file']: # url が発行されるまで待つ
time.sleep(1)
asset.reload()
asset.publish()
말하기 시작하다asset = asset.process()
NaN 처리
CSV 로드는
pandas
를 사용합니다.과도 데이터에 결손값이 매우 많기 때문에 나는 판다스가 표준 모듈보다 처리하기 쉽다고 생각한다.NaN 부분은 Editor에서도 비필수 항목이기 때문에 원형을 유지한 상태
entries().create
에서 던지면 다음과 같은 오류가 발생할 수 있습니다.attributes = {
'content_type_id': 'contentTypeName',
'fields': {
'hoge': {
'en-US': NaN,
}
}
}
environment.entries().create(getRandomString('contentTypeName'), attributes) # getRandomString は前述
contentful_management.errors.BadRequestError: HTTP status code: 400Message: Invalid JSON in request body
잘못된 정보에서 난 때문인지 몰라서 JSON의 포맷이 잘못된 거 아닌가 싶어요.그러나 나는 Nan이 결국 받아들이지 않는다는 것을 알고 다음과 같이 수정했다.
hoge = NaN
if type(hoge) == str:
attributes['fields']['hoge'] = {
'en-US': hoge
}
나는str가 업무 내용을 보아야 하는지 아닌지를 생각해서 참고만 제공한다.Boolean
Boolean attribute가 있는 Entry를 처리하는 동안 다음 오류가 발생했습니다.
attributes = {
'content_type_id': 'contentTypeName',
'fields': {
'somethingEnabled': True
}
}
environment.entries().create(getRandomString('contentTypeName'), attributes) # getRandomString は前述
contentful_management.errors.UnprocessableEntityError: HTTP status code: 422Message: Validation error
Details:
* Name: type - Path: '['fields', 'somethingEnabled']' - Value: 'True'
Boolean이 Validation Error의 탄환에 의해 망가졌습니다.Premitive Boolean 안 받아줘요?이 문제를 감안하여 나는 문자열과 수치를 시험해 보고 여러 가지 일을 했다.결과 정답은 여기 있습니다.
attributes = {
'content_type_id': 'contentTypeName',
'fields': {
'somethingEnabled': {
'en-US': True
}
}
}
boolean도 현지화가 필요하다는 뜻이다.이번에 나는 영어 내용만 만들었을 뿐인데 자-JP와 엔-US가 있다면 각각 두 개씩 등록하세요.로컬화란 문자의 번역으로 인해 ID와 Boolean이 번역하지 않는 것이 자연스럽게 생각하는데...나는 한가할 때도 홍보를 해 보고 싶다.참조 유형
문장은 자주 여러 종류를 참고하거나 이미지를 참고한다.화면에서 조작하면 직관적이지만 API를 통과하면 정말 복잡해서 문서에서 읽을 수 없기 때문에 여기에 필기를 남깁니다.
결론적으로 참고할 만한 상황은
'category': {
'en-US': {
'sys': {
'type': 'Link',
'linkType': 'Entry', # Entry, Asset
'id': categoryId
}
}
},
위에서 설명한 대로 참조 구조en-US.sys.id
를 사용합니다.다중 참조 시
'categories': {
'en-US': [
{
'sys': {
'type': 'Link',
'linkType': 'Entry',
'id': categoryId
}
}
]
}
en-US[0].sys.id
처럼 en-US
바로 아래에 배열한다.여기서 두 가지를 알 수 있어요.
이상과 같이 참고할 수 있다면 다행입니다.
Reference
이 문제에 관하여(Contentful Content Management API에 대한 해킹 포인트 설명), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/satorish/items/6cdfc4361bcc0996d0c8텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)