찬찬의 Notion API 정복기 12 - API 집중분석 - Create a page (하)

소찬 (Chan)·2022년 9월 26일
0
post-thumbnail

Reference API URL : Create a page

  • children (array of mixed types)
    Page content for the new page as an array of block objects
    block 배열들을 children을 통해 추가할 수 있습니다.
    block이 뭘까요?

    (네오피자 알바 아닙니다. 근데 네오피자 진짜 맛있어요. 이게 말인지 빙구인지)
    위의 하늘색 네모 블럭 하나가 block 을 뜻합니다. 저거를 childrenblock 정보를 집어넣으면, page가 생성될때 블록도 같이 생성되게 됩니다. block 배열은 어떻게 보아야 하나요?
    위 페이지의 block 정보를 읽어오기 위해 Retrieve block children 명령을 사용해보겠습니다.
# 위 페이지 id를 page_id에 입력
# page_id 따오는 법은 찬찬의 API 집중분석 - search를 참조하세요.
page_id = '1f217cc1-225f-4580-8e22-cd7eb8db3c5e'

blocks = notion.blocks.children.list(block_id=page_id)
pprint(blocks)

block 정보는 다음과 같습니다.

{'block': {},
 'has_more': False,
 'next_cursor': None,
 'object': 'list',
 'results': [{'archived': False,
              'created_by': {'id': 'edfacc72-eb15-467b-9fdb-d5b656e1c77b',
                             'object': 'user'},
              'created_time': '2022-04-02T11:59:00.000Z',
              'has_children': False,
              'id': '27b0ad2f-5698-4f7c-ab07-00f174042264',
              'last_edited_by': {'id': 'edfacc72-eb15-467b-9fdb-d5b656e1c77b',
                                 'object': 'user'},
              'last_edited_time': '2022-07-07T00:43:00.000Z',
              'object': 'block', ...

'results'block 정보들이 있는 배열이 있습니다. 이러한 형태의 배열정보를 children에 넣으면, create 할때 블럭도 같이 생성되겠죠?
pprint(blocks['results'][0])를 실행하여 첫번째인, [0]번째 block페페로니가 취향저격이라는 정보가 있는 블록을 자세히 살펴보겠습니다.

...
 'object': 'block',
 'paragraph': {'color': 'default',
               'rich_text': [{'annotations': {'bold': False,
                                              'code': False,
                                              'color': 'default',
                                              'italic': False,
                                              'strikethrough': False,
                                              'underline': False},
                              'href': None,
                              'plain_text': '페퍼로니가',
                              'text': {'content': '페퍼로니가', 'link': None},
                              'type': 'text'},
                             {'annotations': {'bold': False,
                                              'code': False,
                                              'color': 'default',
                                              'italic': False,
                                              'strikethrough': False,
                                              'underline': False},
                              'href': None,
                              'plain_text': ' 취향저격',
                              'text': {'content': ' 취향저격', 'link': None},
                              'type': 'text'}]}, ...

paragraph 키 값의 정보를 참조하면 children 형식에 맞는 형태로 가공할 수 있을걸로 보입니다.

paragraph_value = blocks['results'][0]['paragraph']
children_block = {}
children_block['paragraph'] = paragraph_value

{} 로 씌우는거 계속 코드로 하니 번거롭네요. def 함수로 만들어볼까요?

def dict_wrap(type, object):
    wrapped = {}
    wrapped[type] = object
    return wrapped

children_block = dict_wrap(type='paragraph', object=blocks['results'][0]['paragraph'])

이 정보로 생성하면 되겠지... 하는데 아직 끝난게 아닙니다.
children 타입 ㄱ나시나요? array of mixed types 이말은 즉슨, array, list 형태입니다.
그럼 저걸 list로 묶어야 API에서 인식하겠죠.
애먹었는게, dictionary 로 넣으니까 body.parent.database_id should be defined, instead was 'undefined'. 오류가 계속 발생하는 겁니다. 애초에 너 dictionary 로 줬으니 list로 묶어달라고 오류 메시지 주면 좋았을텐데 말이죠. 여러 블럭을 생성해야 된다면 children_block 를 여러개 append 해주시면 되겠죠?

children_blocks = []
children_blocks.append(children_block)

이제 추가가 가능한 형태로 children 이 완성되었습니다. 이걸 필수 값인 parentproperties와 함께 parameter 값에 추가하시면 문제없이 생성이 될겁니다.

parent_object = {'type': 'database_id', 'database_id': '021eb424-7a41-47ae-9252-f67d4f6e6b05'}
notion.pages.create(parent=parent_object,
                    properties=properties_new,
                    children=children_blocks)
  • icon (json)
    Page icon for the new page.
    아이콘은 페이지 앞에 붙는 Emoji 아이콘을 뜻합니다.
icon_value = {'emoji': '🍕', 'type': 'emoji'}
notion.pages.create(parent=parent_object, properties=properties_new, icon=icon_value)
  • cover (json)
    Page cover for the new page
    커버 추가 예시입니다.
url = 'https://images.unsplash.com/photo-1566843972142-a7fcb70de55a?ixlib=rb-1.2.1&q=85&fm=jpg&crop=entropy&cs=srgb&ixid=eyJhcHBfaWQiOjYzOTIxfQ'
cover_value = {'external': {'url': url},'type': 'external'}
notion.pages.create(parent=parent_object, properties=properties_new, cover=cover_value)
profile
QA Specialist

0개의 댓글