본문으로 건너뛰기

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 문서를 참조하십시오.