API Star 소개
API Star는 웹 API를 쉽게 구축할 수 있는 고성능 API 프레임워크입니다. 이는 간단하고 직관적이며 확장 가능하도록 설계되어 있어 작은 규모부터 대규모 애플리케이션까지 구축하는 데 이상적인 선택입니다.
역사
API Star는 Django REST framework의 인기 개발자인 Tom Christie에 의해 만들어졌습니다. 2017년에 처음 출시되었으며, Python 커뮤니티에서 큰 인기를 얻었습니다.
기능
1. 타입 어노테이션
API Star는 Python의 타입 어노테이션 기능을 활용하여 자동 요청 및 응답 유효성 검사를 제공합니다. 이를 통해 입력 및 출력 데이터의 예상 타입을 정의하여 잠재적인 버그를 조기에 발견하는 데 도움이 됩니다.
다음은 API Star와 함께 타입 어노테이션을 사용하는 예입니다.
from apistar import http, App, Route
def hello(name: str) -> dict:
return {'message': f'안녕하세요, {name}!'}
routes = [
Route('/hello/{name}/', method='GET', handler=hello),
]
app = App(routes=routes)
if __name__ == '__main__':
app.serve('127.0.0.1', 8000)
이 예제에서 hello 함수는 name이라는 str 타입의 매개변수를 받고 사전을 반환합니다. API Star는 name 매개변수와 반환 값의 타입을 자동으로 검증하여 API 계약이 지켜지도록 보장합니다.
2. 자동문서화
API Star는 API에 대한 포괄적인 문서를 자동으로 생성합니다. 이 문서에는 사용 가능한 엔드포인트, 예상 요청 및 응답 형식, 추가적으로 필요한 매개변수 또는 헤더에 대한 자세한 정보가 포함됩니다.
생성된 문서를 보려면 API를 실행한 후 웹 브라우저에서 /docs로 이동하면 됩니다.
3. 인증과 권한
API Star는 인증과 권한을 위한 내장 지원을 제공합니다. OAuth, JWT, API 키와 같은 인기 있는 인증 체계를 API에 쉽게 통합할 수 있습니다.
다음은 API Star에서 인증을 사용하는 예입니다.
from apistar import http, App, Route, annotate
def require_authentication() -> annotate(permissions=[IsAuthenticated]):
pass
def hello(user: User) -> dict:
return {'message': f'안녕하세요, {user.username}님!'}
routes = [
Route('/hello/', method='GET', handler=hello, permissions=[require_authentication]),
]
app = App(routes=routes)
if __name__ == '__main__':
app.serve('127.0.0.1', 8000)
이 예제에서 require_authentication 함수는 hello 엔드포인트의 권한 데코레이터로 사용됩니다. 이를 통해 인증된 사용자만이 엔드포인트에 액세스할 수 있도록 보장합니다. user 매개변수는 자동으로 인증된 사용자 객체로 채워집니다.
4. 데이터베이스 통합
API Star는 PostgreSQL, MySQL, SQLite와 같은 인기 있는 데이터베이스와 완벽하게 통합됩니다. 내장된 ORM을 사용하여 모델을 정의하고 데이터베이스 작업을 수행할 수 있습니다.
다음은 API Star에서 ORM을 사용하는 예입니다.
from apistar import http, App, Route, annotate
from apistar.backends import SQLAlchemy
app = App()
app.add_database(SQLAlchemy('sqlite:///mydatabase.db'))
class User(app.orm.Model):
__tablename__ = 'users'
id = app.orm.Column(app.orm.Integer, primary_key=True)
username = app.orm.Column(app.orm.String)
def list_users() -> list[User]:
return User.query.all()
routes = [
Route('/users/', method='GET', handler=list_users),
]
app = App(routes=routes)
if __name__ == '__main__':
app.serve('127.0.0.1', 8000)
이 예제에서 User 모델은 SQLAlchemy ORM을 사용하여 정의됩니다. list_users 함수는 데이터베이스에서 모든 사용자를 검색하여 User 객체의 리스트로 반환합니다.
5. 미들웨어 지원
API Star는 미들웨어 사용을 지원하여 요청 및 응답을 요청/응답 주기의 다양한 단계에서 수정할 수 있습니다. 인증, 로깅, 오류 처리 등과 같은 작업에 유용합니다.
다음은 API Star에서 미들웨어를 사용하는 예입니다.
from apistar import http, App, Route
def authentication_middleware(request: http.Request, handler) -> http.Response:
# 인증 로직을 수행합니다.
authenticated = True
if not authenticated:
return http.Response('Unauthorized', status=401)
response = handler(request)
return response
def hello() -> dict:
return {'message': '안녕하세요, 세계여!'}
routes = [
Route('/', method='GET', handler=hello),
]
middleware = [authentication_middleware]
app = App(routes=routes, middleware=middleware)
if __name__ == '__main__':
app.serve('127.0.0.1', 8000)
이 예제에서 authentication_middleware 함수는 요청을 가로채서 인증 로직을 수행합니다. 사용자가 인증되지 않은 경우 401 Unauthorized 응답이 반환됩니다. 그렇지 않으면 핸들러 함수가 호출되고 응답이 그대로 반환됩니다.
예제
예제 1: Hello World
from apistar import http, App, Route
def hello() -> dict:
return {'message': '안녕하세요, 세계여!'}
routes = [
Route('/', method='GET', handler=hello),
]
app = App(routes=routes)
if __name__ == '__main__':
app.serve('127.0.0.1', 8000)
출력:
{"message": "안녕하세요, 세계여!"}
예제 2: URL 매개변수
from apistar import http, App, Route
def hello(name: str) -> dict:
return {'message': f'안녕하세요, {name}님!'}
routes = [
Route('/hello/{name}/', method='GET', handler=hello),
]
app = App(routes=routes)
if __name__ == '__main__':
app.serve('127.0.0.1', 8000)
출력:
GET /hello/John/
{"message": "안녕하세요, John님!"}
예제 3: 쿼리 매개변수
from apistar import http, App, Route
def hello(name: str, age: int) -> dict:
return {'message': f'안녕하세요, {name}님! 당신은 {age}세입니다.'}
routes = [
Route('/hello/', method='GET', handler=hello),
]
app = App(routes=routes)
if __name__ == '__main__':
app.serve('127.0.0.1', 8000)
출력:
GET /hello/?name=John&age=25
{"message": "안녕하세요, John님! 당신은 25세입니다."}
더 많은 정보를 원하시면 공식 API Star 문서를 참조하십시오.