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 인 터 페 이 스 를 만 드 는 것 에 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.