U
    RhΏ                     @   s
  d dl Z d dlZd dlmZmZ d dlmZmZ 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mZmZ d dlZ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%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2 d dl3m4Z4 d d	l5m6Z6m7Z7 d d
l8m9Z9m:Z: d dl;m<Z< d dl=m>Z> d dl?m@Z@mAZA d dlBmCZC d dlDmEZEmFZF d dlGmHZH d dlImJZJ d dlKm4ZL d dlMmNZN d dlOmPZPmQZQmRZRmSZSmTZT d dlUmVZVmWZW d dlXmYZY d dlZm[Z[ d dl\m]Z]m^Z^m_Z_ ej`dkrd dl maZa nd dlbmaZa dZcdZdddddZeddefejgefeeef  e9d d!d"Zhejgefe9d#d$d%Ziddd&ejged'e
f efeef eeef  e9d(d)d*Zjeeed'e
f  eefd'f f Zkd+dd,e9eleeek  e9d-d.d/Zmee ee d0d1d2Zne9ee d3d4d5Zoed'e
f e jpd6d7d8Zqe
eefe
f e
d9d:d;Zred'e
f e
d6d<d=Zsddd>d?efed'e
f eef eeef  ele9d@dAdBZtefe
e9eel dCdDdEZueG dFdG dGZvefe
e
elevdHdIdJZwee9ddKdLdMZxed'e
f eld6dNdOZyed'e
f eld6dPdQZzed'e
f eld6dRdSZ{ed'e
f eeefe
f e
dTdUdVZ|eG dWdX dXZ}ddddddYeeWe[f e9eeeefe
f ePf  eeL eeY ee
 eeeed'e
f eef f e
f  eele}dZ
d[d\Z~ee
eefe
f eefd'f ee
ee
 f d]d^d_Zdteeefe
f eefdf e
d`dadbZee eeefe
f eSeQf eeefe
f ee
 f dcdddeZe
eldfdgdhZee eld0didjZee ePeefe
f dkdldmZee eeeefe
f ePf  eleeefe
f eeefe
f  f dndodpZe9efelee dqdrdsZdS )u    N)AsyncExitStackcontextmanager)copydeepcopy)	dataclass)AnyCallable	CoroutineDict
ForwardRefListMappingOptionalSequenceTupleTypeUnioncast)params)PYDANTIC_V2ErrorWrapper
ModelFieldRequiredParam	Undefined_regenerate_error_with_loccopy_field_infocreate_body_modelevaluate_forwardreffield_annotation_is_scalarget_annotation_from_field_infoget_cached_model_fieldsget_missing_field_erroris_bytes_fieldis_bytes_sequence_fieldis_scalar_fieldis_scalar_sequence_fieldis_sequence_field.is_uploadfile_or_nonable_uploadfile_annotation!is_uploadfile_sequence_annotationlenient_issubclasssequence_typesserialize_sequence_valuevalue_is_sequence)BackgroundTasks)asynccontextmanagercontextmanager_in_threadpool)	DependantSecurityRequirement)logger)SecurityBase)OAuth2SecurityScopes)OpenIdConnect)create_model_fieldget_path_param_names)	BaseModel)	FieldInfo)run_in_threadpool)FormDataHeadersImmutableMultiDictQueryParams
UploadFile)HTTPConnectionRequest)Response)	WebSocket)	Annotatedget_args
get_origin)      )iscoroutinefunctionzForm data requires "python-multipart" to be installed. 
You can install "python-multipart" with: 

pip install python-multipart
zForm data requires "python-multipart" to be installed. It seems you installed "multipart" instead. 
You can remove "multipart" with: 

pip uninstall multipart

And then install "python-multipart" with: 

pip install python-multipart
)returnc                  C   s   zddl m}  | dkstW n ttfk
r   zZddlm}  | sFtzddlm} |s\tW n( tk
r   tt	 t
t	d Y nX W n( tk
r   tt t
td Y nX Y nX d S )Nr   )__version__z0.0.12)parse_options_header)Zpython_multipartrL   AssertionErrorImportErrorZ	multipartZmultipart.multipartrM   r2   error!multipart_incorrect_install_errorRuntimeErrormultipart_not_installed_error)rL   rM    rT   @./venv/lib/python3.8/site-packages/fastapi/dependencies/utils.pyensure_multipart_is_installeda   s     

rV   )security_scopes)
param_namedependspathrW   rK   c                 C   s   |j s
tt||j || |dS )N)rY   
dependencyrZ   namerW   )r[   rN   get_sub_dependantrX   rY   rZ   rW   rT   rT   rU   get_param_sub_dependant|   s    
r_   )rY   rZ   rK   c                 C   s"   t | jstdt| | j|dS )Nz;A parameter-less dependency must have a callable dependency)rY   r[   rZ   )callabler[   rN   r]   )rY   rZ   rT   rT   rU   get_parameterless_sub_dependant   s    ra   )r\   rW   .)rY   r[   rZ   r\   rW   rK   c           	      C   s|   d }|p
g }t | tjr(| j}|| t |trTg }t |ttfrH|}t||d}t	||||| j
d}|rx|j| |S )N)Zsecurity_schemescopes)rZ   callr\   rW   	use_cache)
isinstancer   ZSecurityrb   extendr3   r4   r6   r1   get_dependantrd   security_requirementsappend)	rY   r[   rZ   r\   rW   Zsecurity_requirementZdependency_scopesZ
use_scopessub_dependantrT   rT   rU   r]      s.    

 r]   Fskip_repeatsvisited)	dependantrl   rm   rK   c             
   C   s   |d krg }| | j t| j | j | j | j | j | j	 | j
| jd}| jD ]v}|rr|j|krrq^t|||d}|j|j |j|j |j|j |j|j |j|j |j	|j	 q^|S )N)path_paramsquery_paramsheader_paramscookie_paramsbody_paramsrh   rd   rZ   rk   )ri   	cache_keyr0   ro   r   rp   rq   rr   rs   rh   rd   rZ   dependenciesget_flat_dependantrf   )rn   rl   rm   flat_dependantrj   Zflat_subrT   rT   rU   rv      s8    

  rv   )fieldsrK   c                 C   s:   | s| S | d }t | dkr6t|jtr6t|j}|S | S )Nr      )lenr)   type_r9   r    )rx   first_fieldfields_to_extractrT   rT   rU   _get_flat_fields_from_params   s    
r~   )rn   rK   c                 C   sD   t | dd}t|j}t|j}t|j}t|j}|| | | S )NT)rl   )rv   r~   ro   rp   rq   rr   )rn   rw   ro   rp   rq   rr   rT   rT   rU   get_flat_params   s    



r   )rc   rK   c                    s<   t | }t| di   fdd|j D }t |}|S )N__globals__c              	      s,   g | ]$}t j|j|j|jt|j d qS ))r\   kinddefault
annotation)inspectZ	Parameterr\   r   r   get_typed_annotationr   ).0paramglobalnsrT   rU   
<listcomp>   s   
z'get_typed_signature.<locals>.<listcomp>)r   	signaturegetattr
parametersvalues	Signature)rc   r   Ztyped_paramsZtyped_signaturerT   r   rU   get_typed_signature   s    

	
r   )r   r   rK   c                 C   s2   t | tr.t| } t| ||} | td kr.d S | S N)re   strr   r   type)r   r   rT   rT   rU   r      s    
r   c                 C   s6   t | }|j}|t jjkr d S t| di }t||S )Nr   )r   r   Zreturn_annotationr   emptyr   r   )rc   r   r   r   rT   rT   rU   get_typed_return_annotation  s    
r   T)r\   rW   rd   )rZ   rc   r\   rW   rd   rK   c                 C   s   t | }t|}|j}t||| ||d}| D ]\}	}
|	|k}t|	|
j|
j|d}|jd k	r~t	|	|j| |d}|j
| q0t|	|j|dr|jd ks0td|	q0|jd k	stt|jjtjr|j|j q0t|j|d q0|S )N)rc   r\   rZ   rW   rd   )rX   r   valueis_path_paramr^   rX   type_annotationrn   z0Cannot specify multiple FastAPI annotations for )fieldrn   )r8   r   r   r0   itemsanalyze_paramr   r   rY   r_   ru   ri   !add_non_field_param_to_dependencyr   r   rN   re   
field_infor   Bodyrs   add_param_to_fields)rZ   rc   r\   rW   rd   Zpath_param_namesZendpoint_signatureZsignature_paramsrn   rX   r   r   Zparam_detailsrj   rT   rT   rU   rg     sR    
rg   )rX   r   rn   rK   c                 C   s|   t |tr| |_dS t |tr(| |_dS t |tr<| |_dS t |trP| |_dS t |t	rd| |_
dS t |trx| |_dS d S )NT)r)   rB   request_param_namerD   websocket_param_namerA   http_connection_param_namerC   response_param_nameStarletteBackgroundTasksbackground_tasks_param_namer5   security_scopes_param_namer   rT   rT   rU   r   E  s&    





r   c                   @   s0   e Zd ZU eed< eej ed< ee ed< dS )ParamDetailsr   rY   r   N)	__name__
__module____qualname__r   __annotations__r   r   Dependsr   rT   rT   rT   rU   r   ]  s   
r   )rX   r   r   r   rK   c                 C   s  d }d }t }t }|tjjk	r$|}|}t|tkrt|}|d }dd |dd  D }	dd |	D }
|
rr|
d }nd }t|trt	||d}|j
tks|j
tkstd|jj d	| d
|tjjk	r|rtd||_
qt|_
nt|tjr|}t|tjr6|d kstd| |d ks0td| |}n4t|trj|d ksZtd| |}trj||_|d k	r|jd krt|}||_t|ttttttfr|d kstd||d ksdtd|n|d krd|d krd|tjjk	r|nt}|rtj|d}nNt|s*t|r:tj ||d}n*t!|dsVtj"||d}ntj#||d}d }|d k	r|rt|tjstd|jj d| n*t|tj$rt%|dd d krtj&j'|_(t)||| }t|tj*rt+  |j,st%|dd r| -dd}n|j,p| }||_,t.| ||j
||j
ttfk|d}|r\t/|dstdnFt|tj#rt/|st0|st|j1t2rt%|dddkstt3|||dS )Nr   c                 S   s    g | ]}t |ttjfr|qS rT   )re   r:   r   r   r   argrT   rT   rU   r   v  s   z!analyze_param.<locals>.<listcomp>ry   c                 S   s&   g | ]}t |tjtjtjfr|qS rT   )re   r   Paramr   r   r   rT   rT   rU   r   {  s   )r   r   `z1` default value cannot be set in `Annotated` for z). Set the default value with `=` instead.z*Path parameters cannot have default valueszGCannot specify `Depends` in `Annotated` and default value together for zaCannot specify a FastAPI annotation in `Annotated` and `Depends` as a default value together for zQCannot specify FastAPI annotations in `Annotated` and default value together for z"Cannot specify `Depends` for type z+Cannot specify FastAPI annotation for type )r   )r   r   zCannot use `z` for path param in_convert_underscores_-)r\   r{   r   aliasrequiredr   )r   z1Path params must be of one of the supported typesshape)r   rY   r   )4r   r   r   r   rG   rE   rF   re   r:   r   r   r   r   rN   	__class__r   r   r   r   r   r[   r   r)   rB   rD   rA   rC   r   r5   Pathr'   r(   Filer   r   ZQueryr   r   
ParamTypesqueryr   r   FormrV   r   replacer7   r$   r%   r{   r9   r   )rX   r   r   r   r   rY   r   Zuse_annotationZannotated_argsZfastapi_annotationsZfastapi_specific_annotationsZfastapi_annotationZdefault_valuer   Zuse_annotation_from_field_infor   rT   rT   rU   r   d  s    

 




r   )r   rn   rK   c                 C   s   | j }t|dd }|tjjkr,|j|  n\|tjjkrF|j|  nB|tjj	kr`|j
|  n(|tjjks|td| j |j|  d S )Nr   z>non-body parameters must be in path, query, header or cookie: )r   r   r   r   rZ   ro   ri   r   rp   headerrq   ZcookierN   r\   rr   )r   rn   r   Zfield_info_inrT   rT   rU   r   
  s    
r   c                 C   s4   t | rt| S t | r dS t| dd }t|S )NF__call__)r   Z	isroutinerJ   Zisclassr   rc   Zdunder_callrT   rT   rU   is_coroutine_callable  s    

r   c                 C   s$   t | rdS t| dd }t |S NTr   )r   Zisasyncgenfunctionr   r   rT   rT   rU   is_async_gen_callable#  s    
r   c                 C   s$   t | rdS t| dd }t |S r   )r   Zisgeneratorfunctionr   r   rT   rT   rU   is_gen_callable*  s    
r   )rc   stack
sub_valuesrK   c                    sB   t | rtt| f |}nt| r2t| f |}||I d H S r   )r   r/   r   r   r.   enter_async_context)rc   r   r   cmrT   rT   rU   solve_generator1  s
    r   c                   @   sb   e Zd ZU eeef ed< ee ed< ee	 ed< e
ed< eeedef ee f ef ed< dS )SolvedDependencyr   errorsbackground_tasksresponse.dependency_cacheN)r   r   r   r
   r   r   r   r   r   r   rC   r   r   rT   rT   rT   rU   r   ;  s
   
r   )bodyr   r   dependency_overrides_providerr   )
requestrn   r   r   r   r   r   async_exit_stackembed_body_fieldsrK   c        	            s
  i }	g }
|d kr$t  }|jd= d |_|d kr0i }|jD ]f}ttdtf |j|_tttdtf tt	 f |j
|_
|j}|}|r|jr|j}t|di ||}|j}t|||j|jd}t| ||||||||d	I d H }|j}|jr|
|j q6|jr|j
|kr||j
 }n^t|s*t|rBt|||jdI d H }n2t|r`|f |jI d H }nt|f|jI d H }|jd k	r||	|j< |j
|kr6|||j
< q6t|j| j\}}t|j| j\}}t|j | j\}}t|j!| j"\}}|	#| |	#| |	#| |	#| |
|| | | 7 }
|j$rZt%|j$||dI d H \}}|	#| |
| |j&rl| |	|j&< |j'rt(| t)r| |	|j'< n|j*rt(| t+r| |	|j*< |j,r|d krt- }||	|j,< |j.r||	|j.< |j/rt0|jd|	|j/< t1|	|
|||d	S )
Nzcontent-length.dependency_overrides)rZ   rc   r\   rW   )	r   rn   r   r   r   r   r   r   r   )rc   r   r   )body_fieldsreceived_bodyr   )rb   )r   r   r   r   r   )2rC   ZheadersZstatus_coderu   r   r   r   rc   r   r   rt   r   r   getrZ   rg   r\   rW   solve_dependenciesr   r   rf   rd   r   r   r   r   r   r;   request_params_to_argsro   rp   rq   rr   Zcookiesupdaters   request_body_to_argsr   r   re   rB   r   rD   r   r-   r   r   r5   r   )r   rn   r   r   r   r   r   r   r   r   r   rj   rc   Zuse_sub_dependantZoriginal_callZuse_pathZsolved_resultZsolvedZpath_valuesZpath_errorsZquery_valuesZquery_errorsZheader_valuesZheader_errorsZcookie_valuesZcookie_errorsZbody_valuesZbody_errorsrT   rT   rU   r   D  s          


    











r   )r   r   r   locrK   c                 C   s~   |d kr,| j rd t|dgfS t| jg fS | j|||d\}}t|trTd |gfS t|trrt|dd}d |fS |g fS d S )N)r   rT   )r   Z
loc_prefix)	r   r!   r   r   Zvalidatere   r   listr   )r   r   r   r   v_errors_Z
new_errorsrT   rT   rU    _validate_value_with_model_field  s    


r   )r   r   r   rK   c                 C   s   |p| j }t| r,t|ttfr,||}n||d }|d kstt| jtj	r`t|t
r`|dkstt| rt|dkr| jr~d S t| jS |S )N r   )r   r&   re   r>   r=   Zgetlistr   r   r   r   r   rz   r   r   r   )r   r   r   r   rT   rT   rU   _get_multidict_value  s(    

	
r   )rx   received_paramsrK   c                 C   s  i }g }| s||fS | d }| }d}d}t | dkr\t|jtr\t|j}d}t|jdd}i }t }	|D ]}
d }t|t	rt|
jd|}|r|
j
|
jkr|
j
n|
jdd}t|
||d}|d k	r|||
j< |	|p|
j
 |	|
j qj| D ]\}}||	kr|||< q|r\|j}t|tjs0td	|jjf}t||||d
\}}|j|i|fS | D ]j}
t|
|}|
j}t|tjstd	|jj|
j
f}t|
|||d
\}}|r|| n
|||
j< q`||fS )Nr   FTry   r   r   r   )r   z"Params must be subclasses of Paramr   r   r   r   )rz   r)   r{   r9   r    r   r   setre   r=   r   r\   r   r   addr   r   r   rN   r   r   r   rf   )rx   r   r   r   r|   r}   single_not_embedded_fieldZdefault_convert_underscoresZparams_to_processZprocessed_keysr   r   r   r   keyr   r   r   r   rT   rT   rU   r     s    
  
  



   

   
r   )
field_typerK   c                 C   sN   ddl m} t| }|tk	r(||k	r(dS t| }|D ]}t|ts4 dS q4dS )zJCheck if field type is a Union where all members are BaseModel subclasses.r   )	UnionTypeFT)Zfastapi.typesr   rG   r   rF   r)   r9   )r   r   originZ
union_argsr   rT   rT   rU   is_union_of_base_models;  s    
r   c                 C   sl   | sdS dd | D }t |dkr&dS | d }t|jdd r@dS t|jtjrht|jtsht	|jshdS dS )NFc                 S   s   h | ]
}|j qS rT   )r\   )r   r   rT   rT   rU   	<setcomp>S  s     z,_should_embed_body_fields.<locals>.<setcomp>ry   Tr   Zembed)
rz   r   r   re   r   r   r)   r{   r9   r   )rx   Zbody_param_names_setr|   rT   rT   rU   _should_embed_body_fieldsN  s     
r   )r   r   rK   c           
         s"  i }| D ]}t ||}|j}t|tjrJt|rJt|trJ| I d H }nt|rt|tjrt	|rt|t
sttg  tg ttttf f d d fdd}t 4 I d H }|D ]}|||j qW 5 Q I d H R X t| d}|d k	r|||j< q| D ]\}	}|	|kr |||	< q |S )N)fnrK   c                    s   |  I d H }  | d S r   )ri   )r   resultresultsrT   rU   
process_fn~  s    z&_extract_form_body.<locals>.process_fn)r   r   )r   r   re   r   r   r"   r@   readr#   r,   r*   rN   r   r	   r   anyioZcreate_task_groupZ
start_soonr+   r   r   )
r   r   r   r   r   r   r   tgZ	sub_valuer   rT   r   rU   _extract_form_bodyf  s@    


 
r   )r   r   r   rK   c              	      s.  i }g }| st dt| dko$| }| d }|}| }|rZt|jtrZt|trZt|j}t|trtt||I d H }|rd}	t	||||	d\}
}|j
|
i|fS | D ]}d|jf}	d }|d k	rz||j}W n& tk
r   |t|	 Y qY nX t	||||	d\}
}|r|| q|
||j
< q||fS )Nz3request_body_to_args() should be called with fieldsry   r   )r   r   r   )rN   rz   r)   r{   r9   re   r<   r    r   r   r\   r   r   AttributeErrorri   r!   rf   )r   r   r   r   r   r   r|   Zbody_to_processr}   r   r   r   r   r   rT   rT   rU   r     sX    


   


   
r   )rw   r\   r   rK   c                 C   s   | j s
dS | j d }|s|S d| }t| j |d}tdd | j D }|dd}|s\d|d	< td
d | j D rxtj}nNtdd | j D rtj}n2tj}dd | j D }	tt|	dkr|	d |d< t	d||d|f |d}
|
S )a  
    Get a ModelField representing the request body for a path operation, combining
    all body parameters into a single field if necessary.

    Used to check if it's form data (with `isinstance(body_field, params.Form)`)
    or JSON and to generate the JSON Schema for a request body.

    This is **not** used to validate/parse the request body, that's done with each
    individual body parameter.
    Nr   ZBody_)rx   
model_namec                 s   s   | ]}|j rd V  qdS )TN)r   r   frT   rT   rU   	<genexpr>  s      z!get_body_field.<locals>.<genexpr>r   )r   r   r   c                 s   s   | ]}t |jtjV  qd S r   )re   r   r   r   r   rT   rT   rU   r     s     c                 s   s   | ]}t |jtjV  qd S r   )re   r   r   r   r   rT   rT   rU   r     s     c                 S   s"   g | ]}t |jtjr|jjqS rT   )re   r   r   r   
media_typer   rT   rT   rU   r     s   z"get_body_field.<locals>.<listcomp>ry   r   )r\   r{   r   r   r   )
rs   r   anyr   r   r   r   rz   r   r7   )rw   r\   r   Zfirst_paramr   Z	BodyModelr   ZBodyFieldInfo_kwargsZBodyFieldInfoZbody_param_media_typesZfinal_fieldrT   rT   rU   get_body_field  sD    
 r  )N)r   sys
contextlibr   r   r   r   Zdataclassesr   typingr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   Zfastapir   Zfastapi._compatr   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   Zfastapi.backgroundr-   Zfastapi.concurrencyr.   r/   Zfastapi.dependencies.modelsr0   r1   Zfastapi.loggerr2   Zfastapi.security.baser3   Zfastapi.security.oauth2r4   r5   Z$fastapi.security.open_id_connect_urlr6   Zfastapi.utilsr7   r8   Zpydanticr9   Zpydantic.fieldsr:   Zstarlette.backgroundr   Zstarlette.concurrencyr;   Zstarlette.datastructuresr<   r=   r>   r?   r@   Zstarlette.requestsrA   rB   Zstarlette.responsesrC   Zstarlette.websocketsrD   Ztyping_extensionsrE   rF   rG   version_inforJ   ZasynciorS   rQ   rV   r   r   r_   ra   r]   ZCacheKeyboolrv   r~   r   r   r   r   r   rg   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  rT   rT   rT   rU   <module>   s0  <h
 


  
#
		

5   '	
  


"  
 
  
 
O
+3  