콘텐츠로 이동

요청

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()