首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用FastAPI/Starlette在RedirectResponse中添加正文内容?

如何使用FastAPI/Starlette在RedirectResponse中添加正文内容?
EN

Stack Overflow用户
提问于 2022-11-02 14:23:50
回答 1查看 99关注 0票数 1

我想在/check_base端点内使用一个音频文件。但是,我不能将文件发送到RedirectResponse的正文中。/check端点返回一个RedirectResponse,它只接受URL参数。请帮帮我。

这是我的代码:

代码语言:javascript
运行
复制
@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(...)
):
EN

回答 1

Stack Overflow用户

发布于 2022-11-02 16:40:14

HTTP协议中的重定向基本上是一个标题,即Location响应头,指示要将页面重定向到的URL。尽管如此,这并不妨碍一个人在反应中提供身体。由于FastAPI/Starlette的RedirectResponse不提供相关的content参数,这将允许您传递主体,因此您可以使用3xx (重定向)状态代码和保存要重定向到的URL的Location头来代替直接。如果希望重定向请求重用方法(例如,POST)和原始请求的主体,则可以使用307 Temporary Redirect状态响应代码(所有状态代码的相关Starlette实现可以找到这里)。

工作实例:

app.py

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
<!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>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74290776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档