[python 인터넷] Python으로 XML-RPC 서버 구축

Python으로 XML-RPC 서버 구축

 

한 15년전 즈음되나?

그땐 php에 빠져 허우적댔는데,,,

 

한동안 잊고있다가

 

나이 45에...

느닷없이 python으로 xpressengine 블로그 글쓰기를 해봐야겠다고 생각했다.

그래서 한번 해보니 대충 되긴된다.

 

 

import xmlrpc.client

API_URL = "http://econo.urin79.com/attention/api"

class NaverBlog(object):
    def __init__(self, user_id, api_key):
        self.__server = None
        self.__user_id = user_id
        self.__api_key = api_key
        self.__categories = []

        try:
            self.__set_categories()
        except Exception as e:
            raise e

    def __client(self):
        if self.__server is None:
            self.__server = xmlrpc.client.ServerProxy(API_URL)

        return self.__server

    def __set_categories(self):
        categories = self.__client().metaWeblog.getCategories(self.__user_id,
                                                              self.__user_id,
                                                              self.__api_key)

        for category in categories:
            self.__categories.append(category['title'])

    def post(self, title, description, category, publish=True):
        struct = {}
        struct['title'] = title
        struct['description'] = description
        if category in self.__categories:
            struct['categories'] = [category]

        try:
            return self.__client().metaWeblog.newPost(self.__user_id,
                                                      self.__user_id,
                                                      self.__api_key,
                                                      struct,
                                                      publish)
        except Exception as e:
            raise e


def main():
    naver = NaverBlog('아이디', '비밀번호')
    naver.post('테스트 제목', '<h1>테스트 글쓰기</h1>', '카테고리 한글')


if __name__ == '__main__':
    main()

 

 

 

 

1. XML-RPC란?

XML-RPC는 XML로 인코딩을 하는 RPC(Remote Procedure Call) 프로토콜의 종류 중 하나로, Server와 Client가 통신할때 사용한다. 이때, HTTP 프로토콜로 통신한다.

 

XML-RPC를 사용하면, client에서 server의 프로그램을 마치 로컬에 있는 프로그램을 사용하듯이 원격 실행이 가능하다.

 

이후에는 좀 더 부가기능을 추가하여 SOAP 프로토콜이 개발되었지만, 단순하고 사용하기 쉬운 XML-RPC를 더 많이 사용하고 있다. (비슷한 프로토콜로는 JSON-RPC가 존재)

 

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

1.1. XML-RPC XML 예시

XML-RPC Call

<?xml version="1.0"?>
<methodCall>
  <methodName>examples.getStateName</methodName>
  <params>
    <param>
        <value><i4>40</i4></value>
    </param>
  </params>
</methodCall>html

 

XML-RPC Response

<?xml version="1.0"?>
<methodResponse>
  <params>
    <param>
        <value><string>South Dakota</string></value>
    </param>
  </params>
</methodResponse>html

 

1.2. REST API vs XML-RPC

하지만, 요즘은 XML-RPC를 사용하지 않고 REST API를 많이 사용한다.

  • REST API가 상대적으로 사용하기 쉬움
  • XML-RPC는 대량의 데이터 전송에 상대적으로 효율적이지 못함

 

2. Python으로 XML-RPC 서버 구축

2.1. Server

from xmlrpc.server import SimpleXMLRPCServer
from xmlrpc.server import SimpleXMLRPCRequestHandler


class RequestHandler(SimpleXMLRPCRequestHandler):
    rpc_paths = ("/RPC2",)


if __name__ == "__main__":
    with SimpleXMLRPCServer(('localhost', 8000), requestHandler=RequestHandler) as server:
        server.register_introspection_functions()

        # 1. pow 함수를 저장하는 경우
        server.register_function(pow)

        # 2. 사용자가 정의한 함수를 저장하는 경우
        def adder_function(x, y):
            return x + y
        server.register_function(adder_function, 'add')

        # 3. 사용자가 정의한 클래스를 인스턴스로 생성하여 저장하는 경우
        class MyFuncs:
            def mul(self, x, y):
                return x + y
        server.register_instance(MyFuncs())

        # 서버 실행
        print("Start server...")
        server.serve_forever()
python

 

2.2. Client

Client쪽에는 pow, add, mul 메소드가 없지만, 실행 할 수 있다.

import xmlrpc.client

if __name__ == "__main__":
    proxy = xmlrpc.client.ServerProxy("http://localhost:8000")

    # 따로 pow, add, mul 함수를 정의한적이 없지만 사용이 가능하다.
    print(proxy.pow(2, 3))
    print(proxy.add(2, 3))
    print(proxy.mul(5, 2))

    # 사용할 수 있는 메소드 확인
    print(proxy.system.listMethods())
python

 

결과

 

 

 



출처: https://memostack.tistory.com/240 [MemoStack]

 

 

[출처] 우린친구블로그 - Python 메타블로그 글쓰기(제로보드, xpressengine blog api) (urin79.com)

 

 

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
46 [python][Django] [개념] Django는 Web Server가 아니라구요!! file 졸리운_곰 2023.03.11 490
45 [python][Django] [Django] Django Rest Framework에서 request 로깅하기 졸리운_곰 2023.03.11 392
44 [python][Django] Django REST Framework 졸리운_곰 2023.03.10 509
43 [python][Django] Django의 기본 개념 file 졸리운_곰 2023.03.10 480
42 Django 장고 텍스트에디터 사용하기(CKeditor) file 졸리운_곰 2020.11.22 1000
41 Django Traffic Monitor + 트래픽 초과 알림 file 졸리운_곰 2020.11.22 523
40 공공 데이터 XML 크롤링을 통해 Django HTML에 띄워보기 file 졸리운_곰 2020.05.05 543
39 파이썬 장고와 워드프레스 연동의 간단한 방법 : Simple django wordpress integration with Django WordPress API library 졸리운_곰 2019.10.28 1214
38 Django의 세션을 이용한 단계별 페이지 만들기 file 졸리운_곰 2019.02.02 936
37 Django 템플릿 (Template) 졸리운_곰 2019.02.02 610
36 python django 기본 file 졸리운_곰 2018.09.02 1124
35 PyCharm과 함께 DJango와 RestFramework를 활용한 웹 사이트 구축하기 file 졸리운_곰 2018.05.22 592
34 Installing Python and Django on WampServer file 졸리운_곰 2018.02.18 742
33 python django 개요 다이어그램 file 졸리운_곰 2018.02.10 1008
32 웹서버 중에서 Django를 선택한 이유 졸리운_곰 2017.08.22 1358
31 Django App 생성 file 졸리운_곰 2017.03.06 503
30 Django - 설치 및 Hello World 웹 서비스 만들기 졸리운_곰 2017.03.05 585
29 Learning Django and AngularJS 졸리운_곰 2017.02.06 1717
28 [Django 17] Django 디버깅 file 졸리운_곰 2017.01.28 1190
27 [Django 16] Django - Site Deployment 졸리운_곰 2017.01.28 605
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED