콘텐츠로 이동

HTTP 라우팅

Starlette에는 간단하지만 강력한 요청 라우팅 시스템이 있습니다. 라우팅 테이블은 경로 목록으로 정의되며 응용 프로그램이 Instantiated 될 때 전달됩니다.

Starlette. 응용 프로그램이 Starlette에서 가져옵니다.
Starlette.에서 일반 텍스트 응답을 가져옵니다.
별자리에서. 라우팅 가져오기 경로


Async def 홈페이지(요청):
    일반 텍스트 응답 반환("홈페이지")

비동기화 def 정보(요청):
    일반 텍스트 응답을 반환합니다("정보").


경로 = [
    경로("/", 엔드포인트 = 홈페이지),
    경로("/ 정보", 엔드포인트 = 정보),
]

앱=스타렛(루트=루트)

endpoint 매개 변수는 다음 중 하나가 될 수 있습니다.

  • request 단일 인수를 수락하고 응답을 반환해야 하는 일반 또는 비동기 함수입니다.
  • Starlette의 HTTPEndpoint와 같은 ASGI 인터페이스를 구현하는 클래스입니다.

경로 매개 변수

경로는 URI 템플릿 스타일을 사용하여 경로 구성 요소를 캡처할 수 있습니다.

경로('/사용자/{username}', 사용자)

기본적으로 경로가 끝날 때까지 또는 다음 / 까지 문자를 캡처합니다.

변환기를 사용하여 캡처된 콘텐츠를 수정할 수 있습니다. 사용 가능한 변환기는 다음과 같습니다.

  • str 문자열을 반환하고 기본값입니다.
  • int 파이썬 정수를 반환합니다.
  • float 파이썬 부동 소수점 번호를 반환합니다.
  • uuid 파이썬 반환 uuid.UUID 예.
  • path 추가 경로를 포함하여 나머지 경로로 돌아갑니다. / 캐릭터.

변환기는 다음과 같이 콜론 앞에 고정하여 사용합니다.

경로('/사용자/{user_id:int}', 사용자)
경로('/ 부동 소수점 /{number:float}', 부동 소수점)
경로('/업로드/{rest_of_path:path}', 업로드)

정의되지 않은 다른 변환기가 필요한 경우 직접 만들 수 있습니다.datetime 변환기를 만드는 방법과 등록하는 방법에 대한 예는 아래를 참조하십시오.

날짜 시간에서 가져오기 날짜 시간

Starlette. 컨버터 가져오기 컨버터, _url_ 컨버터


클래스 날짜 시간 변환기(컨버터):
    Regex =" [0-9]{4}- [0-9]{2}- [0-9]{2}T [0-9]{2}: [0-9]{2}: [0-9]{2}(. [

0-9] +)? "

    데프 변환(자체, 값: str) -> 날짜 시간:
        datetime을 반환합니다.strptime(값 "%Y-%m-%dT%H:%M:%S")

    Def to_문자열(자체, 값: 날짜 시간) -> str:
        반환 값.strftime("%Y-%m-%dT%H:%M:%S")

_url_tor("날짜 시간", 날짜 시간 변환기())

등록 후 다음과 같이 사용할 수 있습니다.

경로('/ 역사 /{date:datetime}', 역사)

경로 매개 변수는 요청에서 request.path_params 사전으로 사용할 수 있습니다.

비동기 def 사용자(요청):
    user_id = 요청. pase_params ['user_id']
    ...

HTTP 방법 처리

라우팅은 엔드포인트가 처리하는 HTTP 메서드를 지정할 수도 있습니다.

경로('/사용자/{user_id:int}', 사용자, 방법 = ["GET", "POST"])

기본적으로 함수 엔드포인트는 달리 지정되지 않은 한 GET 요청만 허용합니다.

서브베이스 장착 배선

대형 응용 프로그램에서는 공통 경로 접두사를 기준으로 라우팅 테이블의 일부를 분할할 수 있습니다.

경로 = [
    경로('/', 홈페이지),
    마운트('/사용자', 경로 = [
        경로('/', 사용자, 방법 = ['GET', 'POST']),
        경로('/{username}', 사용자),
    ])
]

이 스타일을 사용하면 프로젝트의 여러 부분에서 라우팅 테이블의 다른 부분 집합을 정의할 수 있습니다.

내 프로젝트에서 사용자 가져오기, auth

경로 = [
    경로('/', 홈페이지),
    마운트('/사용자', 경로 = 사용자.경로),
    마운트('/auth', 루트 = .),
]

마운트를 사용하여 Starlette 응용 프로그램에 하위 응용 프로그램을 포함할 수도 있습니다. 예를 들어...

# 독립형 정적 파일 서버입니다.
앱 = 정적 파일(디렉토리 = "정적")

# Starlette 애플리케이션 내에 장착된 정적 파일 서버입니다.
# "/정적" 경로 아래.
경로 = [
    ...
    마운트("/정적", 앱 = 정적 파일(디렉토리 = "정적"), 이름 = "정적")
]

앱=스타렛(루트=루트)

반전 URL 조회

일반적으로 리디렉션 응답을 반환해야 하는 경우와 같이 특정 경로에 대한 URL을 생성할 수 있어야 합니다.

  • 서명: url_for(name, **path_params) -> URL

    경로 = [경로("/", 홈페이지, 이름 = "홈페이지")]

    다음을 사용하여 URL을 반환할 수 있습니다. ..

    URL = 요청.url_for ("집")

URL 조회에는 경로 매개 변수가 포함될 수 있습니다. ..

경로 = [
    경로("/사용자/{username}", 사용자, 이름 = "user_")
]

# 다음을 사용하여 URL을 반환할 수 있습니다. ..
URL = 요청. url_for ("user_", username =...)

Mount 에 name 가 포함된 경우 베이스는 역방향 URL 조회에 {prefix}:{name} 스타일을 사용해야 합니다.

경로 = [
    마운트("/사용자", 이름 = "사용자", 경로 = [
        경로("/", 사용자, 이름 = "user_list"),
        경로("/{username}", 사용자, 이름 = "user_")
    ])
]

# 다음을 사용하여 URL을 반환할 수 있습니다. ..
URL = 요청.url_for ("사용자: user_list")
URL = 요청.url_for ("사용자: user_", username =. ..)

설치된 응용 프로그램에는 path=... 매개 변수가 포함될 수 있습니다.

경로 = [
    ...
    마운트("/정적", 앱 = 정적 파일(디렉토리 = "정적"), 이름 = "정적")
]

# 다음을 사용하여 URL을 반환할 수 있습니다. ..
URL = 요청.url_for ("정적", 경로 = "/css/base.css")

request 인스턴스가 없는 경우 응용 프로그램에 대해 역방향 조회를 수행할 수 있지만 이러한 조회는 URL 경로만 반환합니다.

URL = app.url_pase_for ("user_", username =. ..)

호스트 기반 라우팅

Host 헤더를 기반으로 동일한 경로에 대해 다른 경로를 사용하려면.

일치시킬 때 다음에서 시작한다는 점에 유의하십시오. Host 헤더에서 포트를 삭제합니다. 예를 들어, Host 헤더에는 다음을 제외하고 포함되거나 포함되지 않습니다. 3600 ( example.org:5600 , example.org ) 항구 밖, Host (host='example.org:3600', ...) 또한 처리됩니다. 그러므로 당신이 안에 있다면 url_for 포트를 사용해야 하는 경우 해당 포트를 지정할 수 있습니다.

호스트 기반 라우팅을 애플리케이션에 연결하는 몇 가지 방법이 있습니다.

사이트 = 라우터() `@site.route()` 이것을 구성하기 위해.
API = 라우터() `@api.route()` 이것을 구성하기 위해.
뉴스 = 라우터() `@news.route()` 이것을 구성하기 위해.

경로 = [
    호스트('api.example.org', api, name = "site_api")
]

앱=스타렛(루트=루트)

app.host('www.example.org', 사이트, 이름 = "main_site")

News_host = 호스트('news.example.org', 뉴스)
App.router.es.append (news_host)

URL 쿼리에는 경로 매개 변수와 마찬가지로 호스트 매개 변수가 포함될 수 있습니다.

경로 = [
    호스트("{subdomain}.example.org, "이름 = "하위", 앱 = 라우터(경로 = [
        마운트("/사용자", 이름 = "사용자", 경로 = [
            경로("/", 사용자, 이름 = "user_list"),
            경로("/{username}", 사용자, 이름 = "user_")
        ])
    ]))
]
...
URL = 요청.url_for ("하위: 사용자: user_", username =. .., 하위 도메인 =. ..)
URL = 요청.url_for (" 하위: 사용자: user_list", 하위 도메인 =. ..)

경로 우선 순위

들어오는 경로는 각 Route 와 순차적으로 일치합니다.

여러 경로가 들어오는 경로와 일치할 수 있는 상황에서는 일반적인 경우보다 더 구체적인 경로가 나열되도록 주의해야 합니다.

예를 들어:

# 이러지 마세요:`/users/me` 는 들어오는 요청과 일치하지 않습니다.
경로 = [
    경로('/사용자/{username}', 사용자),
    경로('//me', al_user),
]

# 이렇게 하세요:`/users/me` 가 먼저 테스트됩니다.
경로 = [
    경로('//me', al_user),
    경로('/사용자/{username}', 사용자),
]

라우터 인스턴스로 작업

낮은 수준에서 작업하는 경우 Starlette 애플리케이션을 생성하는 대신 일반 Router 인스턴스를 사용할 수 있습니다. 이를 통해 미들웨어에 포장하지 않고 애플리케이션 라우팅만 제공하는 경량 ASGI 애플리케이션을 제공합니다.

앱 = 라우터(경로 = [
    경로('/', 홈페이지),
    마운트('/사용자', 경로 = [
        경로('/', 사용자, 방법 = ['GET', 'POST']),
        경로('/{username}', 사용자),
    ])
])

웹 소켓 라우팅

WebSocket 엔드포인트를 사용할 때는 일반적인 Route 대신 WebSocketRoute 를 사용해야 합니다.

경로 매개 변수 및 WebSocketRoute 역방향 URL 조회는 HTTP에서 작동합니다. Route 마찬가지로 위의 HTTP 라우팅 섹션에서 찾을 수 있습니다.

Starlette. 응용 프로그램이 Starlette에서 가져옵니다.
스타렛에서. 라우팅 가져오기 웹 소켓 경로


Async def websocket_인덱스(웹 소켓):
    웹소켓을 기다리세요. 수락하세요 ()
    웹소켓을 기다리세요. send_gate ("안녕하세요, 웹소켓!")
    웹소켓을 기다리세요. 닫으세요 ()


Async def websocket_user(웹 소켓):
    이름 = 웹 소켓. pase_params ["이름"]
    웹소켓을 기다리세요. 수락하세요 ()
    웹 소켓 send_gate를 기다립니다(f "Hello,{name}")
    웹소켓을 기다리세요. 닫으세요 ()


경로 = [
    웹 소켓 경로("/", 끝점 = websocket_인덱스),
    WebSocketRoute("/{name}", endpoint = websocket_user),
]

앱=스타렛(루트=루트)

endpoint 매개 변수는 다음 중 하나가 될 수 있습니다.

  • 단일을 수락하는 비동기 함수 websocket 매개 변수.
  • Starlette의 WebSocketEndpoint와 같은 ASGI 인터페이스를 구현하는 클래스입니다.