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 인터페이스를 구현하는 클래스입니다.