tianyun 3 年之前
父节点
当前提交
94f4677984
共有 1 个文件被更改,包括 93 次插入0 次删除
  1. 93 0
      call_sh.py

+ 93 - 0
call_sh.py

@@ -0,0 +1,93 @@
+import os
+import time
+import uvicorn
+import subprocess
+
+from fastapi import FastAPI, UploadFile, File, Form
+from fastapi import Request
+from fastapi.middleware.cors import CORSMiddleware
+from starlette.middleware.sessions import SessionMiddleware
+from starlette.responses import JSONResponse, RedirectResponse, FileResponse
+
+
+def save_upload_file(file: UploadFile, dir_path=None, file_name=None):
+    if not dir_path:
+        dir_path = "./"
+    if not dir_path.endswith("/"):
+        dir_path += "/"
+    if not file_name:
+        file_name = file.filename
+    with open(dir_path + file_name, 'wb') as f:
+        f.write(file.file.read())
+
+
+app = FastAPI(title="project name ", description="通用系统 ", version="v 0.0.0")
+
+# 添加 session 中间键,使项目中可以使用session
+app.add_middleware(SessionMiddleware, secret_key='123456hhh')
+app.add_middleware(
+    CORSMiddleware,
+    allow_origins=["*", ],
+    allow_credentials=True,
+    allow_methods=["*"],
+    allow_headers=["*"],
+)
+
+
+@app.exception_handler(Exception)
+async def validation_exception_handler(request, exc):
+    """请求校验异常捕获; application/json """
+    return JSONResponse({'message': "服务器内部错误", 'status_code': 500})
+
+
+@app.middleware("http")
+async def add_process_time_header(request: Request, call_next):
+    """接口响应中间键; 当前只支持 http 请求"""
+    start_time = time.time()
+    response = await call_next(request)
+    process_time = time.time() - start_time
+    response.headers["API-Process-Time"] = f"{process_time} seconds"
+    return response
+
+
+@app.get("/call_sh")
+def call_sh(path: str):
+    """
+    echo "$(curl 127.0.0.1:9999/call_sh?path=/Users/mlamp/IdeaProjects/python-base/tmp.sh)"
+    :param path:
+    :return:
+    """
+    read = os.popen(f"sh {path}").read()
+    print(read)
+    return os.popen(f"sh {path}").read()
+    # return subprocess.call(f"sh {path}")
+
+
+@app.post("/upload")
+def upload(file: UploadFile = File(...), path: str = Form(...)):
+    """
+    curl 127.0.0.1:9999/upload -F "file=@稻香.flac" -F 'path=/Users/mlamp/tmp'
+    :param file:
+    :param path:
+    :return:
+    """
+    save_upload_file(file, path)
+    return "OK"
+
+
+@app.get("/download")
+def download(path: str):
+    """
+    wget 127.0.0.1:9999/download?path=/Users/mlamp/tmp/稻香.flac
+    :param path:
+    :return:
+    """
+    return FileResponse(
+        path,
+        filename=path.split("/")[-1]
+    )
+
+
+if __name__ == '__main__':
+    # uvicorn call_sh:app --reload --port 19999
+    uvicorn.run(app='call_sh:app', host="0.0.0.0", port=9999, reload=True, debug=True)