Appwrite의 Python

간단한 소개


Appwrite는 자체 위탁 관리 백엔드 즉 서비스(BaaS)로 개발자가 응용 프로그램을 더욱 간단하고 빠르게 할 수 있도록 한다.그것은 모든 운영체제나 플랫폼에서 실행될 수 있으며, Appwrite 프로그램은 대부분의 프로그래밍 언어/프레임워크로 작성할 수 있다. (나를 믿어라. 그들은 SDK가 많다.)
본문을 작성할 때까지만 해도 pre-release 단계(2019년 9월 또는 2년 전 첫 발표)에 있었지만, 이미 많은 업무(207명의 공헌자가 119개 지점에서 6.8k를 제출)와 적극적인 참여community를 했다.
앱write와 텔레그램이 있는 애니메이션 리스트 로봇을 만들어 노하우를 보여드리겠습니다.

프로젝트 설정


단계 1: docker 설치


우리는 docker를 사용하여 Appwrite를 설치할 것이다. docker는 원본을 시작하는 용기화 플랫폼이다. 즉, 개발자가 자신의 응용 프로그램을 작은 가상 공간으로 포장하여 시스템의 다른 부분과 분리하고 이른바 용기에서 분리할 수 있도록 한다.
here에서 docker 설치

2단계: Docker에 Appwrite를 설치합니다.


Linux/Mac(모든 Unix 시스템):


docker run -it --rm \
    --volume /var/run/docker.sock:/var/run/docker.sock \
    --volume "$(pwd)"/appwrite:/usr/src/code/appwrite:rw \
    --entrypoint="install" \
    appwrite/appwrite:0.11.0

Windows CMD(명령 프롬프트):


docker run -it --rm ^
    --volume //var/run/docker.sock:/var/run/docker.sock ^
    --volume "%cd%"/appwrite:/usr/src/code/appwrite:rw ^
    --entrypoint="install" ^
    appwrite/appwrite:0.11.0

Windows PS(전원 공급 장치):


docker run -it --rm ,
    --volume /var/run/docker.sock:/var/run/docker.sock ,
    --volume ${pwd}/appwrite:/usr/src/code/appwrite:rw ,
    --entrypoint="install" ,
    appwrite/appwrite:0.11.0
Official installation Docs
시스템 요구 사항
최소한 Appwrite는 다음을 수행해야 합니다.
  • CPU 코어 1개 및
  • 512MB(2GB 권장) 메모리
  • ClamAV가 설치되어 있는 경우
  • 2GB 메모리 필요
    ClamAV 자체는 최소 1GB를 사용하기 때문입니다.
  • 프로그램이 그 일을 완성하도록 해라. 만약 인터넷 연결이 평균 수준보다 낮다면, 이것은 상당히 많은 시간을 들일 것이다.
    이 메시지가 표시되면 다음 단계를 계속할 수 있습니다.

    이 가능하다, ~할 수 있다,...
    docker: Error response from daemon: status code not OK but 500:
    

    이것은 docker가 설치할 디렉토리에 액세스할 권한이 없으며 다음과 같이 쉽게 수정할 수 있습니다.
  • 설정 > 리소스 > 파일 공유에 들어가기
  • 디렉토리를 목록에 추가
  • Source

    3단계: 대시보드에 액세스하려면:


    Appwrite를 설치한 후 로컬 호스트나 기본 브라우저의 127.0.0.1로 이동하여 Appwrite 대시보드에 액세스하십시오.
    처음 실행할 때는 다음과 같은 방법으로 루트 사용자를 생성해야 합니다.
  • 선호하는 이름 제공*
  • 이메일 주소 추가
  • 강력한 암호 생성 및
  • 최종 수락 약관.
  • 모든 표준적인 등록 절차는 반드시 정확한 상황에서 너를 여기에 오게 해야 한다.

    4단계: 항목 만들기:


    "항목 만들기"또는 대시보드에서 "+"기호를 클릭하고 필요에 따라 이름을 지정하면 됩니다.
    그런 다음 나중에 SDK에서 사용할 수 있도록 설정 탭에서 프로젝트 id와 Api 끝점을 가져옵니다.

    그런 다음 API 키 탭으로 이동합니다.
    필요한 모든 역할 영역을 사용하여 새 키를 만듭니다.

    5단계: 서버 설정(Python)


    pip를 사용하여python Sdk 설치
    pip install appwrite
    
    python telegram bot 설치 사용
    pip install python-telegram-bot
    
    설치를 사용하여 jikanPy
    pip install jikanpy
    
    Dotenv 설치 사용
    pip install python-dotenv
    
    저희가 먼저 사용해야 돼요.
    전보를 통해 로봇 영패를 얻다.
    그리고 새 디렉터리를 만들고, 로봇을 제어하기 위해 샘플 코드를 설치한다
    매인.py
    + import dotenv
    + 
    + from os import getenv
    + from telegram.ext import Updater
    + from telegram.ext import CommandHandler
    +
    + token = dotenv.get_key('.env','TOKEN') or getenv('TOKEN')
    + 
    + updater = Updater(token=token, use_context=True)
    + dispatcher = updater.dispatcher
    + 
    + def start(update, context):
    +     context.bot.send_message(
    +         chat_id=update.effective_chat.id, 
    +         text="Hi there , im alive")
    + 
    + def main():
    +     "Main Execution"
    +     start_handler = CommandHandler('start', start)
    +     dispatcher.add_handler(start_handler)
    +     updater.start_polling()
    +    
    + if __name__ == '__main__':
    +     main()
    + 
    
    그리고 당신의 기호화폐를 추가합니다.env 파일은 다음과 같습니다.
    에반 선생
    + TOKEN=<###########:YOUR_TOKEN_HERE-KSDFJAKSDJFHKSJDHF>
    
    다음은 appwrite 보일러판 코드를 설정합니다. 아래와 같습니다.
     import dotenv
    
     from os import getenv
     from telegram.ext import Updater
     from telegram.ext import CommandHandler
    + from appwrite.client import Client
    
     token = dotenv.get_key('.env','TOKEN') or getenv('TOKEN')
    + ENDPOINT = dotenv.get_key('.env','ENDPOINT') or getenv('ENDPOINT')
    + PROJECTID = dotenv.get_key('.env','PROJECTID') or getenv('PROJECTID')
    + APIKEY = dotenv.get_key('.env','APIKEY') or getenv('APIKEY')
    
     updater = Updater(token=token, use_context=True)
     dispatcher = updater.dispatcher
    
    + client = Client()
    + (client
    +   .set_endpoint(F'http://{ENDPOINT}/v1') # Your API Endpoint
    +   .set_project(PROJECTID) # Your project ID
    +   .set_key(APIKEY) # Your secret API key
    + )
    
    
     def start(update, context):
         context.bot.send_message(
             chat_id=update.effective_chat.id, 
             text="Hi there , im alive")
    
     def main():
         "Main Execution"
         start_handler = CommandHandler('start', start)
         dispatcher.add_handler(start_handler)
         updater.start_polling()
    
     if __name__ == '__main__':
         main()
    
    
    상응하는 값을 추가하는 것을 잊지 마라.환경 파일
    TOKEN=<###########:YOUR_TOKEN_HERE-KSDFJAKSDJFHKSJDHF>
    + ENDPOINT=localhost
    + PROJECTID=617bf##f####d
    + APIKEY=20e###a379c0f306b9637fff7fae6b0cb73ab98453300613d84fdd74fd6c3c947dda#####c9b05e7####ad3e5bc2adc5c782192d4d586f51e2a668c9de5a44d7fa6f43###bc737216e43bbd##faa949cf######fdf9779eceb1e938e4aaba4073eb8c1c0ce7a2b216a75d4f532545dc7795dd92f42d70c#####79069d783a187
    
    다음에 다음 규칙이 있는 집합을 추가합니다 (키: 데이터 type)
    Appwrite 대시보드에서
    키 이름에 특수 문자를 포함하지 않도록 하십시오
  • 사용자 ID: 숫자
  • MalList:numeric(유사 배열)
  • 상태: 텍스트(유사 배열)
  • 다음 그림과 같이 코드에 추가합니다.
    에반 선생
    TOKEN=<###########:YOUR_TOKEN_HERE-KSDFJAKSDJFHKSJDHF>
    ENDPOINT=localhost
    PROJECTID=617bf##f####d
    APIKEY=20e###a379c0f306b9637fff7fae6b0cb73ab98453300613d84fdd74fd6c3c947dda#####c9b05e7####ad3e5bc2adc5c782192d4d586f51e2a668c9de5a44d7fa6f43###bc737216e43bbd##faa949cf######fdf9779eceb1e938e4aaba4073eb8c1c0ce7a2b216a75d4f532545dc7795dd92f42d70c#####79069d783a187
    + COLLECTIONID=617c51c613eab
    
    매인.py
    TOKEN = dotenv.get_key('.env','TOKEN') or getenv('TOKEN')
    ENDPOINT = dotenv.get_key('.env','ENDPOINT') or getenv('ENDPOINT')
    PROJECTID = dotenv.get_key('.env','PROJECTID') or getenv('PROJECTID')
    APIKEY = dotenv.get_key('.env','APIKEY') or getenv('APIKEY')
    + COLLECTIONID = dotenv.get_key('.env', 'COLLECTIONID') or getenv('COLLECTIONID')
    
    

    전보 로봇을 만들다 데이터베이스 CRUD 소개(읽기 업데이트 삭제 생성)


    Appwrite는 영구적인 데이터를 저장하는 데이터베이스 API를 제공합니다.
    나는api를 사용하여 창설, 읽기, 업데이트, 삭제에 대한 기초 지식을 먼저 설명할 것이다.그리고 내가 어떻게 실제 에서 그것을 사용했는지 설명해 주세요.
    초기 설정:
    다음 코드는 데이터베이스 변수에 접근할 수 있도록 합니다. 이것은 데이터베이스 클래스의 실례입니다.
    from appwrite.client import Client
    from appwrite.services.database import Database
    
    client = Client()
    
    (client
      .set_endpoint('https://[HOSTNAME_OR_IP]/v1') # Your API Endpoint
      .set_project('5df5acd0d48c2') # Your project ID
      .set_key('919c2d18fb5d4...a2ae413da83346ad2') # Your secret API key
    )
    
    database = Database(client)
    

    데모 어플리케이션 수장하다


    집합은 appwrite표의 ql 등가물이다.
    이러한 API에 액세스하는 방법은 다음과 같습니다.
    모음을 만들려면 다음과 같이 하십시오.
    매개변수:
    이름:문자열(필수)
    read: read perms가 있는 문자열 배열(필수)
    write: 쓰기 권한이 있는 문자열 배열(필수)
    규칙: 배열 (필수)
    반환:
    rule objects
    코드:
    database.create_collection('[NAME]', [], [], [])
    
    목록 컬렉션:
    사용자 집합 목록 가져오기
    매개변수:
    검색:문자열(최대 256자의 용어 검색)
    제한: 정수(기본값 25, 최대값 100)
    오프셋:정수(기본값은 0, 페이지 나누기)
    orderType:string(ASC 오름차순, DESC 내림차순)
    반환:
    collection object
    코드:
    database.list_collections()
    
    모음집 가져오기
    유일한 id를 통해 집합을 가져옵니다.
    매개변수:
    collectionid: 문자열 필요
    반환:
    Collection list object
    * 코드*:
    database.get_collection('[COLLECTION_ID]')
    
    컬렉션 업데이트:
    집합의 유일한 id를 통해 집합을 업데이트합니다.
    매개변수:
    collectionid: 문자열 필요
    이름: 문자열 필요(컬렉션 이름)
    read: read perms가 있는 문자열 배열(필수)
    write: 쓰기 권한이 있는 문자열 배열(필수)
    규칙: 배열Collection object(필수)
    반환:
    rule objects
    코드:
    database.update_collection('[COLLECTION_ID]', '[NAME]')
    
    모음을 삭제하려면 다음과 같이 하십시오.
    집합의 유일한 id를 통해 집합을 삭제합니다.
    매개변수:
    collectionid: 문자열 필요
    반환:
    HTTP 코드 204
    코드:
    database.delete_collection('[COLLECTION_ID]')
    

    객체 수집 서류


    문서는 기록이나 항목의 ql 등가물이다
    그것들에 접근하는api 방법은 다음과 같다
    문서를 만들려면 다음과 같이 하십시오.
    매개변수:
    collectionId:문자열(필수)
    데이터:json 객체(필수)
    read: read perm이 있는 문자열 배열
    write: write perm이 있는 문자열 배열
    상위 문서:문자열
    parentProperty:문자열
    parentPropertyType:문자열
    반환:

    코드:
    database.create_document('[COLLECTION_ID]', {})
    
    목록 파일:
    사용자 문서 목록 가져오기
    매개변수:
    collectionId:문자열(필수)
    필터:필터 문자열 배열
    제한: 정수(기본값 25, 최대값 100)
    오프셋:정수(기본값은 0, 페이지 나누기)
    orderField:string(정렬할 필드)
    orderType:string(ASC 오름차순, DESC 내림차순)
    orderCast:string(int,string,date,time 또는datetime)
    검색:문자열
    반환:
    Document object
    코드:
    database.list_documents('[COLLECTION_ID]')
    
    문서를 가져오려면 다음과 같이 하십시오.
    문서의 유일한 id를 통해 문서를 가져옵니다.
    매개변수:
    collectionid: 문자열 필요
    documentId:문자열 필요
    반환:
    Documeents list object
    * 코드*:
    database.get_document('[COLLECTION_ID]', '[DOCUMENT_ID]')
    
    문서를 업데이트하려면 다음과 같이 하십시오.
    문서의 유일한 id를 통해 문서를 업데이트합니다.
    매개변수:
    collectionid: 문자열 필요
    documentId:문자열 필요
    데이터:Json 객체 필요
    read: read perm이 있는 문자열 배열
    write: write perm이 있는 문자열 배열
    반환:
    Document object
    코드:
    database.update_document('[COLLECTION_ID]', '[DOCUMENT_ID]', {})
    
    파일을 삭제하려면 다음과 같이 하십시오.
    문서의 유일한 id를 통해 문서를 삭제합니다.
    매개변수:
    collectionid: 문자열 필요
    documentId:문자열 필요
    반환:
    HTTP 코드 204
    코드:
    database.delete_document('[COLLECTION_ID]', '[DOCUMENT_ID]')
    

    문서 객체 코드 구현


    프로젝트 초기화 절차를 마치고 방법을 숙지한 후 를 사용하여 계속 조작할 수 있습니다.
    문서를 만들려면 다음과 같이 하십시오.
    
    def set_state(update, context):
        """
            Updates the database state and id,
            generally handles the insert and update side of things 
        """
    
        user_id = update.effective_user.id
        cqd = update.callback_query.data
        state = str(cqd.split('-')[1])
        mal_id = int(cqd.split('-')[-1])
    
        exists = database.list_documents(
            COLLECTIONID,
            filters=[f'userID={user_id}'])
    
        if exists['sum'] == 0:
            print('Data not found , create ')
            # been deleted or never existed
            payload = {
                "userID": user_id,
                "MalList": [mal_id],
                "state": [state]
            }
            database.create_document(COLLECTIONID, payload)
            context.bot.send_message(
                chat_id=update.effective_chat.id,
                text=f'Successfully added {mal_id} to list ')
        else:
            # data exists , update
            print('Data exists , update ')
            doc_id = exists['documents'][0]['$id']
            print(exists)
            if mal_id in exists['documents'][0]['MalList']:
                context.bot.send_message(
                    chat_id=update.effective_chat.id,
                    text=(
                        f'{mal_id} is already on your list\n'
                        'use /update {id} to update its state\n'
                        ))
            else :
                malist = list(exists['documents'][0]['MalList'])
                new_state = list(exists['documents'][0]['state'])
                new_state.append(str(state))
                malist.append(int(mal_id))
                payload = {
                    "userID": user_id,
                    "MalList": malist,
                    "state": new_state
                }
                updated = database.update_document(
                    COLLECTIONID,
                    doc_id,
                    payload)
                context.bot.send_message(
                    chat_id=update.effective_chat.id,
                    text=f'Added {mal_id} to list. ')
    
    
    repo 응용 프로그램의 set state 기능에서 데이터베이스를 사용하는 것을 알 수 있습니다.문서 만들기 특히 여기
            payload = {
                "userID": user_id,
                "MalList": [mal_id],
                "state": [state]
            }
            database.create_document(COLLECTIONID, payload)
            context.bot.send_message(
                chat_id=update.effective_chat.id,
                text=f'Successfully added {mal_id} to list ')
    
    우리는 초기화 단계에서 설정한 규칙에 부합되는 키 값의 유효한 하중을 전달하고 애니메이션 프로그램을 우리가 만든 집합에 추가합니다.
    여기는요.
                payload = {
                    "userID": user_id,
                    "MalList": malist,
                    "state": new_state
                }
                updated = database.update_document(
                    COLLECTIONID,
                    doc_id,
                    payload)
    
    우리는 데이터베이스를 보았다.업데이트 document in use는 새 문서를 만드는 대신 문서가 존재할 때 문서를 업데이트합니다.이것은 기존 문서에서 해석된 문서 id라는 다른 인자를 사용합니다
    doc_id = exists['documents'][0]['$id']
    
    이것은 데이터베이스를 통해 얻은 것이다. 문서를 표시하고 userID 속성이bot의 현재 사용자와 같은 필터를 가져옵니다(update.effective user.id)
        exists = database.list_documents(
            COLLECTIONID,
            filters=[f'userID={user_id}'])
    
    삭제 항목에 사용된 삭제 동작을 볼 수 있습니다
    def delete_item(update, context):
        """
            deletes entry 
        """
        user_id = update.effective_user.id
        if not len(context.args) == 1:
            context.bot.send_message(
                chat_id=update.effective_chat.id,
                text='Usage : /delete {id} ')
        else:
            # id of anime in question
            try:
                mal_id = int(context.args[0])
                # if doesnt exist ... ignore
                docs = database.list_documents(
                    COLLECTIONID,
                    filters=[f'userID={user_id}'])
                print(docs)
                if len(docs['documents']) == 0:
                    context.bot.send_message(
                        chat_id=update.effective_chat.id,
                        text="Nothing in your list to delete , start adding more via /anime.",
                        parse_mode=ParseMode.HTML)
                else:
                    docs = docs['documents'][0]  # there should only be one doc
                    doc_id = docs['$id']
                    print(docs)
                    mal_ids = docs['MalList']
                    statuses = docs['state']
                    print(mal_ids)
                    print(statuses)
                    last_items = len(mal_ids) == 1 and len(statuses) == 1
                    correct_item = mal_id == mal_ids[0]
                    if last_items and correct_item:
                        # delete the whole document as its the last item
                        database.delete_document(COLLECTIONID, doc_id)
                        context.bot.send_message(
                            chat_id=update.effective_chat.id,
                            text=f"Removed {mal_id} From your list , List is now empty .",
                            parse_mode=ParseMode.HTML)
                    elif not correct_item:
                        context.bot.send_message(
                            chat_id=update.effective_chat.id,
                            text=f"{mal_id} isnt in your list ",
                            parse_mode=ParseMode.HTML)
                    else:
                        index  = mal_ids.index(mal_id)
                        del mal_ids[0]
                        del statuses[0]
    
                        payload = {
                            "userID": user_id,
                            "MalList": mal_ids,
                            "state": statuses
                        }
                        database.update_document(
                            COLLECTIONID,
                            doc_id,
                            payload)
                        context.bot.send_message(
                            chat_id=update.effective_chat.id,
                            text=f'Deleted {mal_id} from list ')
    
            except ValueError:
                context.bot.send_message(
                    chat_id=update.effective_chat.id,
                    text='Usage : /delete {id} ')
    
    
    
    특히 이 부분에서 항목이 목록의 마지막이라면 이 문서를 삭제하고 집합 id와 문서 id를 전달하여 사용자에게 확인 메시지를 보냅니다
    if last_items and correct_item:
        # delete the whole document as its the last item
        database.delete_document(COLLECTIONID, doc_id)
        context.bot.send_message(
            chat_id=update.effective_chat.id,
            text=f"Removed {mal_id} From your list , List is now empty .",
            parse_mode=ParseMode.HTML)
    
    우리는 데이터베이스를 사용한다.list list 함수에 문서를 열거하여 다음과 같이 형식이 좋은 목록을 생성합니다
        docs = database.list_documents(
            COLLECTIONID,
            filters=[f'userID={user_id}'])
    
        if len(docs['documents']) == 0:
            context.bot.send_message(
                chat_id=update.effective_chat.id,
                text="No items in your list , start adding them via /anime.",
                parse_mode=ParseMode.HTML)
        else:
            docs = docs['documents'][0]  # there should only be one doc
            print(docs)
            mal_ids = docs['MalList']
            statuses = docs['state']
            anime_list = '<i><b> Your list : </b></i>\n\n'
            i = 0
            for id in mal_ids:
                anime = jikan.anime(int(id))
                anime_list = anime_list + f'[ <code>{anime["mal_id"]}</code> ] '
                anime_list = anime_list + f'<b>{anime["title"]}</b>\n'
                anime_list = anime_list + f'State : {statuses[i]}\n\n'
                anime_list = anime_list + f'Status : {anime["status"]}\n'
                anime_list = anime_list + f'Episodes : {anime["episodes"]}\n'
                genres = [genre['name'] for genre in anime['genres']]
                genre_string = ""
                for genre in genres:
                    genre_string = genre_string + f" {genre} ,"
                anime_list = anime_list + f'Genres : {genre_string[0:-1]}\n'
                anime_list = anime_list + '\n'
                print(anime)
                i += 1
            context.bot.send_message(
                chat_id=update.effective_chat.id,
                text=anime_list,
                parse_mode=ParseMode.HTML)
    
    
    우리는 기본적으로 교체되었다
        docs = database.list_documents(
            COLLECTIONID,
            filters=[f'userID={user_id}'])
    
    그리고 우리는 jikanPy를 사용하여 my anime list api에서 모든 애니메이션에 애니메이션을 입력하고, 예쁜 목록을 얻기 위해 템플릿과 문자열을 조작합니다.
            for id in mal_ids:
                anime = jikan.anime(int(id))
                anime_list = anime_list + f'[ <code>{anime["mal_id"]}</code> ] '
                anime_list = anime_list + f'<b>{anime["title"]}</b>\n'
                anime_list = anime_list + f'State : {statuses[i]}\n\n'
                anime_list = anime_list + f'Status : {anime["status"]}\n'
                anime_list = anime_list + f'Episodes : {anime["episodes"]}\n'
                genres = [genre['name'] for genre in anime['genres']]
                genre_string = ""
                for genre in genres:
                    genre_string = genre_string + f" {genre} ,"
                anime_list = anime_list + f'Genres : {genre_string[0:-1]}\n'
                anime_list = anime_list + '\n'
                print(anime)
                i += 1
            context.bot.send_message(
                chat_id=update.effective_chat.id,
                text=anime_list,
                parse_mode=ParseMode.HTML)
    
    project repo

    이것뿐이다



    제안, 의견 또는 질문이 있으면 로 전화하거나 @robi mez로 전화하십시오.
    나도 이 블로그에서 피드백을 받고 싶다. 왜냐하면 이것은 내가 처음으로 <3의 블로그를 한 편 썼기 때문이다.

    좋은 웹페이지 즐겨찾기