Advertisement
yudiwibisono

fastapi_1

May 21st, 2023 (edited)
1,079
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.11 KB | None | 0 0
  1. # conda activate webservicep2plending webservicep2plending
  2. # uvicorn main:app --reload
  3.  
  4.  
  5. from typing import Union
  6. from fastapi import FastAPI,Response,Request,HTTPException
  7. from fastapi.middleware.cors import CORSMiddleware
  8. import sqlite3
  9.  
  10. app = FastAPI()
  11.  
  12. app.add_middleware(
  13.     CORSMiddleware,
  14.     allow_origins=["*"],
  15.     allow_credentials=True,
  16.     allow_methods=["*"],
  17.     allow_headers=["*"],
  18. )
  19.  
  20.  
  21. @app.get("/")
  22. def read_root():
  23.     return {"Hello": "World"}
  24.  
  25. @app.get("/mahasiswa/{nim}")
  26. def ambil_mhs(nim:str):
  27.     return {"nama": "Budi Martami"}
  28.  
  29. @app.get("/mahasiswa2/")
  30. def ambil_mhs2(nim:str):
  31.     return {"nama": "Budi Martami 2"}
  32.  
  33. @app.get("/daftar_mhs/")
  34. def daftar_mhs(id_prov:str,angkatan:str):
  35.     return {"query":" idprov: {}  ; angkatan: {} ".format(id_prov,angkatan),"data":[{"nim":"1234"},{"nim":"1235"}]}
  36.  
  37. # panggil sekali saja
  38. @app.get("/init/")
  39. def init_db():
  40.   try:
  41.     DB_NAME = "upi.db"
  42.     con = sqlite3.connect(DB_NAME)
  43.     cur = con.cursor()
  44.     create_table = """ CREATE TABLE mahasiswa(
  45.             ID          INTEGER PRIMARY KEY     AUTOINCREMENT,
  46.             nim         TEXT                NOT NULL,
  47.             nama        TEXT                NOT NULL,
  48.             id_prov     TEXT                NOT NULL,
  49.             angkatan    TEXT                NOT NULL,
  50.            tinggi_badan  INTEGER
  51.        )  
  52.        """
  53.     cur.execute(create_table)
  54.     con.commit
  55.   except:
  56.            return ({"status":"terjadi error"})  
  57.   finally:
  58.            con.close()
  59.    
  60.   return ({"status":"ok, db dan tabel berhasil dicreate"})
  61.  
  62. from pydantic import BaseModel
  63.  
  64. from typing import Optional
  65.  
  66. class Mhs(BaseModel):
  67.    nim: str
  68.    nama: str
  69.    id_prov: str
  70.    angkatan: str
  71.    tinggi_badan: Optional[int] | None = None  # yang boleh null hanya ini
  72.  
  73.  
  74. #status code 201 standard return creation
  75. #return objek yang baru dicreate (response_model tipenya Mhs)
  76. @app.post("/tambah_mhs/", response_model=Mhs,status_code=201)  
  77. def tambah_mhs(m: Mhs,response: Response, request: Request):
  78.    try:
  79.        DB_NAME = "upi.db"
  80.        con = sqlite3.connect(DB_NAME)
  81.        cur = con.cursor()
  82.        # hanya untuk test, rawal sql injecttion, gunakan spt SQLAlchemy
  83.        cur.execute("""insert into mahasiswa (nim,nama,id_prov,angkatan,tinggi_badan) values ( "{}","{}","{}","{}",{})""".format(m.nim,m.nama,m.id_prov,m.angkatan,m.tinggi_badan))
  84.        con.commit()
  85.    except:
  86.        print("oioi error")
  87.        return ({"status":"terjadi error"})  
  88.    finally:      
  89.        con.close()
  90.    response.headers["Location"] = "/mahasiswa/{}".format(m.nim)
  91.    print(m.nim)
  92.    print(m.nama)
  93.    print(m.angkatan)
  94.  
  95.    return m
  96.  
  97.  
  98.  
  99. @app.get("/tampilkan_semua_mhs/")
  100. def tampil_semua_mhs():
  101.    try:
  102.        DB_NAME = "upi.db"
  103.        con = sqlite3.connect(DB_NAME)
  104.        cur = con.cursor()
  105.        recs = []
  106.        for row in cur.execute("select * from mahasiswa"):
  107.            recs.append(row)
  108.    except:
  109.        return ({"status":"terjadi error"})  
  110.    finally:      
  111.        con.close()
  112.    return {"data":recs}
  113.  
  114. from fastapi.encoders import jsonable_encoder
  115.  
  116.  
  117. @app.put("/update_mhs_put/{nim}",response_model=Mhs)
  118. def update_mhs_put(response: Response,nim: str, m: Mhs ):
  119.     #update keseluruhan
  120.     #karena key, nim tidak diupdape
  121.     try:
  122.        DB_NAME = "upi.db"
  123.        con = sqlite3.connect(DB_NAME)
  124.        cur = con.cursor()
  125.        cur.execute("select * from mahasiswa where nim = ?", (nim,) )  #tambah koma untuk menandakan tupple
  126.        existing_item = cur.fetchone()
  127.     except Exception as e:
  128.         raise HTTPException(status_code=500, detail="Terjadi exception: {}".format(str(e)))  
  129.    
  130.     if existing_item:  #data ada
  131.             print(m.tinggi_badan)
  132.             cur.execute("update mahasiswa set nama = ?, id_prov = ?, angkatan=?, tinggi_badan=? where nim=?", (m.nama,m.id_prov,m.angkatan,m.tinggi_badan,nim))
  133.             con.commit()            
  134.             response.headers["location"] = "/mahasiswa/{}".format(m.nim)
  135.     else:  # data tidak ada
  136.             print("item not foud")
  137.             raise HTTPException(status_code=404, detail="Item Not Found")
  138.      
  139.     con.close()
  140.     return m
  141.  
  142.  
  143. # khusus untuk patch, jadi boleh tidak ada
  144. # menggunakan "kosong" dan -9999 supaya bisa membedakan apakah tdk diupdate ("kosong") atau mau
  145. # diupdate dengan dengan None atau 0
  146. class MhsPatch(BaseModel):
  147.    nama: str | None = "kosong"
  148.    id_prov: str | None = "kosong"
  149.    angkatan: str | None = "kosong"
  150.    tinggi_badan: Optional[int] | None = -9999  # yang boleh null hanya ini
  151.  
  152.  
  153.  
  154. @app.patch("/update_mhs_patch/{nim}",response_model = MhsPatch)
  155. def update_mhs_patch(response: Response, nim: str, m: MhsPatch ):
  156.     try:
  157.       print(str(m))
  158.       DB_NAME = "upi.db"
  159.       con = sqlite3.connect(DB_NAME)
  160.       cur = con.cursor()
  161.       cur.execute("select * from mahasiswa where nim = ?", (nim,) )  #tambah koma untuk menandakan tupple
  162.       existing_item = cur.fetchone()
  163.     except Exception as e:
  164.       raise HTTPException(status_code=500, detail="Terjadi exception: {}".format(str(e))) # misal database down  
  165.    
  166.     if existing_item:  #data ada, lakukan update
  167.         sqlstr = "update mahasiswa set " #asumsi minimal ada satu field update
  168.         # todo: bisa direfaktor dan dirapikan
  169.         if m.nama!="kosong":
  170.             if m.nama!=None:
  171.                 sqlstr = sqlstr + " nama = '{}' ,".format(m.nama)
  172.             else:    
  173.                 sqlstr = sqlstr + " nama = null ,"
  174.        
  175.         if m.angkatan!="kosong":
  176.             if m.angkatan!=None:
  177.                 sqlstr = sqlstr + " angkatan = '{}' ,".format(m.angkatan)
  178.             else:
  179.                 sqlstr = sqlstr + " angkatan = null ,"
  180.        
  181.         if m.id_prov!="kosong":
  182.             if m.id_prov!=None:
  183.                 sqlstr = sqlstr + " id_prov = '{}' ,".format(m.id_prov)
  184.             else:
  185.                 sqlstr = sqlstr + " id_prov = null, "    
  186.  
  187.         if m.tinggi_badan!=-9999:
  188.             if m.tinggi_badan!=None:
  189.                 sqlstr = sqlstr + " tinggi_badan = {} ,".format(m.tinggi_badan)
  190.             else:    
  191.                 sqlstr = sqlstr + " tinggi_badan = null ,"
  192.  
  193.         sqlstr = sqlstr[:-1] + " where nim='{}' ".format(nim)  #buang koma yang trakhir  
  194.         print(sqlstr)      
  195.         try:
  196.             cur.execute(sqlstr)
  197.             con.commit()        
  198.             response.headers["location"] = "/mahasixswa/{}".format(nim)
  199.         except Exception as e:
  200.             raise HTTPException(status_code=500, detail="Terjadi exception: {}".format(str(e)))  
  201.        
  202.  
  203.     else:  # data tidak ada 404, item not found
  204.          raise HTTPException(status_code=404, detail="Item Not Found")
  205.    
  206.     con.close()
  207.     return m
  208.  
  209.    
  210. @app.delete("/delete_mhs/{nim}")
  211. def delete_mhs(nim: str):
  212.     try:
  213.        DB_NAME = "upi.db"
  214.        con = sqlite3.connect(DB_NAME)
  215.        cur = con.cursor()
  216.        sqlstr = "delete from mahasiswa  where nim='{}'".format(nim)                
  217.        print(sqlstr) # debug
  218.        cur.execute(sqlstr)
  219.        con.commit()
  220.     except:
  221.        return ({"status":"terjadi error"})  
  222.     finally:     
  223.        con.close()
  224.    
  225.     return {"status":"ok"}
  226.  
  227.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement