跳至内容

测试客户端 - TestClient

您可以使用 TestClient 类来测试 FastAPI 应用程序,而无需创建实际的 HTTP 和套接字连接,只需直接与 FastAPI 代码通信。

FastAPI 测试文档 中了解更多信息。

您可以直接从 fastapi.testclient 中导入它

from fastapi.testclient import TestClient

fastapi.testclient.TestClient

TestClient(
    app,
    base_url="http://testserver",
    raise_server_exceptions=True,
    root_path="",
    backend="asyncio",
    backend_options=None,
    cookies=None,
    headers=None,
    follow_redirects=True,
)

基类:Client

参数 描述
app

类型: ASGIApp

base_url

类型: str 默认值: 'http://testserver'

raise_server_exceptions

类型: bool 默认值: True

root_path

类型: str 默认值: ''

backend

类型: Literal['asyncio', 'trio'] 默认值: 'asyncio'

backend_options

类型: dict[str, Any] | None 默认值: None

cookies

类型: CookieTypes | None 默认值: None

headers

类型: dict[str, str] | None 默认值: None

是否跟随重定向

类型: bool 默认值: True

源代码位于 starlette/testclient.py
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
def __init__(
    self,
    app: ASGIApp,
    base_url: str = "http://testserver",
    raise_server_exceptions: bool = True,
    root_path: str = "",
    backend: typing.Literal["asyncio", "trio"] = "asyncio",
    backend_options: dict[str, typing.Any] | None = None,
    cookies: httpx._types.CookieTypes | None = None,
    headers: dict[str, str] | None = None,
    follow_redirects: bool = True,
) -> None:
    self.async_backend = _AsyncBackend(backend=backend, backend_options=backend_options or {})
    if _is_asgi3(app):
        asgi_app = app
    else:
        app = typing.cast(ASGI2App, app)  # type: ignore[assignment]
        asgi_app = _WrapASGI2(app)  # type: ignore[arg-type]
    self.app = asgi_app
    self.app_state: dict[str, typing.Any] = {}
    transport = _TestClientTransport(
        self.app,
        portal_factory=self._portal_factory,
        raise_server_exceptions=raise_server_exceptions,
        root_path=root_path,
        app_state=self.app_state,
    )
    if headers is None:
        headers = {}
    headers.setdefault("user-agent", "testclient")
    super().__init__(
        base_url=base_url,
        headers=headers,
        transport=transport,
        follow_redirects=follow_redirects,
        cookies=cookies,
    )

headers 属性 可写

headers

发送请求时包含的 HTTP 头。

follow_redirects 实例属性

follow_redirects = follow_redirects

max_redirects 实例属性

max_redirects = max_redirects

is_closed 属性

is_closed

检查客户端是否已关闭

trust_env 属性

trust_env

timeout 属性 可写

timeout

event_hooks 属性 可写

event_hooks

auth 属性 可写

auth

在请求级别未传递任何认证时使用的认证类。

另请参阅 身份验证

base_url 属性 可写

base_url

使用相对 URL 发送请求时使用的基本 URL。

cookies 属性 可写

cookies

发送请求时包含的 Cookie 值。

params 属性 可写

params

发送请求时在 URL 中包含的查询参数。

task 实例属性

task

portal 类属性 实例属性

portal = None

async_backend 实例属性

async_backend = _AsyncBackend(
    backend=backend, backend_options=backend_options or {}
)

app 实例属性

app = asgi_app

app_state 实例属性

app_state = {}

build_request

build_request(
    method,
    url,
    *,
    content=None,
    data=None,
    files=None,
    json=None,
    params=None,
    headers=None,
    cookies=None,
    timeout=USE_CLIENT_DEFAULT,
    extensions=None
)

构建并返回请求实例。

  • paramsheaderscookies 参数与客户端上设置的任何值合并。
  • url 参数与客户端上设置的任何 base_url 合并。

另请参阅:请求实例

参数 描述
方法

类型: str

网址

类型: URLTypes

内容

类型: 可选[RequestContent] 默认值: None

数据

类型: 可选[RequestData] 默认值: None

文件

类型: 可选[RequestFiles] 默认值: None

JSON

类型: 可选[任何] 默认值: None

参数

类型: 可选[QueryParamTypes] 默认值: None

headers

类型: 可选[HeaderTypes] 默认值: None

cookies

类型: 可选[CookieTypes] 默认值: None

超时

类型: 联合[TimeoutTypes, UseClientDefault] 默认值: USE_CLIENT_DEFAULT

扩展

类型: 可选[RequestExtensions] 默认值: None

源代码位于 httpx/_client.py
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
def build_request(
    self,
    method: str,
    url: URLTypes,
    *,
    content: typing.Optional[RequestContent] = None,
    data: typing.Optional[RequestData] = None,
    files: typing.Optional[RequestFiles] = None,
    json: typing.Optional[typing.Any] = None,
    params: typing.Optional[QueryParamTypes] = None,
    headers: typing.Optional[HeaderTypes] = None,
    cookies: typing.Optional[CookieTypes] = None,
    timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT,
    extensions: typing.Optional[RequestExtensions] = None,
) -> Request:
    """
    Build and return a request instance.

    * The `params`, `headers` and `cookies` arguments
    are merged with any values set on the client.
    * The `url` argument is merged with any `base_url` set on the client.

    See also: [Request instances][0]

    [0]: /advanced/#request-instances
    """
    url = self._merge_url(url)
    headers = self._merge_headers(headers)
    cookies = self._merge_cookies(cookies)
    params = self._merge_queryparams(params)
    extensions = {} if extensions is None else extensions
    if "timeout" not in extensions:
        timeout = (
            self.timeout
            if isinstance(timeout, UseClientDefault)
            else Timeout(timeout)
        )
        extensions = dict(**extensions, timeout=timeout.as_dict())
    return Request(
        method,
        url,
        content=content,
        data=data,
        files=files,
        json=json,
        params=params,
        headers=headers,
        cookies=cookies,
        extensions=extensions,
    )

stream

stream(
    method,
    url,
    *,
    content=None,
    data=None,
    files=None,
    json=None,
    params=None,
    headers=None,
    cookies=None,
    auth=USE_CLIENT_DEFAULT,
    follow_redirects=USE_CLIENT_DEFAULT,
    timeout=USE_CLIENT_DEFAULT,
    extensions=None
)

httpx.request() 的替代方法,它流式传输响应主体,而不是一次性将其加载到内存中。

参数:请参阅 httpx.request

另请参阅:流式响应

参数 描述
方法

类型: str

网址

类型: URLTypes

内容

类型: 可选[RequestContent] 默认值: None

数据

类型: 可选[RequestData] 默认值: None

文件

类型: 可选[RequestFiles] 默认值: None

JSON

类型: 可选[任何] 默认值: None

参数

类型: 可选[QueryParamTypes] 默认值: None

headers

类型: 可选[HeaderTypes] 默认值: None

cookies

类型: 可选[CookieTypes] 默认值: None

认证

类型: 联合[AuthTypes, UseClientDefault, None] 默认值: USE_CLIENT_DEFAULT

是否跟随重定向

类型: 联合[bool, UseClientDefault] 默认值: USE_CLIENT_DEFAULT

超时

类型: 联合[TimeoutTypes, UseClientDefault] 默认值: USE_CLIENT_DEFAULT

扩展

类型: 可选[RequestExtensions] 默认值: None

产量 描述
回应
源代码位于 httpx/_client.py
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
@contextmanager
def stream(
    self,
    method: str,
    url: URLTypes,
    *,
    content: typing.Optional[RequestContent] = None,
    data: typing.Optional[RequestData] = None,
    files: typing.Optional[RequestFiles] = None,
    json: typing.Optional[typing.Any] = None,
    params: typing.Optional[QueryParamTypes] = None,
    headers: typing.Optional[HeaderTypes] = None,
    cookies: typing.Optional[CookieTypes] = None,
    auth: typing.Union[AuthTypes, UseClientDefault, None] = USE_CLIENT_DEFAULT,
    follow_redirects: typing.Union[bool, UseClientDefault] = USE_CLIENT_DEFAULT,
    timeout: typing.Union[TimeoutTypes, UseClientDefault] = USE_CLIENT_DEFAULT,
    extensions: typing.Optional[RequestExtensions] = None,
) -> typing.Iterator[Response]:
    """
    Alternative to `httpx.request()` that streams the response body
    instead of loading it into memory at once.

    **Parameters**: See `httpx.request`.

    See also: [Streaming Responses][0]

    [0]: /quickstart#streaming-responses
    """
    request = self.build_request(
        method=method,
        url=url,
        content=content,
        data=data,
        files=files,
        json=json,
        params=params,
        headers=headers,
        cookies=cookies,
        timeout=timeout,
        extensions=extensions,
    )
    response = self.send(
        request=request,
        auth=auth,
        follow_redirects=follow_redirects,
        stream=True,
    )
    try:
        yield response
    finally:
        response.close()

send

send(
    request,
    *,
    stream=False,
    auth=USE_CLIENT_DEFAULT,
    follow_redirects=USE_CLIENT_DEFAULT
)

发送请求。

请求按原样发送,未修改。

通常,您需要使用 Client.build_request() 构建一个请求,以便将任何客户端级别的配置合并到请求中,但也可以传递显式的 httpx.Request()

另请参阅:请求实例

参数 描述
请求

类型: Request

类型: bool 默认值: False

认证

类型: 联合[AuthTypes, UseClientDefault, None] 默认值: USE_CLIENT_DEFAULT

是否跟随重定向

类型: 联合[bool, UseClientDefault] 默认值: USE_CLIENT_DEFAULT

源代码位于 httpx/_client.py
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
def send(
    self,
    request: Request,
    *,
    stream: bool = False,
    auth: typing.Union[AuthTypes, UseClientDefault, None] = USE_CLIENT_DEFAULT,
    follow_redirects: typing.Union[bool, UseClientDefault] = USE_CLIENT_DEFAULT,
) -> Response:
    """
    Send a request.

    The request is sent as-is, unmodified.

    Typically you'll want to build one with `Client.build_request()`
    so that any client-level configuration is merged into the request,
    but passing an explicit `httpx.Request()` is supported as well.

    See also: [Request instances][0]

    [0]: /advanced/#request-instances
    """
    if self._state == ClientState.CLOSED:
        raise RuntimeError("Cannot send a request, as the client has been closed.")

    self._state = ClientState.OPENED
    follow_redirects = (
        self.follow_redirects
        if isinstance(follow_redirects, UseClientDefault)
        else follow_redirects
    )

    auth = self._build_request_auth(request, auth)

    response = self._send_handling_auth(
        request,
        auth=auth,
        follow_redirects=follow_redirects,
        history=[],
    )
    try:
        if not stream:
            response.read()

        return response

    except BaseException as exc:
        response.close()
        raise exc

close

close()

关闭传输和代理。

源代码位于 httpx/_client.py
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
def close(self) -> None:
    """
    Close transport and proxies.
    """
    if self._state != ClientState.CLOSED:
        self._state = ClientState.CLOSED

        self._transport.close()
        for transport in self._mounts.values():
            if transport is not None:
                transport.close()

request

request(
    method,
    url,
    *,
    content=None,
    data=None,
    files=None,
    json=None,
    params=None,
    headers=None,
    cookies=None,
    auth=USE_CLIENT_DEFAULT,
    follow_redirects=None,
    allow_redirects=None,
    timeout=USE_CLIENT_DEFAULT,
    extensions=None
)
参数 描述
方法

类型: str

网址

类型: URLTypes

内容

类型: RequestContent | None 默认值: None

数据

类型: _RequestData | None 默认值: None

文件

类型: RequestFiles | None 默认值: None

JSON

类型: 任何 默认值: None

参数

类型: QueryParamTypes | None 默认值: None

headers

类型: HeaderTypes | None 默认值: None

cookies

类型: CookieTypes | None 默认值: None

认证

类型: AuthTypes | UseClientDefault 默认值: USE_CLIENT_DEFAULT

是否跟随重定向

类型: bool | None 默认值: None

允许重定向

类型: bool | None 默认值: None

超时

类型: TimeoutTypes | UseClientDefault 默认值: USE_CLIENT_DEFAULT

扩展

类型: dict[str, Any] | None 默认值: None

源代码位于 starlette/testclient.py
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
def request(  # type: ignore[override]
    self,
    method: str,
    url: httpx._types.URLTypes,
    *,
    content: httpx._types.RequestContent | None = None,
    data: _RequestData | None = None,
    files: httpx._types.RequestFiles | None = None,
    json: typing.Any = None,
    params: httpx._types.QueryParamTypes | None = None,
    headers: httpx._types.HeaderTypes | None = None,
    cookies: httpx._types.CookieTypes | None = None,
    auth: httpx._types.AuthTypes | httpx._client.UseClientDefault = httpx._client.USE_CLIENT_DEFAULT,
    follow_redirects: bool | None = None,
    allow_redirects: bool | None = None,
    timeout: httpx._types.TimeoutTypes | httpx._client.UseClientDefault = httpx._client.USE_CLIENT_DEFAULT,
    extensions: dict[str, typing.Any] | None = None,
) -> httpx.Response:
    url = self._merge_url(url)
    redirect = self._choose_redirect_arg(follow_redirects, allow_redirects)
    return super().request(
        method,
        url,
        content=content,
        data=data,
        files=files,
        json=json,
        params=params,
        headers=headers,
        cookies=cookies,
        auth=auth,
        follow_redirects=redirect,
        timeout=timeout,
        extensions=extensions,
    )

get

get(
    url,
    *,
    params=None,
    headers=None,
    cookies=None,
    auth=USE_CLIENT_DEFAULT,
    follow_redirects=None,
    allow_redirects=None,
    timeout=USE_CLIENT_DEFAULT,
    extensions=None
)
参数 描述
网址

类型: URLTypes

参数

类型: QueryParamTypes | None 默认值: None

headers

类型: HeaderTypes | None 默认值: None

cookies

类型: CookieTypes | None 默认值: None

认证

类型: AuthTypes | UseClientDefault 默认值: USE_CLIENT_DEFAULT

是否跟随重定向

类型: bool | None 默认值: None

允许重定向

类型: bool | None 默认值: None

超时

类型: TimeoutTypes | UseClientDefault 默认值: USE_CLIENT_DEFAULT

扩展

类型: dict[str, Any] | None 默认值: None

源代码位于 starlette/testclient.py
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
def get(  # type: ignore[override]
    self,
    url: httpx._types.URLTypes,
    *,
    params: httpx._types.QueryParamTypes | None = None,
    headers: httpx._types.HeaderTypes | None = None,
    cookies: httpx._types.CookieTypes | None = None,
    auth: httpx._types.AuthTypes | httpx._client.UseClientDefault = httpx._client.USE_CLIENT_DEFAULT,
    follow_redirects: bool | None = None,
    allow_redirects: bool | None = None,
    timeout: httpx._types.TimeoutTypes | httpx._client.UseClientDefault = httpx._client.USE_CLIENT_DEFAULT,
    extensions: dict[str, typing.Any] | None = None,
) -> httpx.Response:
    redirect = self._choose_redirect_arg(follow_redirects, allow_redirects)
    return super().get(
        url,
        params=params,
        headers=headers,
        cookies=cookies,
        auth=auth,
        follow_redirects=redirect,
        timeout=timeout,
        extensions=extensions,
    )

options

options(
    url,
    *,
    params=None,
    headers=None,
    cookies=None,
    auth=USE_CLIENT_DEFAULT,
    follow_redirects=None,
    allow_redirects=None,
    timeout=USE_CLIENT_DEFAULT,
    extensions=None
)
参数 描述
网址

类型: URLTypes

参数

类型: QueryParamTypes | None 默认值: None

headers

类型: HeaderTypes | None 默认值: None

cookies

类型: CookieTypes | None 默认值: None

认证

类型: AuthTypes | UseClientDefault 默认值: USE_CLIENT_DEFAULT

是否跟随重定向

类型: bool | None 默认值: None

允许重定向

类型: bool | None 默认值: None

超时

类型: TimeoutTypes | UseClientDefault 默认值: USE_CLIENT_DEFAULT

扩展

类型: dict[str, Any] | None 默认值: None

源代码位于 starlette/testclient.py
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
def options(  # type: ignore[override]
    self,
    url: httpx._types.URLTypes,
    *,
    params: httpx._types.QueryParamTypes | None = None,
    headers: httpx._types.HeaderTypes | None = None,
    cookies: httpx._types.CookieTypes | None = None,
    auth: httpx._types.AuthTypes | httpx._client.UseClientDefault = httpx._client.USE_CLIENT_DEFAULT,
    follow_redirects: bool | None = None,
    allow_redirects: bool | None = None,
    timeout: httpx._types.TimeoutTypes | httpx._client.UseClientDefault = httpx._client.USE_CLIENT_DEFAULT,
    extensions: dict[str, typing.Any] | None = None,
) -> httpx.Response:
    redirect = self._choose_redirect_arg(follow_redirects, allow_redirects)
    return super().options(
        url,
        params=params,
        headers=headers,
        cookies=cookies,
        auth=auth,
        follow_redirects=redirect,
        timeout=timeout,
        extensions=extensions,
    )

head

head(
    url,
    *,
    params=None,
    headers=None,
    cookies=None,
    auth=USE_CLIENT_DEFAULT,
    follow_redirects=None,
    allow_redirects=None,
    timeout=USE_CLIENT_DEFAULT,
    extensions=None
)
参数 描述
网址

类型: URLTypes

参数

类型: QueryParamTypes | None 默认值: None

headers

类型: HeaderTypes | None 默认值: None

cookies

类型: CookieTypes | None 默认值: None

认证

类型: AuthTypes | UseClientDefault 默认值: USE_CLIENT_DEFAULT

是否跟随重定向

类型: bool | None 默认值: None

允许重定向

类型: bool | None 默认值: None

超时

类型: TimeoutTypes | UseClientDefault 默认值: USE_CLIENT_DEFAULT

扩展

类型: dict[str, Any] | None 默认值: None

源代码位于 starlette/testclient.py
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
def head(  # type: ignore[override]
    self,
    url: httpx._types.URLTypes,
    *,
    params: httpx._types.QueryParamTypes | None = None,
    headers: httpx._types.HeaderTypes | None = None,
    cookies: httpx._types.CookieTypes | None = None,
    auth: httpx._types.AuthTypes | httpx._client.UseClientDefault = httpx._client.USE_CLIENT_DEFAULT,
    follow_redirects: bool | None = None,
    allow_redirects: bool | None = None,
    timeout: httpx._types.TimeoutTypes | httpx._client.UseClientDefault = httpx._client.USE_CLIENT_DEFAULT,
    extensions: dict[str, typing.Any] | None = None,
) -> httpx.Response:
    redirect = self._choose_redirect_arg(follow_redirects, allow_redirects)
    return super().head(
        url,
        params=params,
        headers=headers,
        cookies=cookies,
        auth=auth,
        follow_redirects=redirect,
        timeout=timeout,
        extensions=extensions,
    )

post

post(
    url,
    *,
    content=None,
    data=None,
    files=None,
    json=None,
    params=None,
    headers=None,
    cookies=None,
    auth=USE_CLIENT_DEFAULT,
    follow_redirects=None,
    allow_redirects=None,
    timeout=USE_CLIENT_DEFAULT,
    extensions=None
)
参数 描述
网址

类型: URLTypes

内容

类型: RequestContent | None 默认值: None

数据

类型: _RequestData | None 默认值: None

文件

类型: RequestFiles | None 默认值: None

JSON

类型: 任何 默认值: None

参数

类型: QueryParamTypes | None 默认值: None

headers

类型: HeaderTypes | None 默认值: None

cookies

类型: CookieTypes | None 默认值: None

认证

类型: AuthTypes | UseClientDefault 默认值: USE_CLIENT_DEFAULT

是否跟随重定向

类型: bool | None 默认值: None

允许重定向

类型: bool | None 默认值: None

超时

类型: TimeoutTypes | UseClientDefault 默认值: USE_CLIENT_DEFAULT

扩展

类型: dict[str, Any] | None 默认值: None

源代码位于 starlette/testclient.py
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
def post(  # type: ignore[override]
    self,
    url: httpx._types.URLTypes,
    *,
    content: httpx._types.RequestContent | None = None,
    data: _RequestData | None = None,
    files: httpx._types.RequestFiles | None = None,
    json: typing.Any = None,
    params: httpx._types.QueryParamTypes | None = None,
    headers: httpx._types.HeaderTypes | None = None,
    cookies: httpx._types.CookieTypes | None = None,
    auth: httpx._types.AuthTypes | httpx._client.UseClientDefault = httpx._client.USE_CLIENT_DEFAULT,
    follow_redirects: bool | None = None,
    allow_redirects: bool | None = None,
    timeout: httpx._types.TimeoutTypes | httpx._client.UseClientDefault = httpx._client.USE_CLIENT_DEFAULT,
    extensions: dict[str, typing.Any] | None = None,
) -> httpx.Response:
    redirect = self._choose_redirect_arg(follow_redirects, allow_redirects)
    return super().post(
        url,
        content=content,
        data=data,
        files=files,
        json=json,
        params=params,
        headers=headers,
        cookies=cookies,
        auth=auth,
        follow_redirects=redirect,
        timeout=timeout,
        extensions=extensions,
    )

put

put(
    url,
    *,
    content=None,
    data=None,
    files=None,
    json=None,
    params=None,
    headers=None,
    cookies=None,
    auth=USE_CLIENT_DEFAULT,
    follow_redirects=None,
    allow_redirects=None,
    timeout=USE_CLIENT_DEFAULT,
    extensions=None
)
参数 描述
网址

类型: URLTypes

内容

类型: RequestContent | None 默认值: None

数据

类型: _RequestData | None 默认值: None

文件

类型: RequestFiles | None 默认值: None

JSON

类型: 任何 默认值: None

参数

类型: QueryParamTypes | None 默认值: None

headers

类型: HeaderTypes | None 默认值: None

cookies

类型: CookieTypes | None 默认值: None

认证

类型: AuthTypes | UseClientDefault 默认值: USE_CLIENT_DEFAULT

是否跟随重定向

类型: bool | None 默认值: None

允许重定向

类型: bool | None 默认值: None

超时

类型: TimeoutTypes | UseClientDefault 默认值: USE_CLIENT_DEFAULT

扩展

类型: dict[str, Any] | None 默认值: None

源代码位于 starlette/testclient.py
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
def put(  # type: ignore[override]
    self,
    url: httpx._types.URLTypes,
    *,
    content: httpx._types.RequestContent | None = None,
    data: _RequestData | None = None,
    files: httpx._types.RequestFiles | None = None,
    json: typing.Any = None,
    params: httpx._types.QueryParamTypes | None = None,
    headers: httpx._types.HeaderTypes | None = None,
    cookies: httpx._types.CookieTypes | None = None,
    auth: httpx._types.AuthTypes | httpx._client.UseClientDefault = httpx._client.USE_CLIENT_DEFAULT,
    follow_redirects: bool | None = None,
    allow_redirects: bool | None = None,
    timeout: httpx._types.TimeoutTypes | httpx._client.UseClientDefault = httpx._client.USE_CLIENT_DEFAULT,
    extensions: dict[str, typing.Any] | None = None,
) -> httpx.Response:
    redirect = self._choose_redirect_arg(follow_redirects, allow_redirects)
    return super().put(
        url,
        content=content,
        data=data,
        files=files,
        json=json,
        params=params,
        headers=headers,
        cookies=cookies,
        auth=auth,
        follow_redirects=redirect,
        timeout=timeout,
        extensions=extensions,
    )

patch

patch(
    url,
    *,
    content=None,
    data=None,
    files=None,
    json=None,
    params=None,
    headers=None,
    cookies=None,
    auth=USE_CLIENT_DEFAULT,
    follow_redirects=None,
    allow_redirects=None,
    timeout=USE_CLIENT_DEFAULT,
    extensions=None
)
参数 描述
网址

类型: URLTypes

内容

类型: RequestContent | None 默认值: None

数据

类型: _RequestData | None 默认值: None

文件

类型: RequestFiles | None 默认值: None

JSON

类型: 任何 默认值: None

参数

类型: QueryParamTypes | None 默认值: None

headers

类型: HeaderTypes | None 默认值: None

cookies

类型: CookieTypes | None 默认值: None

认证

类型: AuthTypes | UseClientDefault 默认值: USE_CLIENT_DEFAULT

是否跟随重定向

类型: bool | None 默认值: None

允许重定向

类型: bool | None 默认值: None

超时

类型: TimeoutTypes | UseClientDefault 默认值: USE_CLIENT_DEFAULT

扩展

类型: dict[str, Any] | None 默认值: None

源代码位于 starlette/testclient.py
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
def patch(  # type: ignore[override]
    self,
    url: httpx._types.URLTypes,
    *,
    content: httpx._types.RequestContent | None = None,
    data: _RequestData | None = None,
    files: httpx._types.RequestFiles | None = None,
    json: typing.Any = None,
    params: httpx._types.QueryParamTypes | None = None,
    headers: httpx._types.HeaderTypes | None = None,
    cookies: httpx._types.CookieTypes | None = None,
    auth: httpx._types.AuthTypes | httpx._client.UseClientDefault = httpx._client.USE_CLIENT_DEFAULT,
    follow_redirects: bool | None = None,
    allow_redirects: bool | None = None,
    timeout: httpx._types.TimeoutTypes | httpx._client.UseClientDefault = httpx._client.USE_CLIENT_DEFAULT,
    extensions: dict[str, typing.Any] | None = None,
) -> httpx.Response:
    redirect = self._choose_redirect_arg(follow_redirects, allow_redirects)
    return super().patch(
        url,
        content=content,
        data=data,
        files=files,
        json=json,
        params=params,
        headers=headers,
        cookies=cookies,
        auth=auth,
        follow_redirects=redirect,
        timeout=timeout,
        extensions=extensions,
    )

delete

delete(
    url,
    *,
    params=None,
    headers=None,
    cookies=None,
    auth=USE_CLIENT_DEFAULT,
    follow_redirects=None,
    allow_redirects=None,
    timeout=USE_CLIENT_DEFAULT,
    extensions=None
)
参数 描述
网址

类型: URLTypes

参数

类型: QueryParamTypes | None 默认值: None

headers

类型: HeaderTypes | None 默认值: None

cookies

类型: CookieTypes | None 默认值: None

认证

类型: AuthTypes | UseClientDefault 默认值: USE_CLIENT_DEFAULT

是否跟随重定向

类型: bool | None 默认值: None

允许重定向

类型: bool | None 默认值: None

超时

类型: TimeoutTypes | UseClientDefault 默认值: USE_CLIENT_DEFAULT

扩展

类型: dict[str, Any] | None 默认值: None

源代码位于 starlette/testclient.py
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
def delete(  # type: ignore[override]
    self,
    url: httpx._types.URLTypes,
    *,
    params: httpx._types.QueryParamTypes | None = None,
    headers: httpx._types.HeaderTypes | None = None,
    cookies: httpx._types.CookieTypes | None = None,
    auth: httpx._types.AuthTypes | httpx._client.UseClientDefault = httpx._client.USE_CLIENT_DEFAULT,
    follow_redirects: bool | None = None,
    allow_redirects: bool | None = None,
    timeout: httpx._types.TimeoutTypes | httpx._client.UseClientDefault = httpx._client.USE_CLIENT_DEFAULT,
    extensions: dict[str, typing.Any] | None = None,
) -> httpx.Response:
    redirect = self._choose_redirect_arg(follow_redirects, allow_redirects)
    return super().delete(
        url,
        params=params,
        headers=headers,
        cookies=cookies,
        auth=auth,
        follow_redirects=redirect,
        timeout=timeout,
        extensions=extensions,
    )

websocket_connect

websocket_connect(url, subprotocols=None, **kwargs)
参数 描述
网址

类型: str

子协议

类型: Sequence[str] | None 默认值: None

**关键字参数**

类型: Any 默认值: {}

源代码位于 starlette/testclient.py
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
def websocket_connect(
    self,
    url: str,
    subprotocols: typing.Sequence[str] | None = None,
    **kwargs: typing.Any,
) -> WebSocketTestSession:
    url = urljoin("ws://testserver", url)
    headers = kwargs.get("headers", {})
    headers.setdefault("connection", "upgrade")
    headers.setdefault("sec-websocket-key", "testserver==")
    headers.setdefault("sec-websocket-version", "13")
    if subprotocols is not None:
        headers.setdefault("sec-websocket-protocol", ", ".join(subprotocols))
    kwargs["headers"] = headers
    try:
        super().request("GET", url, **kwargs)
    except _Upgrade as exc:
        session = exc.session
    else:
        raise RuntimeError("Expected WebSocket upgrade")  # pragma: no cover

    return session

lifespan 异步

lifespan()
源代码位于 starlette/testclient.py
756
757
758
759
760
761
async def lifespan(self) -> None:
    scope = {"type": "lifespan", "state": self.app_state}
    try:
        await self.app(scope, self.stream_receive.receive, self.stream_send.send)
    finally:
        await self.stream_send.send(None)

wait_startup 异步

wait_startup()
源代码位于 starlette/testclient.py
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
async def wait_startup(self) -> None:
    await self.stream_receive.send({"type": "lifespan.startup"})

    async def receive() -> typing.Any:
        message = await self.stream_send.receive()
        if message is None:
            self.task.result()
        return message

    message = await receive()
    assert message["type"] in (
        "lifespan.startup.complete",
        "lifespan.startup.failed",
    )
    if message["type"] == "lifespan.startup.failed":
        await receive()

wait_shutdown 异步

wait_shutdown()
源代码位于 starlette/testclient.py
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
async def wait_shutdown(self) -> None:
    async def receive() -> typing.Any:
        message = await self.stream_send.receive()
        if message is None:
            self.task.result()
        return message

    async with self.stream_send:
        await self.stream_receive.send({"type": "lifespan.shutdown"})
        message = await receive()
        assert message["type"] in (
            "lifespan.shutdown.complete",
            "lifespan.shutdown.failed",
        )
        if message["type"] == "lifespan.shutdown.failed":
            await receive()