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()
말하기 시작하다
  • fields는 함수
  • 반환값은 Dictionary
  • 입니다.
  • proces,reload,publish는object 자체에 작용asset = asset.process()
  • 완전히 이해하지 못하는 것은try&error가 마침내 찾은 형식이다.내 파이토존의 힘이 낮은 것도 원인이지만, 강력한 수습에 익숙해지면 이렇게 매운 게...

    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: 400
    Message: 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: 422
    Message: 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 바로 아래에 배열한다.
    여기서 두 가지를 알 수 있어요.
  • 당연하며,내용은하위내용부터제작한다(그림→카테고리→문장같은순서)
  • ID는 임차인 중 유일해야 한다
  • 그러니까위의 Link 지정에서 ContentType이 지정되지 않았기 때문에 ID에서 내용을 역추측하여 판정합니다.
    이상과 같이 참고할 수 있다면 다행입니다.

    좋은 웹페이지 즐겨찾기