Python 은 간단 한 REST 인 터 페 이 스 를 만 드 는 방법

문제.
간단 한 REST 인 터 페 이 스 를 사용 하여 네트워크 를 통 해 원 격 으로 제어 하거나 프로그램 에 접근 하고 싶 지만 완전한 웹 프레임 워 크 를 설치 하고 싶 지 않 습 니 다.
해결 방안
REST 스타일 의 인 터 페 이 스 를 구축 하 는 가장 쉬 운 방법 은 WSGI 표준(PEP 3333)을 기반 으로 하 는 아주 작은 라 이브 러 리 를 만 드 는 것 입 니 다.다음은 하나의 예 입 니 다.

# resty.py

import cgi

def notfound_404(environ, start_response):
  start_response('404 Not Found', [ ('Content-type', 'text/plain') ])
  return [b'Not Found']

class PathDispatcher:
  def __init__(self):
    self.pathmap = { }

  def __call__(self, environ, start_response):
    path = environ['PATH_INFO']
    params = cgi.FieldStorage(environ['wsgi.input'],
                 environ=environ)
    method = environ['REQUEST_METHOD'].lower()
    environ['params'] = { key: params.getvalue(key) for key in params }
    handler = self.pathmap.get((method,path), notfound_404)
    return handler(environ, start_response)

  def register(self, method, path, function):
    self.pathmap[method.lower(), path] = function
    return function
이 스케줄 러 를 사용 하기 위해 서 는 다른 프로세서 만 작성 해 야 합 니 다.아래 와 같이:

import time

_hello_resp = '''\
<html>
 <head>
   <title>Hello {name}</title>
  </head>
  <body>
   <h1>Hello {name}!</h1>
  </body>
</html>'''

def hello_world(environ, start_response):
  start_response('200 OK', [ ('Content-type','text/html')])
  params = environ['params']
  resp = _hello_resp.format(name=params.get('name'))
  yield resp.encode('utf-8')

_localtime_resp = '''\
<?xml version="1.0"?>
<time>
 <year>{t.tm_year}</year>
 <month>{t.tm_mon}</month>
 <day>{t.tm_mday}</day>
 <hour>{t.tm_hour}</hour>
 <minute>{t.tm_min}</minute>
 <second>{t.tm_sec}</second>
</time>'''

def localtime(environ, start_response):
  start_response('200 OK', [ ('Content-type', 'application/xml') ])
  resp = _localtime_resp.format(t=time.localtime())
  yield resp.encode('utf-8')

if __name__ == '__main__':
  from resty import PathDispatcher
  from wsgiref.simple_server import make_server

  # Create the dispatcher and register functions
  dispatcher = PathDispatcher()
  dispatcher.register('GET', '/hello', hello_world)
  dispatcher.register('GET', '/localtime', localtime)

  # Launch a basic server
  httpd = make_server('', 8080, dispatcher)
  print('Serving on port 8080...')
  httpd.serve_forever()
이 서버 를 테스트 하려 면 브 라 우 저 나 urllib 를 사용 하여 대화 할 수 있 습 니 다.예 를 들 면:

>>> u = urlopen('http://localhost:8080/hello?name=Guido')
>>> print(u.read().decode('utf-8'))
<html>
 <head>
   <title>Hello Guido</title>
  </head>
  <body>
   <h1>Hello Guido!</h1>
  </body>
</html>

>>> u = urlopen('http://localhost:8080/localtime')
>>> print(u.read().decode('utf-8'))
<?xml version="1.0"?>
<time>
 <year>2012</year>
 <month>11</month>
 <day>24</day>
 <hour>14</hour>
 <minute>49</minute>
 <second>17</second>
</time>
>>>
토론 하 다.
REST 인 터 페 이 스 를 작성 할 때 보통 HTTP 요청 에 서 비 스 를 제공 합 니 다.그러나 기능 이 완전한 사이트 에 비해 데이터 만 처리 해 야 한다.이 데 이 터 는 XML,JSON 또는 CSV 와 같은 각종 표준 형식 으로 인 코딩 된다.프로그램 이 간단 해 보이 지만 이런 방식 으로 제공 되 는 API 는 많은 프로그램 에 유용 하 다.
예 를 들 어 장기 적 으로 실행 되 는 프로그램 은 REST API 를 사용 하여 모니터링 이나 진단 을 실현 할 수 있다.빅 데이터 응용 프로그램 은 REST 를 사용 하여 데이터 조회 나 추출 시스템 을 구축 할 수 있다.REST 는 로봇,센서,공장 이나 전구 등 하드웨어 설 비 를 제어 하 는 데 도 사용 할 수 있다.더 중요 한 것 은 REST API 가 자바 script,Android,iOS 등 대량의 클 라 이언 트 프로 그래 밍 환경 에 의 해 지원 되 었 다 는 것 이다.따라서 이 인 터 페 이 스 를 이용 하면 더욱 복잡 한 응용 프로그램 을 개발 할 수 있다.
간단 한 REST 인 터 페 이 스 를 실현 하기 위해 서 는 프로그램 코드 가 Python 의 WSGI 기준 을 만족 시 키 기만 하면 된다.WSGI 는 표준 라 이브 러 리 에 의 해 지원 되 는 동시에 대부분 제3자 웹 프레임 워 크 에 의 해 지원 된다.따라서 코드 가 이 기준 을 따 르 면 뒤의 사용 과정 에서 더욱 유연 해 집 니 다!
WSGI 에 서 는 다음 과 같은 약속 방식 으로 호출 가능 한 대상 형식 으로 프로그램 을 실현 할 수 있 습 니 다.

import cgi

def wsgi_app(environ, start_response):
  pass
environ속성 은 아파 치[인터넷 RFC 3875 참조]와 같은 웹 서버 에서 제공 하 는 CGI 인터페이스 에서 얻 은 값 을 포함 하 는 사전 입 니 다.이 다른 값 을 추출 하려 면 이렇게 쓸 수 있 습 니 다.

def wsgi_app(environ, start_response):
  method = environ['REQUEST_METHOD']
  path = environ['PATH_INFO']
  # Parse the query parameters
  params = cgi.FieldStorage(environ['wsgi.input'], environ=environ)
우 리 는 흔히 볼 수 있 는 값 을 보 여 주 었 다.4567914)GET,POST,HEAD 등 대표 요청 유형.environ['REQUEST_METHOD'] 요청 한 자원 의 경 로 를 표시 합 니 다.호출environ['PATH_INFO'] 은 요청 에서 조회 파 라 메 터 를 추출 하여 나중에 사용 할 수 있 도록 사전 대상 에 넣 을 수 있 습 니 다.cgi.FieldStorage()인 자 는 요청 대상 을 초기 화하 기 위해 호출 되 어야 하 는 함수 입 니 다.첫 번 째 매개 변 수 는 HTTP 상태 값 을 되 돌려 주 는 것 이 고,두 번 째 매개 변 수 는(이름,값)원본 목록 으로 되 돌아 오 는 HTTP 헤드 를 구축 하 는 데 사 용 됩 니 다.예 를 들 면:

def wsgi_app(environ, start_response):
  pass
  start_response('200 OK', [('Content-type', 'text/plain')])
데 이 터 를 되 돌리 기 위해 서 는 WSGI 프로그램 이 바이트 문자열 시퀀스 를 되 돌려 야 합 니 다.아래 와 같이 목록 을 사용 하여 완성 할 수 있 습 니 다:

def wsgi_app(environ, start_response):
  pass
  start_response('200 OK', [('Content-type', 'text/plain')])
  resp = []
  resp.append(b'Hello World
') resp.append(b'Goodbye!
') return resp
또는,당신 은 yield 를 사용 할 수 있 습 니 다:

def wsgi_app(environ, start_response):
  pass
  start_response('200 OK', [('Content-type', 'text/plain')])
  yield b'Hello World
' yield b'Goodbye!
'
여기 서 강조 하고 자 하 는 것 은 마지막 으로 돌아 오 는 것 이 바이트 문자열 이 어야 한 다 는 것 이다.결과 에 텍스트 문자열 이 포함 되 어 있 으 면 바이트 로 인 코딩 해 야 합 니 다.물론 돌아 오 라 는 것 은 텍스트 가 아 닙 니 다.그림 을 만 드 는 프로그램 을 쉽게 만 들 수 있 습 니 다.
WSGI 프로그램 은 보통 함수 로 정의 되 지만,적절 한start_response방법 을 실현 하기 만 하면 클래스 인 스 턴 스 를 사용 할 수 있 습 니 다.예 를 들 면:

class WSGIApplication:
  def __init__(self):
    ...
  def __call__(self, environ, start_response)
    ...
우 리 는 이미 위 에서 이런 기술 을 사용 하여__call__() 류 를 만 들 었 다.이 배포 기 는 하나의 사전 만 관리 하고 프로세서 함수 에(방법,경로)를 매 핑 합 니 다.요청 이 왔 을 때,그것 의 방법 과 경 로 를 추출 한 후에 대응 하 는 프로세서 위로 나 누 어 집 니 다.또한 모든 조회 변 수 는 분 석 된 후에 사전 에 넣 고PathDispatcher형식 으로 저 장 됩 니 다.뒤의 이 절 차 는 너무 흔 하기 때문에 배포 기 에서 완성 하 는 것 을 권장 합 니 다.그러면 중복 코드 를 많이 줄 일 수 있 습 니 다.배포 기 를 사용 할 때 인 스 턴 스 를 간단하게 만 든 다음 각종 WSGI 형식의 함 수 를 등록 하 십시오.이 함수 들 을 작성 하 는 것 은 매우 간단 할 것 입 니 다.environ['params'] 함수 의 작성 규칙 을 따 르 고 마지막 으로 바이트 문자열 을 되 돌려 주면 됩 니 다.
이 함 수 를 작성 할 때 주의해 야 할 것 은 문자열 템 플 릿 을 사용 하 는 것 입 니 다.아무 도start_response(),XML,그리고 대량의 포맷 작업 이 섞 여 있 는 코드 를 쓰 고 싶 어 하지 않 는 다.세 개의 따옴표 에 포 함 된 미리 정 의 된 문자열 템 플 릿 을 사 용 했 습 니 다.이 방식 은 나중에 출력 형식 을 쉽게 수정 할 수 있 습 니 다.
마지막 으로 WSGI 를 사용 하 는 데 중요 한 부분 은 특정 웹 서버 를 겨냥 한 곳 이 없다 는 것 이다.표준 은 서버 와 프레임 워 크 에 중립 적 이기 때문에 모든 종류의 서버 에 프로그램 을 넣 을 수 있 습 니 다.우 리 는 아래 의 코드 를 사용 하여 이 절 코드 를 테스트 합 니 다.

if __name__ == '__main__':
  from wsgiref.simple_server import make_server

  # Create the dispatcher and register functions
  dispatcher = PathDispatcher()
  pass

  # Launch a basic server
  httpd = make_server('', 8080, dispatcher)
  print('Serving on port 8080...')
  httpd.serve_forever()
위의 코드 는 간단 한 서버 를 만 든 후에 당신 의 실현 이 정상적으로 작 동 할 수 있 는 지 를 테스트 할 수 있 습 니 다.마지막 으로 프로그램 을 더 확장 하려 고 할 때 이 코드 를 수정 하여 특정 서버 를 위해 일 할 수 있 도록 할 수 있 습 니 다.
WSGI 자체 가 아주 작은 기준 이다.따라서 인증,cookies,재 설정 등 고급 특성 을 제공 하지 않 았 다.이것 은 네가 스스로 실현 하 는 것 도 어렵 지 않다.그러나 더 많은 지 지 를 원한 다 면 제3자 라 이브 러 리,예 를 들 어print() 또는WebOb를 고려 할 수 있다.
이상 은 Python 이 간단 한 REST 인 터 페 이 스 를 만 드 는 방법 에 대한 상세 한 내용 입 니 다.Python 이 REST 인 터 페 이 스 를 만 드 는 것 에 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!

좋은 웹페이지 즐겨찾기