요청
Starlette에는 Request 클래스 - ASGI 범위에 직접 액세스하고 채널을 수신하는 대신 수신 요청을 처리할 수 있는 보다 사용자 친화적인 인터페이스를 제공합니다.
요청
서명: Request(scope, receive=None)
스타렛에서. 요청 가져오기 요청
스타렛의 응답.
비동기 def 앱(범위, 수신, 전송):
주장 범위 ['유형'] == 'http'
요청 = 요청(범위, 수신)
내용 = '%s %s'%(요청. 방법, 요청. URL.경로)
응답 = 응답(내용, media_type = '텍스트/일반')
응답 대기 중(범위, 수신, 전송)
요청은 매핑 인터페이스를 제공하므로 scope 와 마찬가지로 사용할 수 있습니다.
예를 들어 request['path'] 는 ASGI 경로를 반환합니다.
요청 본문에 액세스할 필요가 없는 경우 receive 에 매개 변수를 제공하지 않고 요청을 Instantiate할 수 있습니다.
방법
요청 방법은 request.method 로 액세스됩니다.
균일한 리소스 로케이터(일반적으로 URL이라고도 함)
요청된 URL은 request.url 로 액세스됩니다.
이 속성은 URL에서 구문 분석할 수 있는 모든 구성 요소를 노출하는 문자열과 같은 개체입니다.
예를 들어 request.url.path,request.url.port,request.url.scheme.
제목
헤더는 불변의 대소문자를 구분하지 않는 다중 사전으로 노출됩니다.
예를 들어: request.headers['content-type']
쿼리 매개 변수
쿼리 매개 변수는 불변의 여러 사전으로 노출됩니다.
예를 들어: request.query_params['search']
경로 매개 변수
라우터 경로 매개 변수는 사전 인터페이스로 노출됩니다.
예를 들어: request.path_params['username']
고객 주소
클라이언트의 원격 주소는 request.client(또는 None)라는 바이너리로 노출됩니다.
호스트 이름 또는 IP 주소: request.client.host
클라이언트가 연결하는 포트 번호: request.client.port
쿠키
쿠키는 일반 사전 인터페이스의 형태로 렌더링됩니다.
예를 들어: request.cookies.get('mycookie')
잘못된 쿠키의 경우 쿠키는 무시됩니다. (RFC2109)
몸
요청 본문을 반환하기 위한 여러 가지 인터페이스가 있습니다.
요청 본문은 바이트 형식입니다. await request.body()
양식 데이터 또는 여러 부분으로 분석된 요청 본문: async with request.form() as form:
JSON으로 분석된 요청 본문: await request.json()
async for 구문을 사용하여 요청 본문에 스트림으로 액세스할 수도 있습니다.
스타렛에서. 요청 가져오기 요청
스타렛의 응답.
비동기 def 앱(범위, 수신, 전송):
주장 범위 ['유형'] == 'http'
요청 = 요청(범위, 수신)
몸 = b'
request.stream 청크에 대한 비동기화():
바디 + = 청크
응답 = 응답 (본문, media_type = '텍스트/일반')
응답 대기 중(범위, 수신, 전송)
.stream() 에 액세스하면 전체 본문이 메모리에 저장되지 않고 바이트 청크가 제공됩니다..body(),.form() 또는 .json() 에 대한 후속 호출은 오류를 발생시킵니다.
긴 폴링 또는 스트리밍 응답과 같은 경우에 클라이언트 측의 연결이 끊겼는지 여부를 결정해야 할 수도 있습니다.disconnected = await request.is_disconnected() 를 사용하여 이 상태를 확인할 수 있습니다.
요청 파일
요청 파일은 일반적으로 다중 부분 양식 데이터(multipart/form-data)로 전송됩니다.
서명: request.form(max_files=1000, max_fields=1000)
매개 변수를 사용할 수 있습니다. max_files 그리고 max_fields 최대 필드 또는 파일 수를 구성합니다.
요청 양식과 비동기화(max_files=1000, max_field=1000):
...
보안상의 이유로 이러한 제한을 설정하는!!! 정보는 너무 많은 빈 필드를 분석하면 많은 CPU와 메모리를 소비할 수 있기 때문에 분산 서비스 거부를 초래할 수 있는 필드 또는 파일 수를 무제한으로 허용합니다.
async with request.form() as form 를 호출하면 starlette.datastructures.FormData 가 표시됩니다.starlette.datastructures.FormData 는 파일 업로드 및 텍스트 입력을 포함하는 불변의 다중 사전입니다. 파일 업로드 항목은 starlette.datastructures.UploadFile 의 인스턴스로 표시됩니다.
UploadFile 다음과 같은 속성이 있습니다.
filename: 원본 파일 이름 업로드str또는 사용할 수 없는 경우None(예를 들어myimage.jpg).content_type: 콘텐츠 유형(MIME 유형/미디어 유형)이 있는str또는 사용할 수 없는 경우None(예:image/jpeg).file:SpooledTemporaryFile(파일과 유사한 개체)입니다. 이것은 "파일과 같은" 개체를 기대하는 다른 기능이나 라이브러리에 직접 전달할 수 있는 실제 파이썬 파일입니다.headers:Headers개체. 일반적으로 이것은Content-Type헤더만 되지만 다른 헤더가 다중 부분 필드에 포함된 경우 여기에도 포함됩니다. 이러한 헤더는Request.headers의 헤더와 관련이 없습니다.size: 업로드된 파일 크기(바이트)의int입니다. 이 값은 요청 내용을 기반으로 계산되므로Content-Length헤더보다 업로드된 파일의 크기를 결정하는 데 더 좋습니다. 설정되지 않은 경우None입니다.
UploadFile 에는 다음과 같은 async 방법이 있습니다. 그들은 모두 후드 아래의 해당 파일 메소드를 호출합니다(내부 SpooledTemporaryFile 사용).
async write(data): 파일에data(bytes)를 씁니다.async read(size): 파일 읽기size(int) 바이트.async seek(offset)파일의 바이트 위치로 이동offset(int) 장소.- 예를 들어,
await myfile.seek(0)파일의 시작 위치로 이동합니다.
- 예를 들어,
async close(): 파일을 닫습니다.
이 모든 방법은 async 방법, 당신은 그들을 "기다려야" 합니다.
예를 들어 다음을 통해 파일 이름과 내용을 얻을 수 있습니다.
요청과 비동기화합니다.양식()을 형식으로 지정합니다.
파일 이름 = 양식 [ " upload_파일 " ] . 파일 이름
내용 = 양식을 기다립니다 [ " upload_파일 " ] .read ( )
RFC-7578:4.2에 지정된!!! 정보는 파일을 포함하는 양식 데이터 콘텐츠 섹션에서 Content-Disposition 헤더:Content-Disposition: form-data; name="user"; filename="somefile" 에 name 및 filename 필드가 있다고 가정합니다.
filename 필드는 RFC-7578에 따라 선택 사항이지만 Starlette가 파일로 간주해야 하는 데이터를 구별하는 데 도움이 됩니다.
filename 필드가 제공된 경우 기본 파일에 액세스하기 위해 UploadFile 개체가 생성되고 그렇지 않으면 양식 데이터 부분이 구문 분석되어 원시 문자열로 사용할 수 있습니다.
응용 프로그램
시작 Starlette 애플리케이션은 request.app 를 통해 액세스할 수 있습니다.
상태
요청에 대한 추가 정보를 저장하려면 request.state 를 사용하여 저장할 수 있습니다.
예를 들어:
request.state.time_started = time.time()