Files
SignatureSystem/routes/__pycache__/api.cpython-39.pyc

101 lines
12 KiB
Plaintext
Raw Normal View History

2026-07-20 13:16:17 +08:00
a
<00><>XjRI<00>@s|ddlZddlZddlZddlZddlmZddlmZmZm Z m
Z
ddl m Z ddlmZddlmZmZddlmZddlmZdd lmZmZmZdd
lmZmZdd lmZddlm Z ed e!<21>Z"e<02>#e!<21>Z$d d<0E>Z%e"j&ddgd<11>dd<13><00>Z'dd<15>Z(dd<17>Z)d)dd<19>Z*d*dd<1B>Z+e"j&ddgd<11>dd<1E><00>Z,e"j&ddgd<11>d d!<21><00>Z-e"j&d"d#gd<11>d$d%<25><00>Z.e"j&d&dgd<11>d'd(<28><00>Z/dS)+<2B>N)<01>quote)<04> Blueprint<6E>request<73>jsonify<66>Response)<01>Image)<01>Document)<02> sign_word<72> _new_trace_id)<01> process_image)<01> field_codes)<03>validate_sign_request<73>validate_docx_size<7A>validate_image_size)<02>get_limits_config<69> get_oa_config)<01>monitor<6F>apicKsd|||d<02>}|r||d<|S)NF)<04>success<73>code<64>message<67>trace_id<69>data<74>)rrr<00>extra<72>bodyrr<00>[E:\projects\wxwx\projects_job\GeneralRequirement\SignatureSystem\BackEnd\Code\routes\api.py<70> _error_bodysr<00>/api/word/sign<67>POST)<01>methodsc# Cs2d}t<00>}tj}t<03><03>}t<04>}tj||ddtjid<04>tj d||||d<06>d<07>tjpVd}d |v<00>r<>tj
d
d <0B>}|s<>tj d ||d<06>d<07>tj |d dt t<03><03>|d<00>dd<11>ttdd|<01><03>dfS|}|<07>dd<08>}|<08>s tj d||d<06>d<07>tj |d dt t<03><03>|d<00>dd<11>ttdd|<01><03>dfSzt<11>|<08>} Wn~t<13>y<>}
zdtj dt|
<EFBFBD>||d<06>d<07>tj |d dt t<03><03>|d<00>dd<11>ttdd|
<EFBFBD><00>|<01><03>dfWYd}
~
Sd}
~
00<00>nfd|v<00>r<>tj<15>d<1B>} | <0B>stj d||d<06>d<07>tj |d dt t<03><03>|d<00>dd<11>ttdd|<01><03>dfS| <0B><16>} | j<17>p,dtj<18>dd <20>gd!<21>}d"dl} z| <0C>tj<18>d#d$<24><02>|d#<Wnt<13>y<>g|d#<Yn0tj<15>d%<25>} | <0A>r:| <0A><16>}t||d&<00>\}}|<0F>stj d'|||d<06>d<07>tj |d dt t<03><03>|d<00>d(d<11>ttd(||<01><03>dfSt<11>|<0E><01>d)<29>}|d#D]}||d*<| j<17>p0d+|d,<<00>qd-D]<5D>}|tjv<00>r>tj|}|<14><1E>d.v<00>rx|<14><1E>d/k||<nFz(d0|v<00>r<>t|<14>||<n t |<14>||<Wnt <20>y<>|||<Yn0<00>q>nTtj d1|||d<06>d<07>tj |d dt t<03><03>|d<00>d2d<11>ttd2d3|<05><00>|<01><03>dfSt!| |d4<00>\}}|<0F>s~tj d5|||d<06>d<07>tj |d dt t<03><03>|d<00>d6d<11>ttd6||<01><03>dfS|<07>d<1F>d k<02>r<>t"|<07>d#g<00><02>D<00>] \}}|<12>d*<2A><01>p<>d}|<16>r<>z<EFBFBD>t<11>|<16>}t||d&<00>\}}|<0F>sLtj d7|d8|||d<06>d<07>tj |d dt t<03><03>|d<00>d(d<11>ttd(d9|d8<00>d:|<10><00>|<01><03>dfWSWnnt<13>y<>}
zTtj |d dt t<03><03>|d<00>dd<11>ttdd9|d8<00>d;<3B>|<01><03>dfWYd}
~
Sd}
~
00<00>q<>t#|<07>}|<17>r*tj d<d=<3D>$|<17>||d<06>d<07>tj |d dt t<03><03>|d<00>d>d<11>ttd>d=<3D>$|<17>|<01><03>dfStj d?||d<06>d<07>|<07>d<1F>d@v<00>r<>t%<25>&<26><00>s<>tj dA||d<06>d<07>tj |d dBt t<03><03>|d<00>dCd<11>ttdCdD|<01><03>dBfSt'| ||||dE<64>\}}|<19>r|<19>dFdG<64>}|dHv<00>r<>dndI}tj |d |t t<03><03>|d<00>|d<11>t|<19>|fS|dJ}t(|dKdLdM<64>}|j)dNdOdP<64><02>dN<64>}dQ|<1E>dRt*|ddS<64><02><00>|j+dT<|<18>dU|<01>|j+dV<tt,|<18>dWg<00><02><01>|j+dX<|<18>dW<64><01>r<>d=<3D>$|dW<00>}t*|ddS<64>} | j)dYdOdP<64>}!t,|!<21>dZk<04>r<>| dd[<5B>} | j)dYdOdP<64>}!<21>q<>| |j+d\<t t<03><03>|d<00>}"tj |d]d^|"||<18>d_d"<22>d`<60>|<18>dWg<00>da<64>|S)bNu 外部APIr<00> content_type)Zrequest_body_summaryuA[请求接入] 客户端IP=%s, 接口=/api/word/sign, trace_id=%s)<02>
log_sourcer<00>r<00>zapplication/jsonT<6E><01>silentu([参数校验] 请求体JSON解析失败<E5A4B1>error<6F><72>i<>Z INVALID_JSON)<03>response_status<75>
elapsed_msZ error_messageu请求体JSON解析失败<E5A4B1> docx_base64u&[参数校验] 缺少docx_base64字段Z MISSING_DOCXu缺少docx_base64字段u*[参数校验] docx_base64解码失败: %sZINVALID_BASE64udocx_base64解码失败: zmultipart/form-data<74>docxu.[参数校验] multipart请求缺少docx文件u缺少docx文件z upload.docx<63>
match_mode<EFBFBD>upload)Z docx_namer-<00>stampsrr/z[]<5D>image<67>image_max_bytesu%[参数校验] 上传图片过大: %s<>IMAGE_TOO_LARGEzutf-8<> image_base64z image.pngZimage_filename)
Zuse_global_alignZalign_hZalign_vZuse_global_height<68>heightZuse_global_noise<73> noise_levelZuse_global_rotate<74>
rotate_min<EFBFBD>
rotate_max)<02>true<75>falser8<00>.u+[参数校验] 不支持的Content-Type: %sZINVALID_CONTENT_TYPEu不支持的Content-Type: <20>docx_max_bytesu[参数校验] %s<>DOCX_TOO_LARGEu*[参数校验] 盖章项%d图片过大: %s<>u 盖章项z: u: 图片Base64解码失败u[参数校验] 校验失败: %sz; <20>VALIDATION_ERRORu[参数校验] 校验通过)<03>id<69>name<6D>autou7[数据库] MySQL 不可用,按 SRS 15.3.4 返回 5xxi<78>ZMYSQL_UNAVAILABLEu*MySQL 不可用,请检查数据库配置)r"r<00> client_ipr<00>INTERNAL_ERROR)ZINVALID_FILE_TYPEZINVALID_MATCH_MODEZTOO_MANY_STAMPSZ INVALID_DOCXr<r2r><00><><00>filenamerzGapplication/vnd.openxmlformats-officedocument.wordprocessingml.document)<01>mimetype<70>ascii<69>replace)<01>errorszattachment; filename="z"; filename*=UTF-8'')<01>safezContent-DispositionrzX-SEAL-Trace-Id<49>warningszX-SEAL-Warningszlatin-1i<00><><EFBFBD><EFBFBD><EFBFBD>zX-SEAL-Warning-Detailr<00><><00> success_count)rErN)r)r*Zresponse_summaryrK)-r
r<00> remote_addr<64>timerrZregister_requestr!<00>logger<65>info<66>get_jsonr'<00>finish_request<73>intrr<00>get<65>base64<36> b64decode<64> Exception<6F>str<74>files<65>readrE<00>form<72>json<6F>loadsr<00> b64encode<64>decode<64>lower<65>float<61>
ValueErrorr<00> enumerater <00>join<69>db<64>ensure_mysql_availabler r<00>encoder<00>headers<72>len)#r"rrBZstart_ts<74>limitsr!Z json_data<74>paramsr+<00> docx_data<74>eZ docx_filer^Z
image_fileZ img_bytesZvalid<69>msgZimg_b64<36>s<>key<65>val<61>idx<64>b64rI<00>resultr'r<00> status_coderE<00>responseZascii_fallbackZjoined<65>encodedZ encoded_bytesr*rrr<00> word_signs<><08> <0C>

 <08>
<02> <08>
<02> <08>
<02>4
 <08>
<02>
 <02> <08>
<02>  

<08>
<02>
<EFBFBD><02>
<02>
<08>
<02>.
<02><10><02>"<08>
<02>
<08>
<02><04><02> <02>
<02> <02>
<EFBFBD><04>   

<EFBFBD>rzcCsb|dd<02>dkrd}n0|dd<05>dkr,d}n|dd<08>d vrBd
}nd}d |<01>d <0C>t<00>|<00><01>d <0A>S)u3根据魔数判断图片格式并构造 data URL。N<E38082>s<00>PNG

z image/png<6E>s<00><><EFBFBD>z
image/jpeg<65>)sGIF87asGIF89az image/gifzdata:z;base64,rG)rWr`ra)r<00>mimerrr<00>_image_data_url<72>src
Cs<>|<00>dd<02>}|dkrn|<00>d<03>p d}|s*dSzt<01>|<02>dfWStyl}zdd|<03><00>fWYd}~Sd}~00t<04><05>szdSd}|d kr<>|<00>d
<EFBFBD>p<>d<04><06>}|s<>d St<04>|<05>}|s<>dd |<05><00>fS|d dfS|dk<02>r|<00>d<0F>p<>d<04><06>}|s<>dSt<04>|<07>}|<08>s
dd|<07><00>fS|dd dfS|dk<02>r<>|<00>d<14><01>p2d<04><06>} | <09>sBdS| <09> d<16><01>rZ| dd<06>n| }t
<EFBFBD> |<07>}|<07>s~dd| <09>d<19>fSt<04>|<07>}|<08>s<>dd|<07><00>fS|dd dfSdd|<01><00>fS)uM根据 payload 解析出 (image_bytes, is_signature) 或 (None, error_msg)。r-r.r3r$)Nu upload 模式缺少 image_base64NuBase64 解码失败: )Nu'MySQL 不可用无法按人员查询r?<00>image_id)Nuid 模式缺少 image_idu未找到 image_id=<3D>
sign_imager@Z
image_name)Nuname 模式缺少 image_nameu未找到 image_name=rrA<00>marker)Nuauto 模式缺少 markerZUSER_<52>zmarker=u 无法解析出姓名u未找到姓名=u不支持的 match_mode: ) rVrWrXrYrgrh<00>strip<69>get_image_by_user_id<69>get_image_by_user_name<6D>
startswithr Z_strip_switches)
<EFBFBD>payloadr-ruroZis_sig_from_dbr<62><00>recordr@<00>recordsr<73>rrr<00>_resolve_preview_image<67>sR $
 




r<>c Cs`|dvr |Sz t|<00>}Wnttfy2|YS0|durH||krH|S|dur\||kr\|S|S<00>N)Nr$)rcrd<00> TypeError<6F><05>value<75>default<6C>lo<6C>hi<68>vrrr<00> _parse_float(s 
r<>c Cs`|dvr |Sz t|<00>}Wnttfy2|YS0|durH||krH|S|dur\||kr\|S|Sr<>)rUrdr<>r<>rrr<00>
_parse_int6s 
r<>z/api/preview/sign-imagecCs<>d}tjdd<03>pi}t|<01>\}}|rJtjd|d|id<06>td|d<08><02>d fSt|<01>d
d<07><02>}t|<01>d <0B>d d dd<0F>}t |<01>d<10>dddd<0F>}t |<01>d<13>dddd<0F>}t |<01>d<16>dddd<0F>}zt
||||||d<17>} WnVt <0B>y }
z<tj dt |
<EFBFBD>d|id<06>tdd|
<EFBFBD><00>d<08><02>dfWYd }
~
Sd }
~
00zt<0E>t<10>| <09><01>} | j\} } Wnt <0B>y\d\} } Yn0zt<0E>t<10>|<02><01>}|j\}}Wnt <0B>y<>d\}}Yn0tdt|<02>t| <09>t|<02>t| <09>||g| | g|||||d<1C>d<1D> <09>S)uR预览:原签名图 vs 处理后效果(走完整 process_image 流水线<EFBC89> 前端操作Tr%u%[图片预览] 解析图片失败: %sr"r#F<>rrr(<00> is_signature<72> height_cmNg<4E><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?g$@)r<>r<>r<>r5r<00>
r6iL<69><4C><EFBFBD><EFBFBD><EFBFBD>r7)r<>r5r6r7r"u[图片预览] 处理失败: %su图片处理失败: rD)rr)r<>r5r6r7) r<00>original<61> processedZ original_sizeZprocessed_sizeZoriginal_dimensionsZprocessed_dimensionsr<73>rm)rrSr<>rQ<00>warningr<00>boolrVr<>r<>r rYr'rZ<00>PILImage<67>open<65>io<69>BytesIO<49>sizerrk)r"r<>Z
image_data<EFBFBD>errZis_sigr<67>r5r6r7r<>roZpimgZp_wZp_hZoimgZo_wZo_hrrr<00>preview_sign_imageDs\ <02>
.<04><04>r<EFBFBD>z/api/doc/scan-markersc
Cs<>d}tjdd<03>pi}|<01>d<04>p d}|s8tddd<08><02>d fSzt<04>|<02>}Wn<ty<>}z$tdd
|<04><00>d<08><02>d fWYd }~Sd }~00ztt<08> |<03><01>}Wn<ty<>}z$tdd |<04><00>d<08><02>d fWYd }~Sd }~00t
j ||d <0A>}tddd<0F>|D<00>d<10><02>S)uJ扫描 docx 中所有 SET USER_<name> 标记,用于 auto 模式预览。r<E38082>Tr%r+r$Fu缺少 docx_base64r<34>r(udocx Base64 解码失败: NuWord 解析失败: )r"cSsg|]}|d|dd<02><02>qS)r<>r@)r<>r@r)<02>.0<EFBFBD>mrrr<00>
<listcomp><3E><00>z$doc_scan_markers.<locals>.<listcomp>)r<00>markers) rrSrVrrWrXrYrr<>r<>r Zscan_user_markers)r"r<>Zdocx_b64rnro<00>docr<63>rrr<00>doc_scan_markerss$.. <0C>r<EFBFBD>z /api/health<74>GETc CsDt<00>}t<01>}t<02><03>dk}td||d|d|d|dt<02><03>d<07><07>S)N<>mysqlTr;r1<00>stamp_max_count<6E>action_timeout_seconds)r<00> mysql_enabledr;r1r<>r<><00>db_type)rrrg<00>get_active_db_typer)rl<00>oar<61>rrr<00>health<74>s <06>r<EFBFBD>z /api/db/initc
Cs<>z>tjdd<02>}|s&tddd<04><02>dfWStddt<00><03><00><00>d<04><02>WSty<>}z2t<05>dt|<01><01>tdt|<01>d<04><02>dfWYd}~Sd}~00dS) NF)<01> strict_mysqluMySQL 不可用r<E794A8>rDTu数据库已初始化: u数据库初始化失败: %s)rg<00> init_databaserr<>rYrQr'rZ)<02>okrorrr<00>init_db_endpoint<6E>s r<>)NNN)rNN)0rWr<><00>loggingrP<00> urllib.parser<00>flaskrrrrZPILrr<>r,rZlib.word_signerr r
Zlib.image_processorr <00>libr Zlib.validatorsr rr<00>
lib.configrrr<00>lib.dbrg<00>__name__<5F>api_bp<62> getLoggerrQr<00>routerzrr<>r<>r<>r<>r<>r<>r<>rrrr<00><module>s@       


L 3


: