From 6a3a51d4c882de77fadf1a73feaf6010e685c39e Mon Sep 17 00:00:00 2001 From: SunFree <7934952@qq.com> Date: Wed, 10 Apr 2024 17:04:15 +0800 Subject: [PATCH] add news --- __pycache__/dependencies.cpython-310.pyc | Bin 2646 -> 2646 bytes __pycache__/main.cpython-310.pyc | Bin 1946 -> 2360 bytes dependencies.py | 14 ++++----- internal/__pycache__/__init__.cpython-310.pyc | Bin 125 -> 125 bytes internal/__pycache__/database.cpython-310.pyc | Bin 781 -> 781 bytes internal/__pycache__/models.cpython-310.pyc | Bin 970 -> 1401 bytes internal/models.py | 27 ++++++++++++++---- main.py | 22 ++++++++++---- 8 files changed, 44 insertions(+), 19 deletions(-) diff --git a/__pycache__/dependencies.cpython-310.pyc b/__pycache__/dependencies.cpython-310.pyc index 1cdf2c5b806a69d57cfc380fcdf65ee0388a0327..97b03e04a9afb2c188e1c0865dd4fed36ec008f2 100644 GIT binary patch delta 377 zcmXw!-%0{O6vjL2{+V{wDA&!@)r|#dF)+hSQ-Ur9pI~pom@$GZ80%hWuez&4&r#qT zbd~qvg-_F&h34X$^Zm{_%r|Ry?K+RSoV`WoH}Kw^)tI}YGSzsIdx;)bg(FHYFa@4Z z={_$dM(h*yQ+gnFX|~KOL~Fdt{bVby^BS+y9dLIUz`JH|*z;V-hsjJ}Vtqh}Wp?On z*sXZFR*f=Vu>v%fpP3ynWJpQyM;}?TL6r>AH=49EGP)4p!e~Jozl=%kNHrspNZT-e zH=o?x3og|^B9N!pGMj}CnK>iT7A9mt2id`y`I@^>TqDVX?4xcSvokW0CcD_P&i5|= z+cwA{)pCF_8&}gbedT*K);%YlArgLqD)%!Bt7$VrCY@T_h=Q5M& Gp8f~cdQE=- delta 405 zcmXw#y-or_5P+HEZf`vfBJnstjvxOLh$smX2wK^gknjRtV@P(f@h9$ag`J5s+UbN> z@C9gXwBrRRF7X+(vc=s?++@F2|Qn%@}m5}Ru<-DX8L!RP=M;HUk@X}ag z4$Dmq-;>sht;@60=2=17GApvpX~M6t67%F)W#zc0!m3l{^evr`pB#$Cw8eMAHg z!mEj>sf-v~Dr!oc$Q`Ip(qUb8&49j&z38J)hn`9is)^`IG?MZAqOZi^{F4%Z4ldSq aaxG=r3UP8gN)y2v*ske1lu$jRyXGI|VpWs? diff --git a/__pycache__/main.cpython-310.pyc b/__pycache__/main.cpython-310.pyc index 737b91546f9427730f8b4ec5c244a05e7eda0dba..827145611acfbf7a7c0091719274b19d0774643c 100644 GIT binary patch delta 1284 zcmZWp&2Jk;6yKTMb!^9W;v{yyi=&XJmeMAG%14DFprnBKNJY(oJ+Msup6v~5uRAj) zjg`oNxuG1;p7=Pxv1cya5&y(q5m){J5arFfX$#D1X5V}Bo8No$o1Oi3=I6Pcs94Nf z)c$y<+WI|bS-%pKE7VnneZ6yY1Quk%LbvD@nT46L<(05>G=oK$YBR_}4)Sdd z(@>zXc&OHjLQ)i+{?bw+iT zlx`fpfBW44AjD%KaaieS-M_xO8%9kLb|R&(Uwh_-=NgIq#z7--ZXMokB*j+;x)aG@ zD0C3@hJ_nZPh(GCX`J-2?s!EJhS9N4fOgPRUU}j+B?5s05vmJBw}Qk2kNge_K&gHT z*{`f#BE1u5pip`XqS-{Hd>ws)JsY39Gn_g2b_srGVQ|Htjb7tw>Q64fd^*txiv+)&Ydux_*$}$bZrM^(= zIFe9nie4|$wL4hDZeO1aG5*Ne&+XJ8P~uLA@psPhXs5QN>cbTyiK>yDLSs!0QfXR) zFg)3)b7{WRWU5PQi8j`!y=)t`Z&t`9lhy1!ndu1CLGUkr0$vgCVRN9-zdJyAlIHZL-)uB)`Oog{`G;@UGpX?M5@j=BI*g##o|I9G zFT3metEQNASThwBFHS7QJWU~GPM3d{w;fhs8S2KWvOFtrxfze#gBQ)}`%D_}gy~;& z0#YjFck!B`b5c5o%kB6t_v1<`#@2t9#&L4tnsP(2I56mVQutFtcxdGxM8|x1S1cb8{WXNgH&2?3HSt zlZNq28^=$AjGH9EcjL|6-Azmk4OgI8cVq%HGP%Rh8X7f_HkvYpnHraAnc236;AZ0} zfjJ!|9n963%*xz0C*K(P@^TCd`wUnd0&(QAKrsbbjPpw<-sffM1E6*2FY17@9FGIa za$?D-PDa;Y?c-JU6(Ak`HY;|4y4^L@L{#BdAQe60=QpPa+DOkUtT%!X)w~)fU=>Im z9E&cTKIkXR&%KCAHo50ibf z&xZ_%fjYFJk~NzVM5-K88!M4#Eo@dRk8eF#UR@Ge1WUI5WQzTR4=PmJh?_C zZKBbx?^ijc3y4OWDu(-!Zc3N;q#ycfLiZ4>NxF@kgEhvvrwI!5%Gp-ht*B4=jG*M0D^fRMK^LYF#`ZBF9a$8 delta 20 acmeBW>t*B4=jG*M0D=j>L^g6WF#`ZA{sbfd diff --git a/internal/__pycache__/models.cpython-310.pyc b/internal/__pycache__/models.cpython-310.pyc index f39384e158d5505c8822dc40e4ca6e780877a399..ee7717d879959c4bb891062793501689e26f9ce4 100644 GIT binary patch literal 1401 zcmaJ>&5IOA6tC*9>FJ%F9d%<+#1Ih4u$g5Uyd*4P6peUrFVRb9V_7>@yW6C?ds5Xy z+zkOgqZbcCKok!Nf+Rr~B%nh6le#ARb@mn#$a~$Jb#+Y&>h=4*davreSHJ3fbTlF` znrHXV-*E}~9l_4w0qDUr7eNRjs3IwiY3jrdMeHay^O;nmgNO6 zr0Ap9&HwBpLpZ~;{<-{1nb`*K_oXqcC{a{?Sg|ya zGi~37jAcBPjM<2>G#5jKdV{gAhFoo}xTer{j4@v2mE@UW>}R4!A&FA_dHB@FvvVq6 zV0@6wCRrhM#?>rrCzY8TENLG+ahd=`L_*r2rR_fpe0dNYUlk~53?)imU~v?Rb8WpW z?j$exj17kdPfTSy&>;lsItsjSy$8hziUx}9lq;=?wiXBsc!?Z{NQ;)1U8&*5J(xy= zc$FIV9ulL%S)j-a;otV=odZM$BB*WzR%@^pA`isK_G)8$6(dJQQ;gkqw<23m=AO7F zL)c|6==-4LaqFFjGKbj0_3wXLyY)Qwxk!_2xqe~tn`0k#r@lQh+y{%RH?C}~yg1hB zPOaa+zWU_u`r}7Ph9W7Hw4uDj(}9x4)&{)5i?Sm^n!Zj31zc>|ujTQ7oqAi!WIs!Cto+TCyoq}teaO?)>ocxKDfN`=*rq}KW;qx zb?wQ+)m!)0ez>`M^SidE-vK8ZrTh|8GFvDX^?oquchTz0lqaezv-@V5T`2R97r$(k z>6Y8<2(8Z#l`0v2&W0i}d`?L*)2_cs6TJG0CiuiEt{lR%y}3MBZ>0^k8tG(?f`~{! z9qPe!X!EZisI;AW^Y50gF=iLB@WdWWJq7}p9pW{g$xfb_v15zeEK0!!+?cO(Eq3$! zJq-MReq;OJN4LEw5J3ZMI9L)qE0Vr;(2Pmg0R9R|wxG*y;Cn4!LYZ|L_qIORaJu?! Vd_p0>;45p925q@5ujP%8{{up4KKK9t literal 970 zcmZ`&O>fgc5Z$%cj_o=mK;gil_gwe^RfMXl72<$}1ie_1R-4S0T5RmF>j*{SR{l)? z(q1`n@|Z3;%^LM&2Qs6LM|Xdo&+8vPho(35V$~|L5@7v0@o){yl0c6A9yO8aG#$mr{8v< z&4MxyM~vhQA9sSFS3F7g8=eSR0B4sfH*2y%iE0kzd05&V<9jfRwagg_e{DJDoSGXAll*@(J0FixgMC8q z6v2ym*O|TM#yCx;9qrv#zT{|;@`o)x$Ju=rL*+A)|E9e-_oEx-ZZyc1a_&oKp|aH9 zy*i%Z1nIpmGWMS`6;>l#Z9uhsv#=3urmGSf5G00G`wsNkbbDK0;h(y7SF&+D7GrUo F{sG}lwu1lw diff --git a/internal/models.py b/internal/models.py index fb7de62..f9a90bb 100644 --- a/internal/models.py +++ b/internal/models.py @@ -1,4 +1,5 @@ -from pydantic import BaseModel +from pydantic import BaseModel,Field +from typing import Annotated # Token相关的模型 class Token(BaseModel): @@ -10,10 +11,24 @@ class TokenData(BaseModel): # User相关的模型 class User(BaseModel): - username: str - email: str = None - full_name: str = None - disabled: bool = None + username: Annotated[str,Field( + title="用户", + examples=["admin"], + pattern=r'^.{4,20}$', + description="允许4-20的字符" + )] + email: Annotated[str,Field( + examples=["examples@example.com"], + max_length=50, + pattern=r'^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$', + description="邮箱需要满足正则标准" + )] + full_name: Annotated[str,Field( + examples=["admin"], + pattern=r'^.{2,20}$', + description="允许2-20个字符" + )] + disabled: bool = True class UserInDB(User): - hashed_password: str + hashed_password: str = None diff --git a/main.py b/main.py index 344049e..f634ae6 100644 --- a/main.py +++ b/main.py @@ -3,8 +3,17 @@ from fastapi.security import OAuth2PasswordRequestForm from fastapi import Depends, FastAPI, HTTPException, status from dependencies import * from internal.models import Token +from fastapi.middleware.cors import CORSMiddleware app=FastAPI() +app.add_middleware( + CORSMiddleware, + allow_origins=['http://localhost:5173'], # 允许的源 + allow_credentials=True, + allow_methods=['GET', 'POST'], # 允许的请求方法 + allow_headers=['Authorization', 'Content-Type'], # 允许的请求头 +) + # 用户登录 @app.post("/token", response_model=Token) async def login_for_access_token( @@ -24,21 +33,22 @@ async def login_for_access_token( return {"access_token": access_token, "token_type": "bearer"} # 注册新用户 -@app.post("/register/", response_model=UserInDB) -async def register_user(user: UserInDB): +@app.post("/register/") +async def register_user(user: UserInDB, _: User = Depends(get_current_active_user)): # 检查用户名是否已经存在 existing_user = get_user(user.username) if existing_user: raise HTTPException(status_code=400, detail="Username already registered") + if not user.hashed_password: + raise HTTPException(status_code=400,detail="password cannot be empty") # 创建新用户并保存到数据库 hashed_password = get_password_hash(user.hashed_password) - insert_query = "INSERT INTO users (username, email, full_name, hashed_password) VALUES (%s, %s, %s, %s)" - user_data = (user.username, user.email, user.full_name, hashed_password) + insert_query = "INSERT INTO users (username, email, full_name, hashed_password, disabled) VALUES (%s, %s, %s, %s, %s)" + user_data = (user.username, user.email, user.full_name, hashed_password, user.disabled) execute_query(insert_query, user_data) - # 返回创建的用户信息 - return user + return {"status":status.HTTP_200_OK,"message":"users create successfully!"} @app.get("/users/me/", response_model=User) async def read_users_me(current_user: User = Depends(get_current_active_user)):