B
    ind                 @   s  d dl mZ d dlmZmZmZmZmZmZm	Z	m
Z
mZmZmZ d dlmZ d dlmZmZ d dlmZmZ d dlmZmZmZ d dlmZmZ d dlmZ d d	lm Z  d d
l!m"Z"m#Z#m$Z$ d dl%m&Z& d dl'm(Z( d dl)m*Z* d dl+m,Z, d dl-m.Z. d dl/m0Z0 d dl1m2Z2 d dl3m4Z4 d dl5m6Z6 d dl7m8Z8 d dl9m:Z: d dl;m<Z< d dl=m>Z>m?Z?m@Z@ d dlAmBZB d dlCmDZDmEZEmFZFmGZGmHZH edddZIG dd de.ZJdS )    )Enum)Any	AwaitableCallable	CoroutineDictListOptionalSequenceTypeTypeVarUnion)routing)DefaultDefaultPlaceholder)DictIntStrAny	SetIntStr)http_exception_handler$request_validation_exception_handler.websocket_request_validation_exception_handler)RequestValidationErrorWebSocketRequestValidationError)logger)AsyncExitStackMiddleware)get_redoc_htmlget_swagger_ui_html#get_swagger_ui_oauth2_redirect_html)get_openapi)Depends)DecoratedCallable)generate_unique_id)	Starlette)State)HTTPException)
Middleware)BaseHTTPMiddleware)ServerErrorMiddleware)ExceptionMiddleware)Request)HTMLResponseJSONResponseResponse)	BaseRoute)ASGIAppLifespanReceiveScopeSendAppTypeFastAPI)boundc            '       s  e Zd Zddd dddddddeedddd	ddddddddddddddddddeed
"eeee	e
  eee eeee ee	eeef   ee	eeeeef f   eee  ee eee ee ee eeeef  eee  eeeeee f eeegeeeef f f  eeeg ef   eeeg ef   eee  ee eeeeeef f  eeeeeef f  eeeeeeeef eeef f  ee	e
  eej ee eeeeef  eejgef edd%ddZedddZeeef dddZ ddddZ!e"e#e$dd fddZ%eddddddddddddddddddeeddeedeedeeeef f eee ee	eee&f   eee  ee ee eeeeeef eeef f  ee ee	e  ee eee'e(f  eee'e(f  eeeeeeee e)f ee eeeef  eejgef ddddZ*eddddddddddddddddddeeddeedeeee ee	eee&f   eee  ee ee eeeeeef eeef f  ee ee	e  ee eee'e(f  eee'e(f  eeeeeee ee eeeef  eejgef ee+ge+f ddd Z,dfdd!eedef ee eee  dd"d#d$Z-dfdd!eee eee  ee+ge+f d%d&d'Z.ddddddeedeed(	ejeee	eee&f   eee  eeeeef eeef f  ee eee ee	e
  eejgef dd)d*d+Z/edddddddddddddddddeedddeed,eeee ee	eee&f   eee  ee ee eeeeeef eeef f  ee ee eee'e(f  eee'e(f  eeeeeee ee ee	e
  eeeef  eejgef ee+ge+f d-d.d/Z0edddddddddddddddddeedddeed,eeee ee	eee&f   eee  ee ee eeeeeef eeef f  ee ee eee'e(f  eee'e(f  eeeeeee ee ee	e
  eeeef  eejgef ee+ge+f d-d0d1Z1edddddddddddddddddeedddeed,eeee ee	eee&f   eee  ee ee eeeeeef eeef f  ee ee eee'e(f  eee'e(f  eeeeeee ee ee	e
  eeeef  eejgef ee+ge+f d-d2d3Z2edddddddddddddddddeedddeed,eeee ee	eee&f   eee  ee ee eeeeeef eeef f  ee ee eee'e(f  eee'e(f  eeeeeee ee ee	e
  eeeef  eejgef ee+ge+f d-d4d5Z3edddddddddddddddddeedddeed,eeee ee	eee&f   eee  ee ee eeeeeef eeef f  ee ee eee'e(f  eee'e(f  eeeeeee ee ee	e
  eeeef  eejgef ee+ge+f d-d6d7Z4edddddddddddddddddeedddeed,eeee ee	eee&f   eee  ee ee eeeeeef eeef f  ee ee eee'e(f  eee'e(f  eeeeeee ee ee	e
  eeeef  eejgef ee+ge+f d-d8d9Z5edddddddddddddddddeedddeed,eeee ee	eee&f   eee  ee ee eeeeeef eeef f  ee ee eee'e(f  eee'e(f  eeeeeee ee ee	e
  eeeef  eejgef ee+ge+f d-d:d;Z6edddddddddddddddddeedddeed,eeee ee	eee&f   eee  ee ee eeeeeef eeef f  ee ee eee'e(f  eee'e(f  eeeeeee ee ee	e
  eeeef  eejgef ee+ge+f d-d<d=Z7dfeeedf ee+ge+f d>d?d@Z8eee+ge+f dAdBdCZ9eee+ge+f dDdEdFZ:eeee f ee+ge+f dGdHdIZ;  Z<S )Jr3   FN z0.1.0z/openapi.jsonTz/docsz/redocz/docs/oauth2-redirect)"debugroutestitlesummarydescriptionversionopenapi_urlopenapi_tagsserversdependenciesdefault_response_classredirect_slashesdocs_url	redoc_urlswagger_ui_oauth2_redirect_urlswagger_ui_init_oauth
middlewareexception_handlers
on_startupon_shutdownlifespanterms_of_servicecontactlicense_infoopenapi_prefix	root_pathroot_path_in_servers	responses	callbackswebhooks
deprecatedinclude_in_schemaswagger_ui_parametersgenerate_unique_id_function)%selfr6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   extrareturnc   "   $      K   sd  || _ || _|| _|| _|| _|| _|| _|| _|| _|| _	|| _
|| _|| _|| _|| _|!| _|	pfg | _|#| _d| _d | _| jr| jstd| jstd|rtd |pt | _|p|| _t | _i | _tj||| |||||
||| ||"d| _|d kri nt|| _ | j !t"t# | j !t$t% | j !t&t' |d krHg nt(|| _)d | _*| +  d S )Nz3.1.0z4A title must be provided for OpenAPI, e.g.: 'My API'z5A version must be provided for OpenAPI, e.g.: '2.1.0'z"openapi_prefix" has been deprecated in favor of "root_path", which follows more closely the ASGI standard, is simpler, and more automatic. Check the docs at https://fastapi.tiangolo.com/advanced/sub-applications/)r7   rA   Zdependency_overrides_providerrH   rI   rJ   r@   r?   rR   rT   rU   rQ   rW   ),r6   r8   r9   r:   r;   rK   rL   rM   r<   r=   rP   rB   rC   rD   rE   rV   r>   rY   openapi_versionopenapi_schemaAssertionErrorr   warningr   	APIRouterrS   rO   r"   stateZdependency_overridesrouterdictrG   
setdefaultr#   r   r   r   r   r   listuser_middlewareZmiddleware_stacksetup)$rX   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rY    rg   8/tmp/pip-unpacked-wheel-x7mu4my2/fastapi/applications.py__init__4   sl    .


zFastAPI.__init__)rZ   c       
      C   s   | j }d }i }x0| j D ]"\}}|dtfkr4|}q|||< qW tt||dg| j tt||dttg }| j	}x&t
|D ]\}}	|f d|i|	}q|W |S )Ni  )handlerr6   )handlersr6   app)r6   rG   items	Exceptionr$   r&   re   r'   r   ra   reversed)
rX   r6   Zerror_handlerrG   keyvaluerF   rl   clsoptionsrg   rg   rh   build_middleware_stack   s    
zFastAPI.build_middleware_stackc             C   sH   | j sBt| j| j| j| j| j| j| j| j	| j
| jj
| j| jd| _ | j S )N)r8   r;   r[   r9   r:   rK   rL   rM   r7   rS   tagsr>   )r\   r   r8   r;   r[   r9   r:   rK   rL   rM   r7   rS   r=   r>   )rX   rg   rg   rh   openapi   s    zFastAPI.openapic                s    j rLdd  jD }dd |D ttd fdd} j j |dd	  j r jrttd fd
d} j j|dd	  jrttddd} j j|dd	  j r؈ jrttd fdd} j j|dd	 d S )Nc             s   s   | ]}| d V  qdS )urlN)get).0Zserver_datarg   rg   rh   	<genexpr>   s    z FastAPI.setup.<locals>.<genexpr>c             S   s   h | ]}|r|qS rg   rg   )ry   rw   rg   rg   rh   	<setcomp>   s    z FastAPI.setup.<locals>.<setcomp>)reqrZ   c                sN   | j ddd}|krB|rB jrB jdd|i | t  S )NrO   r5   /r   rw   )	scoperx   rstriprP   r>   insertaddr*   rv   )r|   rO   )rX   server_urlsrg   rh   rv      s    

zFastAPI.setup.<locals>.openapiF)rU   c                sL   | j ddd}| j } j}|r0|| }t| jd | j jdS )NrO   r5   r}   z - Swagger UI)r<   r8   oauth2_redirect_urlZ
init_oauthrV   )	r~   rx   r   r<   rD   r   r8   rE   rV   )r|   rO   r<   r   )rX   rg   rh   swagger_ui_html   s    
z&FastAPI.setup.<locals>.swagger_ui_htmlc                s   t  S )N)r   )r|   rg   rg   rh   swagger_ui_redirect  s    z*FastAPI.setup.<locals>.swagger_ui_redirectc                s0   | j ddd}| j }t| jd dS )NrO   r5   r}   z - ReDoc)r<   r8   )r~   rx   r   r<   r   r8   )r|   rO   r<   )rX   rg   rh   
redoc_html  s    
z!FastAPI.setup.<locals>.redoc_html)	r<   r>   r(   r*   Z	add_routerB   r)   rD   rC   )rX   urlsrv   r   r   r   rg   )rX   r   rh   rf      s"    zFastAPI.setup)r~   receivesendrZ   c                s*   | j r| j |d< t |||I d H  d S )NrO   )rO   super__call__)rX   r~   r   r   )	__class__rg   rh   r     s    
zFastAPI.__call__zSuccessful Response)response_modelstatus_coderu   r?   r9   r:   response_descriptionrQ   rT   methodsoperation_idresponse_model_includeresponse_model_excluderesponse_model_by_aliasresponse_model_exclude_unsetresponse_model_exclude_defaultsresponse_model_exclude_nonerU   response_classnameopenapi_extrarW   .)pathendpointr   r   ru   r?   r9   r:   r   rQ   rT   r   r   r   r   r   r   r   r   rU   r   r   r   rW   rZ   c            C   s@   | j j|||||||||	|
||||||||||||||d d S )N)r   r   r   ru   r?   r9   r:   r   rQ   rT   r   r   r   r   r   r   r   r   rU   r   r   r   rW   )ra   add_api_route)rX   r   r   r   r   ru   r?   r9   r:   r   rQ   rT   r   r   r   r   r   r   r   r   rU   r   r   r   rW   rg   rg   rh   r   $  s2     zFastAPI.add_api_route)r   r   r   ru   r?   r9   r:   r   rQ   rT   r   r   r   r   r   r   r   r   rU   r   r   r   rW   rZ   c               sF   t t d 	
fdd}|S )N)funcrZ   c                s@   j j	|  
d | S )N)r   r   ru   r?   r9   r:   r   rQ   rT   r   r   r   r   r   r   r   r   rU   r   r   r   rW   )ra   r   )r   )r?   rT   r:   rW   rU   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rQ   rX   r   r9   ru   rg   rh   	decorator|  s4    z$FastAPI.api_route.<locals>.decorator)r   )rX   r   r   r   ru   r?   r9   r:   r   rQ   rT   r   r   r   r   r   r   r   r   rU   r   r   r   rW   r   rg   )r?   rT   r:   rW   rU   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rQ   rX   r   r9   ru   rh   	api_route_  s    BzFastAPI.api_route)r?   )r   r   r   r?   rZ   c            C   s   | j j||||d d S )N)r   r?   )ra   add_api_websocket_route)rX   r   r   r   r?   rg   rg   rh   r     s
    zFastAPI.add_api_websocket_route)r   r   r?   rZ   c               s   t t d fdd}|S )N)r   rZ   c                s   j |  d | S )N)r   r?   )r   )r   )r?   r   r   rX   rg   rh   r     s    z$FastAPI.websocket.<locals>.decorator)r   )rX   r   r   r?   r   rg   )r?   r   r   rX   rh   	websocket  s    	zFastAPI.websocket)	prefixru   r?   rQ   rT   rU   r@   rR   rW   )ra   r   ru   r?   rQ   rT   rU   r@   rR   rW   rZ   c   	         C   s$   | j j|||||||||	|
d
 d S )N)	r   ru   r?   rQ   rT   rU   r@   rR   rW   )ra   include_router)rX   ra   r   ru   r?   rQ   rT   rU   r@   rR   rW   rg   rg   rh   r     s    zFastAPI.include_router)r   r   ru   r?   r9   r:   r   rQ   rT   r   r   r   r   r   r   r   rU   r   r   rR   r   rW   )r   r   r   ru   r?   r9   r:   r   rQ   rT   r   r   r   r   r   r   r   rU   r   r   rR   r   rW   rZ   c            C   s:   | j j|||||||||	|
|||||||||||||dS )N)r   r   ru   r?   r9   r:   r   rQ   rT   r   r   r   r   r   r   r   rU   r   r   rR   r   rW   )ra   rx   )rX   r   r   r   ru   r?   r9   r:   r   rQ   rT   r   r   r   r   r   r   r   rU   r   r   rR   r   rW   rg   rg   rh   rx     s0    zFastAPI.getc            C   s:   | j j|||||||||	|
|||||||||||||dS )N)r   r   ru   r?   r9   r:   r   rQ   rT   r   r   r   r   r   r   r   rU   r   r   rR   r   rW   )ra   put)rX   r   r   r   ru   r?   r9   r:   r   rQ   rT   r   r   r   r   r   r   r   rU   r   r   rR   r   rW   rg   rg   rh   r     s0    zFastAPI.putc            C   s:   | j j|||||||||	|
|||||||||||||dS )N)r   r   ru   r?   r9   r:   r   rQ   rT   r   r   r   r   r   r   r   rU   r   r   rR   r   rW   )ra   post)rX   r   r   r   ru   r?   r9   r:   r   rQ   rT   r   r   r   r   r   r   r   rU   r   r   rR   r   rW   rg   rg   rh   r   G  s0    zFastAPI.postc            C   s:   | j j|||||||||	|
|||||||||||||dS )N)r   r   ru   r?   r9   r:   r   rQ   rT   r   r   r   r   r   r   r   rU   r   r   rR   r   rW   )ra   delete)rX   r   r   r   ru   r?   r9   r:   r   rQ   rT   r   r   r   r   r   r   r   rU   r   r   rR   r   rW   rg   rg   rh   r   ~  s0    zFastAPI.deletec            C   s:   | j j|||||||||	|
|||||||||||||dS )N)r   r   ru   r?   r9   r:   r   rQ   rT   r   r   r   r   r   r   r   rU   r   r   rR   r   rW   )ra   rs   )rX   r   r   r   ru   r?   r9   r:   r   rQ   rT   r   r   r   r   r   r   r   rU   r   r   rR   r   rW   rg   rg   rh   rs     s0    zFastAPI.optionsc            C   s:   | j j|||||||||	|
|||||||||||||dS )N)r   r   ru   r?   r9   r:   r   rQ   rT   r   r   r   r   r   r   r   rU   r   r   rR   r   rW   )ra   head)rX   r   r   r   ru   r?   r9   r:   r   rQ   rT   r   r   r   r   r   r   r   rU   r   r   rR   r   rW   rg   rg   rh   r     s0    zFastAPI.headc            C   s:   | j j|||||||||	|
|||||||||||||dS )N)r   r   ru   r?   r9   r:   r   rQ   rT   r   r   r   r   r   r   r   rU   r   r   rR   r   rW   )ra   patch)rX   r   r   r   ru   r?   r9   r:   r   rQ   rT   r   r   r   r   r   r   r   rU   r   r   rR   r   rW   rg   rg   rh   r   #  s0    zFastAPI.patchc            C   s:   | j j|||||||||	|
|||||||||||||dS )N)r   r   ru   r?   r9   r:   r   rQ   rT   r   r   r   r   r   r   r   rU   r   r   rR   r   rW   )ra   trace)rX   r   r   r   ru   r?   r9   r:   r   rQ   rT   r   r   r   r   r   r   r   rU   r   r   rR   r   rW   rg   rg   rh   r   Z  s0    zFastAPI.trace)r   r   rZ   c                s   t t d fdd}|S )N)r   rZ   c                s   j j|  d | S )N)r   )ra   Zadd_websocket_route)r   )r   r   rX   rg   rh   r     s    z*FastAPI.websocket_route.<locals>.decorator)r   )rX   r   r   r   rg   )r   r   rX   rh   websocket_route  s    zFastAPI.websocket_route)
event_typerZ   c             C   s   | j |S )N)ra   on_event)rX   r   rg   rg   rh   r     s    zFastAPI.on_event)middleware_typerZ   c                s   t t d fdd}|S )N)r   rZ   c                s    j t| d | S )N)dispatch)Zadd_middlewarer%   )r   )rX   rg   rh   r     s    z%FastAPI.middleware.<locals>.decorator)r   )rX   r   r   rg   )rX   rh   rF     s    zFastAPI.middleware)exc_class_or_status_coderZ   c                s   t t d fdd}|S )N)r   rZ   c                s     |  | S )N)Zadd_exception_handler)r   )r   rX   rg   rh   r     s    z,FastAPI.exception_handler.<locals>.decorator)r   )rX   r   r   rg   )r   rX   rh   exception_handler  s    zFastAPI.exception_handler)=__name__
__module____qualname__r   r*   r    r2   boolr	   r   r,   strr   r   r   r
   r   r   r+   r$   intrn   r   r(   r   r.   r   r_   ZAPIRouteri   r-   rt   rv   rf   r0   r/   r1   r   r   r   r   r   r   r   r   r   r   r   rx   r   r   r   rs   r   r   r   r   r   rF   r   __classcell__rg   rg   )r   rh   r3   3   sh   {F15
 $"nN)Kenumr   typingr   r   r   r   r   r   r	   r
   r   r   r   Zfastapir   Zfastapi.datastructuresr   r   Zfastapi.encodersr   r   Zfastapi.exception_handlersr   r   r   Zfastapi.exceptionsr   r   Zfastapi.loggerr   Z!fastapi.middleware.asyncexitstackr   Zfastapi.openapi.docsr   r   r   Zfastapi.openapi.utilsr   Zfastapi.paramsr   Zfastapi.typesr   Zfastapi.utilsr    Zstarlette.applicationsr!   Zstarlette.datastructuresr"   Zstarlette.exceptionsr#   Zstarlette.middlewarer$   Zstarlette.middleware.baser%   Zstarlette.middleware.errorsr&   Zstarlette.middleware.exceptionsr'   Zstarlette.requestsr(   Zstarlette.responsesr)   r*   r+   Zstarlette.routingr,   Zstarlette.typesr-   r.   r/   r0   r1   r2   r3   rg   rg   rg   rh   <module>   s4   4