我想在/check_base
端点内使用一个音频文件。但是,我不能将文件发送到RedirectResponse
的正文中。/check
端点返回一个RedirectResponse
,它只接受URL
参数。请帮帮我。
这是我的代码:
@router.post("/check")
async def check(
request: Request
):
file = StarletteUploadFile(filename="/home/hello.wav")
redirect_url = app.url_path_for("check_base", **{'audio':file)
response = RedirectResponse(url=redirect_url)
return response
@router.post("/check_base")
async def check_base(
request: Request,
audio: UploadFile = File(...)
):
发布于 2022-11-02 16:40:14
HTTP协议中的重定向基本上是一个标题,即Location
响应头,指示要将页面重定向到的URL。尽管如此,这并不妨碍一个人在反应中提供身体。由于FastAPI/Starlette的RedirectResponse
不提供相关的content
参数,这将允许您传递主体,因此您可以使用3xx
(重定向)状态代码和保存要重定向到的URL的Location
头来代替直接。如果希望重定向请求重用方法(例如,POST
)和原始请求的主体,则可以使用307 Temporary Redirect
状态响应代码(所有状态代码的相关Starlette实现可以找到这里)。
工作实例:
app.py
from fastapi import FastAPI, Request, Response, Form, status
from fastapi.templating import Jinja2Templates
app = FastAPI()
templates = Jinja2Templates(directory='templates')
@app.post('/submitFinal')
def final(msg: str = Form(...)):
return f'You reached your destination. The msg is {msg}'
@app.post('/submit')
def redirect(msg: str = Form(...)):
headers = {'Location': '/submitFinal'}
return Response(content=msg, headers=headers, status_code=status.HTTP_307_TEMPORARY_REDIRECT)
@app.get('/')
def index(request: Request):
return templates.TemplateResponse('index.html', {'request': request})
templates/index.html
<!DOCTYPE html>
<html>
<head>
<script>
document.addEventListener('DOMContentLoaded', (event) => {
document.getElementById("myForm").addEventListener("submit", function (e) {
e.preventDefault() // Cancel the default action
var formElement = document.getElementById('myForm');
var data = new FormData(formElement);
fetch('/submit', {
method: 'POST',
body: data
})
.then(resp => resp.text()) // or, resp.json(), etc.
.then(data => {
document.getElementById("responseArea").innerHTML = data;
})
.catch(error => {
console.error(error);
});
});
});
</script>
</head>
<body>
<h1>Send a message</h1>
<form id="myForm">
Message : <input type="text" name="msg" value="foo">
<input class="submit" type="submit" value="Submit">
</form>
<div id="responseArea"></div>
</body>
</html>
https://stackoverflow.com/questions/74290776
复制相似问题