尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

智能体测开Day57 Pycharm-FastAPI

智能体测开Day57 Pycharm-FastAPI Pycharm-FastAPIdemo01_fastapi pip install fastapi fastapi 快速搭建一个web应用程序 接口文档http://127.0.0.1:8000/docs 注册接口/user/register phone pwd get请求 登录接口/user/login phone pwd post请求 表单格式的参数 充值接口/user/recharge phone amount post请求 json格式的参数 添加车辆/user/addcar carphone cartype carcolor careprice carimg post请求 json格式的参数 import uvicorn from fastapi import FastAPI, Form from pydantic import BaseModel, Field app FastAPI() # 创建一个实例 # http://127.0.0.1:8000/ 访问这个接口 app.get(/) def root(): return {msg: hello world} # http://127.0.0.1:8000/user/register?phone17734694395pwd123456 app.get(/user/register) def register(phone, pwd): # 参数检查 # 写到数据库 return {msg: 注册成功, code: 10001, data: f{phone} {pwd}} app.post(/user/login) def login(phone: str Form(...),pwd: str Form(...)): return {msg: 登录成功, code: 10001, data: f{phone} {pwd}} class RechargeMode(BaseModel): phone: str Field(min_length11,max_length11,description电话号码) amount: float Field(gt0,lt10000,description充值金额) #gt greater than lt less than app.post(/user/recharge) def recharge(data: RechargeMode): return {msg: 充值成功, code: 10001, data: f{data.phone} {data.amount}} class AddcarMode(BaseModel): carphone: str Field(min_length7, max_length8, description车牌号) cartype: str Field(min_length1, description车辆类型) carcolor: str Field(min_length1, description车辆颜色) carprice: float Field(gt0, lt9999999, description车辆价格) carimg: str Field(min_length1, description车辆图片地址) app.post(/user/addcar) def addcar(data: AddcarMode): return { msg: 添加成功, code: 10001, data: { carphone: data.carphone, cartype: data.cartype, carcolor: data.carcolor, carprice: data.carprice, carimg: data.carimg } } if __name__ __main__: uvicorn.run(demo01_fastapi:app,port8000,reloadTrue,log_leveldebug)test_demo01 pytestrequests 接口测试 import requests def test_register(): url http://127.0.0.1:8000/user/register?phone17734694395pwd123456 r requests.get(url) print(r.text) assert r.status_code 200 assert r.json()[code] 10001 assert r.json()[msg] 注册成功 def test_login(): url http://127.0.0.1:8000/user/login data {phone: 17734694395,pwd: 123456} r requests.post(url, datadata) print(r.text) assert r.status_code 200 assert r.json()[code] 10001 assert r.json()[msg] 登录成功 def test_recharge(): url http://127.0.0.1:8000/user/recharge payload {phone: 17734694395,amount: 100} r requests.post(url, jsonpayload) print(r.text) assert r.status_code 200 assert r.json()[code] 10001 assert r.json()[msg] 充值成功 def test_addcar(): url http://127.0.0.1:8000/user/addcar car {carphone: 陕ED83828,cartype: 比亚迪,carcolor: 白色,carprice: 132800,carimg: C://CarRental//upload//images//defaultcarimage.jpg} r requests.post(url, jsoncar) print(r.text) assert r.status_code 200 assert r.json()[code] 10001 assert r.json()[msg] 添加成功demo02 采购管理 采购单号 全局唯一 采购日期 商品名称 商品数量 采购总金额 状态待审核、已下单、已入库、已取消 增 post json格式的参数 /purchase_add 删 post json格式的参数 /purchase_delete 改 post json格式的参数 /purchase_modify 全量查 get /purchase_list 根据采购单号查询 get import pymysql import uvicorn from fastapi import FastAPI, Form from pydantic import BaseModel, Field from starlette.responses import HTMLResponse app FastAPI() # 创建一个实例 class PurchaseMode(BaseModel): id: str Field(...,min_length16,max_length16,description采购单号)# ... 必填项 date: str product: str Field(...,min_length2,max_length16,description商品名称)# ... 必填项 num: int Field(gt0,description数量) totalAmount: float status: str class DeleteMode(BaseModel): id: str Field(...,min_length16,max_length16,description采购单号) DB { host: 127.0.0.1, port: 3306, user: root, password: 123456, charset: utf8 } def init_db(): try: db pymysql.connect(**DB) # 解包 keyvalue,keyvalue # db pymysql.connect(host127.0.0.1,port 3306,user root,password 123456,) cursor db.cursor() cursor.execute(fcreate database if not exists fastapi38 character set utf8;) db.commit() db.select_db(fastapi38) cursor.execute(fcreate table if not exists purchase (id varchar(16) primary key, date date, fproduct varchar(16) not null, num int, totalAmount float, status varchar(16));) db.commit() cursor.close() db.close() print(初始化数据库完成) except Exception as e: print(f初始化数据库异常{e}) app.post(/purchase_add) def add(data: PurchaseMode): db pymysql.connect(**DB) db.select_db(fastapi38) cursor db.cursor() sql select * from purchase where id %s cursor.execute(sql,(data.id,)) a cursor.fetchone() if a is not None: return {msg: 采购单号重复, code: 20101} else: sql insert into purchase (id, date, product, num, totalAmount, status) values (%s, %s, %s, %s, %s, %s) cursor.execute(sql,(data.id,data.date,data.product,data.num,data.totalAmount,data.status)) db.commit() cursor.close() db.close() return {msg: 添加成功, code: 10001} app.post(/purchase_delete) def delete(data: DeleteMode): db pymysql.connect(**DB) db.select_db(fastapi38) cursor db.cursor() sql select * from purchase where id %s cursor.execute(sql, (data.id,)) a cursor.fetchone() if a is None: cursor.close() db.close() return {msg: 采购单号不存在, code: 20102} else: sql1 delete from purchase where id%s cursor.execute(sql1,(data.id,)) db.commit() cursor.close() db.close() return {msg: 删除成功, code: 10001} app.post(/purchase_modify) def modify(data: PurchaseMode): db pymysql.connect(**DB) db.select_db(fastapi38) cursor db.cursor() cursor.execute(select * from purchase where id%s, (data.id,)) a cursor.fetchone() if a is None: cursor.close() db.close() return {msg:单据不存在无法修改,code:20103} else: sql update purchase set date%s, product%s, num%s, totalAmount%s, status%s where id%s cursor.execute(sql,(data.date,data.product,data.num,data.totalAmount,data.status,data.id)) db.commit() cursor.close() db.close() return {msg:修改成功,code:10001} app.get(/purchase_list) def purchase_list(): db pymysql.connect(**DB) db.select_db(fastapi38) cursor db.cursor(pymysql.cursors.DictCursor) sql select * from purchase cursor.execute(sql) a cursor.fetchall() cursor.close() db.close() return {msg: 查询成功, code: 10001, data: a} app.get(/purchase_get) def get_one(id:str): db pymysql.connect(**DB) db.select_db(fastapi38) cursor db.cursor(pymysql.cursors.DictCursor) sql select * from purchase where id %s cursor.execute(sql, (id,)) a cursor.fetchone() cursor.close() db.close() if a is None: return {msg: 查询失败,无该采购单号, code: 20104} else: return {msg: 查询成功, code: 10001, data:a} # 删除、查询一个、修改 后面实现 app.get(/purchase.html,response_classHTMLResponse) def purchase_page(): with open(static/purchase.html, r, encodingutf-8) as f: return f.read() if __name__ __main__: init_db() # 初始化数据库 uvicorn.run(demo02:app,port8000,reloadTrue,log_leveldebug)purchase.htmlAI生成前端页面!DOCTYPE html html langzh-CN head meta charsetUTF-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 title采购管理系统/title style * { margin: 0; padding: 0; box-sizing: border-box; font-family: Microsoft Yahei, sans-serif; } body { background-color: #f0f2f5; padding: 24px; } .container { max-width: 1200px; margin: 0 auto; } h1 { text-align: center; color: #1f2937; margin-bottom: 24px; } .card { background: #ffffff; border-radius: 8px; box-shadow: 0 2px 12px rgba(0,0,0,0.08); padding: 20px; margin-bottom: 20px; } .card-title { font-size: 18px; font-weight: bold; margin-bottom: 16px; color: #374151; border-left:4px solid #409eff; padding-left:10px; } .form-row { display: flex; flex-wrap: wrap; gap:16px; margin-bottom:16px; } .form-item { flex:1; min-width:200px; } label { display:block; margin-bottom:6px; color:#4b5563; } input, select { width:100%; height:38px; padding:0 10px; border:1px solid #d1d5db; border-radius:4px; font-size:14px; } input:focus, select:focus { outline: none; border-color:#409eff; } .btn-group { display:flex; gap:10px; flex-wrap: wrap; } button { padding: 8px 18px; border: none; border-radius:4px; cursor: pointer; font-size:14px; } .btn-primary { background-color:#409eff; color:white; } .btn-warning { background-color:#e6a23c; color:white; } .btn-danger { background-color:#f56c6c; color:white; } .btn-success { background-color:#67c23a; color:white; } button:hover { opacity:0.9; } table { width:100%; border-collapse: collapse; margin-top:12px; } th,td { padding:12px; text-align:center; border-bottom:1px solid #eee; font-size:14px; } th { background-color:#f5f7fa; color:#333; } .msg-box { margin:12px 0; padding:10px; border-radius:4px; display:none; } .msg-success { background-color:#f0f9eb; color:#67c23a; } .msg-error { background-color:#fef0f0; color:#f56c6c; } /style /head body div classcontainer h1采购管理系统/h1 !-- 消息提示 -- div idmsgBox classmsg-box/div !-- 新增采购表单 -- div classcard div classcard-title新增采购/div div classform-row div classform-item label采购单号(16位)/label input typetext idaddId placeholder请输入16位采购单号 /div div classform-item label采购日期/label input typedate idaddDate /div div classform-item label商品名称/label input typetext idaddProduct placeholder商品名称2‑16位 /div /div div classform-row div classform-item label商品数量/label input typenumber idaddNum min1 placeholder数量0 /div div classform-item label采购总金额/label input typenumber step0.01 idaddTotal placeholder总金额 /div div classform-item label状态/label select idaddStatus option value待审核待审核/option option value已下单已下单/option option value已入库已入库/option option value已取消已取消/option /select /div /div div classbtn-group button classbtn-primary onclickaddPurchase()提交新增/button /div /div !-- 查询操作区 -- div classcard div classcard-title查询采购/div div classform-row div classform-item label按采购单号查询/label input typetext idqueryId placeholder输入采购单号 /div /div div classbtn-group button classbtn-primary onclickgetOne()单条查询/button button classbtn-success onclickloadList()全量查询/button /div /div !-- 修改采购表单 -- div classcard div classcard-title修改采购(先查询/表格点击编辑)/div div classform-row div classform-item label采购单号(不可修改)/label input typetext idmodId readonly /div div classform-item label采购日期/label input typedate idmodDate /div div classform-item label商品名称/label input typetext idmodProduct /div /div div classform-row div classform-item label商品数量/label input typenumber idmodNum min1 /div div classform-item label采购总金额/label input typenumber step0.01 idmodTotal /div div classform-item label状态/label select idmodStatus option value待审核待审核/option option value已下单已下单/option option value已入库已入库/option option value已取消已取消/option /select /div /div div classbtn-group button classbtn-warning onclickmodifyPurchase()保存修改/button button classbtn-danger onclickdeletePurchase()删除该采购单/button /div /div !-- 表格展示 -- div classcard div classcard-title采购列表/div table thead tr th采购单号/th th采购日期/th th商品名称/th th商品数量/th th采购总金额/th th状态/th th操作/th /tr /thead tbody idtableBody /tbody /table /div /div script const baseUrl http://127.0.0.1:8000; //消息提示 function showMsg(text, isSuccesstrue){ const box document.getElementById(msgBox); box.style.display block; box.className msg-box (isSuccess ? msg-success:msg-error); box.innerText text; setTimeout((){box.style.displaynone},3000); } //新增 async function addPurchase(){ const data { id: document.getElementById(addId).value, date: document.getElementById(addDate).value, product: document.getElementById(addProduct).value, num: Number(document.getElementById(addNum).value), totalAmount: Number(document.getElementById(addTotal).value), status: document.getElementById(addStatus).value }; const resp await fetch(baseUrl/purchase_add,{ method:POST, headers:{Content-Type:application/json}, body:JSON.stringify(data) }); const res await resp.json(); if(res.code10001){ showMsg(res.msg,true); //清空表单 document.getElementById(addId).value; document.getElementById(addDate).value; document.getElementById(addProduct).value; document.getElementById(addNum).value; document.getElementById(addTotal).value; loadList(); }else{ showMsg(res.msg,false); } } //全量查询 async function loadList(){ const resp await fetch(baseUrl/purchase_list); const res await resp.json(); renderTable(res.data); } //单条查询 async function getOne(){ const pid document.getElementById(queryId).value.trim(); if(!pid){ showMsg(请输入采购单号,false); return; } const resp await fetch(baseUrl/purchase_get?id${pid}); const res await resp.json(); if(res.code!10001){ showMsg(res.msg,false); return; } const row res.data; //填充修改表单 document.getElementById(modId).value row.id; document.getElementById(modDate).value row.date; document.getElementById(modProduct).value row.product; document.getElementById(modNum).value row.num; document.getElementById(modTotal).value row.totalAmount; document.getElementById(modStatus).value row.status; showMsg(查询成功可以修改或删除,true); } //修改 async function modifyPurchase(){ const data { id: document.getElementById(modId).value, date: document.getElementById(modDate).value, product: document.getElementById(modProduct).value, num: Number(document.getElementById(modNum).value), totalAmount: Number(document.getElementById(modTotal).value), status: document.getElementById(modStatus).value }; if(!data.id){ showMsg(请先查询要修改的单据,false); return; } const resp await fetch(baseUrl/purchase_modify,{ method:POST, headers:{Content-Type:application/json}, body:JSON.stringify(data) }); const res await resp.json(); if(res.code10001){ showMsg(res.msg,true); loadList(); }else{ showMsg(res.msg,false); } } //删除 async function deletePurchase(){ const pid document.getElementById(modId).value; if(!pid){ showMsg(请先查询要删除的单据,false); return; } if(!confirm(确认删除该采购单)) return; const resp await fetch(baseUrl/purchase_delete,{ method:POST, headers:{Content-Type:application/json}, body:JSON.stringify({id:pid}) }); const res await resp.json(); if(res.code10001){ showMsg(res.msg,true); //清空修改表单 document.getElementById(modId).value; document.getElementById(modDate).value; document.getElementById(modProduct).value; document.getElementById(modNum).value; document.getElementById(modTotal).value; loadList(); }else{ showMsg(res.msg,false); } } //渲染表格 function renderTable(list){ const tb document.getElementById(tableBody); tb.innerHTML ; list.forEach(item{ const tr document.createElement(tr); tr.innerHTML td${item.id}/td td${item.date}/td td${item.product}/td td${item.num}/td td${item.totalAmount}/td td${item.status}/td td button classbtn-warning onclickfillToMod(${item.id},${item.date},${item.product},${item.num},${item.totalAmount},${item.status})编辑/button /td ; tb.appendChild(tr); }) } //表格点击编辑回填到修改表单 function fillToMod(id,date,product,num,total,status){ document.getElementById(modId).value id; document.getElementById(modDate).value date; document.getElementById(modProduct).value product; document.getElementById(modNum).value num; document.getElementById(modTotal).value total; document.getElementById(modStatus).value status; showMsg(已选中该行数据可以修改删除,true); } window.onload function(){ loadList(); } /script /body /htmltest_demo02import random import requests def test_add(): url http://127.0.0.1:8000/purchase_add data { id: str(random.randint(1000,9999)) * 4, date: 2026-08-21, product: 办公打印机, num: 2, totalAmount: 5600.00, status: 待审核 } r requests.post(url, jsondata) print(r.text) assert r.status_code 200 assert r.json()[code] 10001 assert r.json()[msg] 添加成功 def test_delete(): url http://127.0.0.1:8000/purchase_delete data { id: 3654365436543654 } r requests.post(url, jsondata) print(r.text) assert r.status_code 200 assert r.json()[code] 10001 assert r.json()[msg] 删除成功 def test_modify(): url http://127.0.0.1:8000/purchase_modify data { id: 8364836483648364, date: 2026-08-20, product: 办公鼠标, num: 4, totalAmount: 600.00, status: 待审核 } r requests.post(url, jsondata) print(r.text) assert r.status_code 200 assert r.json()[code] 10001 assert r.json()[msg] 修改成功 def test_get_one(): url http://127.0.0.1:8000/purchase_get?id8364836483648364 r requests.get(url) print(r.text) assert r.status_code 200 assert r.json()[code] 10001 assert r.json()[msg] 查询成功 def test_purchase_list(): url http://127.0.0.1:8000/purchase_list r requests.get(url) print(r.text) assert r.status_code 200 assert r.json()[code] 10001 assert r.json()[msg] 查询成功
返回列表