选项 2 - 返回包含重定向 URL 的 JSON 响应

除了从服务器返回 RedirectResponse 之外,还可以让服务器返回包含在 JSON 对象中的、带有 URL 的普通 JSON 响应。在クライアント側,你可以检查服务器返回的(fetch() 请求的结果)JSON 对象是否包含 url 键,如果是,则检索其值并使用 JavaScript 的 window.location.href 或 window.location.replace() 将用户重定向到目标 URL。

或者,人们可以在服务器端将重定向 URL 添加到自定义响应头(请参见这里和这里的示例,了解如何在 FastAPI 中设置响应头),并在使用 fetch() 发布请求后在クライアント側访问它,如这里所示(请注意,如果你正在进行跨域请求,则必须在服务器端设置 Access-Control-Expose-Headers 响应头(请参见这里和这里的示例,以及 FastAPI 的 CORSMiddleware 文档,了解如何使用 expose_headers 参数),指定你的自定义响应头(包括重定向 URL)应可用于在浏览器中运行的 JS 脚本,因为默认情况下仅公开 CORS 安全列表响应头)。

app.py

from fastapi import FastAPI, Request, status, Dependsfrom fastapi.templating import Jinja2Templatesfrom fastapi.security import OAuth2PasswordRequestFormapp = FastAPI()templates = Jinja2Templates(directory=\\'templates\\')@app.get(\\'/\\')async def index(request: Request):    return templates.TemplateResponse(\\'index.html\\', {\\'request\\': request})    @app.post(\\'/login\\')async def login(data: OAuth2PasswordRequestForm = Depends()):    # 执行一些验证,使用 data.username 和 data.password    credentials_valid = True        if credentials_valid:        return {\\'url\\': \\'/welcome\\'}    else:        return \\'Validation failed\\' @app.get(\\'/welcome\\')async def welcome():    return \\'You have been successfully redirected\\'

templates/index.html

                     





选项 3 - 在前端使用 HTML

如果你的项目不需要使用 fetch() 请求,则可以改为使用普通 HTML ,并让用户单击提交按钮以向服务器发送 POST 请求。通过这种方式,在服务器端使用 RedirectResponse(如选项 1 中所示)将导致在クライアント側自动将用户重定向到目标 URL,而无需执行任何进一步操作。

以下是可以找到实际示例的链接:

","image":"http://www.luping.net/uploads/20241110/17312475666730bdce9e0e1.jpg","datePublished":"2024-11-10T22:11:09+08:00","dateModified":"2024-11-10T22:11:09+08:00","author":{"@type":"Person","name":"luping.net","url":"https://www.luping.net/articlelist/0_1.html"}}
”工欲善其事,必先利其器。“—孔子《论语.录灵公》

如何使用 JavaScript Fetch API 在登录后将用户重定向到另一个页面?

发布于2024-11-10
浏览:112

How to Redirecting User to Another Page After Login Using JavaScript Fetch API?

如何使用 JavaScript Fetch API 登陆后将用户重定向到另一个页面?

在 JavaScript 代码中,使用 fetch() 方法向 FastAPI 后端发出 POST 请求以登录用户。后端检查令牌是否有效,如果是,则返回重定向(即 RedirectResponse)到另一个网页。但问题是:浏览器中的重定向不起作用,前一页仍然存在。

选项 1 - 返回 RedirectResponse

默认情况下,使用 fetch() 发出 HTTP 请求时,若服务器以 RedirectResponse 响应,则会在クライアント側自动跟踪重定向(如这里所述),因为 fetch() 函数中已将重定向模式默认设置为 follow。这意味着用户不会被重定向到新 URL,而是 fetch() 会在后台跟踪该重定向并返回重定向 URL 的响应。你可以预期将重定向设置为 manual 让你可以获取重定向 URL(包含在 Location 响应头中)并手动导航到新页面,但事实并非如此,如这里所述。

不过,你仍然可以在 fetch() 请求中使用默认的重定向模式 follow(不需要手动指定,因为默认已设置好——在下面的示例中,仅出于清晰度目的而手动定义它),然后使用 Response.redirected 检查响应是否是你发起的请求被重定向的结果。如果是,则可以使用 Response.url,它将返回“任何重定向之后获得的最终 URL”,并且使用 JavaScript 的 window.location.href,你可以将用户重定向到目标 URL(即重定向页面)。

除了 window.location.href,还可以使用 window.location.replace()。与设置 href 属性值不同,使用 location.replace() 方法后,导航到给定 URL 后,当前页面不会保存在会话历史记录中——这意味着用户将无法使用后退按钮导航到它。

app.py

from fastapi import FastAPI, Request, status, Depends
from fastapi.templating import Jinja2Templates
from fastapi.responses import RedirectResponse
from fastapi.security import OAuth2PasswordRequestForm

app = FastAPI()
templates = Jinja2Templates(directory='templates')


@app.get('/')
async def index(request: Request):
    return templates.TemplateResponse('index.html', {'request': request})

    
@app.post('/login')
async def login(data: OAuth2PasswordRequestForm = Depends()):
    # 执行一些验证,使用 data.username 和 data.password
    credentials_valid = True
    
    if credentials_valid:
        return RedirectResponse(url='/welcome',status_code=status.HTTP_302_FOUND)
    else:
        return 'Validation failed'
 

@app.get('/welcome')
async def welcome():
    return 'You have been successfully redirected'

templates/index.html



   
      
   
   
      
         




选项 2 - 返回包含重定向 URL 的 JSON 响应

除了从服务器返回 RedirectResponse 之外,还可以让服务器返回包含在 JSON 对象中的、带有 URL 的普通 JSON 响应。在クライアント側,你可以检查服务器返回的(fetch() 请求的结果)JSON 对象是否包含 url 键,如果是,则检索其值并使用 JavaScript 的 window.location.href 或 window.location.replace() 将用户重定向到目标 URL。

或者,人们可以在服务器端将重定向 URL 添加到自定义响应头(请参见这里和这里的示例,了解如何在 FastAPI 中设置响应头),并在使用 fetch() 发布请求后在クライアント側访问它,如这里所示(请注意,如果你正在进行跨域请求,则必须在服务器端设置 Access-Control-Expose-Headers 响应头(请参见这里和这里的示例,以及 FastAPI 的 CORSMiddleware 文档,了解如何使用 expose_headers 参数),指定你的自定义响应头(包括重定向 URL)应可用于在浏览器中运行的 JS 脚本,因为默认情况下仅公开 CORS 安全列表响应头)。

app.py

from fastapi import FastAPI, Request, status, Depends
from fastapi.templating import Jinja2Templates
from fastapi.security import OAuth2PasswordRequestForm

app = FastAPI()
templates = Jinja2Templates(directory='templates')


@app.get('/')
async def index(request: Request):
    return templates.TemplateResponse('index.html', {'request': request})

    
@app.post('/login')
async def login(data: OAuth2PasswordRequestForm = Depends()):
    # 执行一些验证,使用 data.username 和 data.password
    credentials_valid = True
    
    if credentials_valid:
        return {'url': '/welcome'}
    else:
        return 'Validation failed'
 

@app.get('/welcome')
async def welcome():
    return 'You have been successfully redirected'

templates/index.html



   
      
   
   
      





选项 3 - 在前端使用 HTML

如果你的项目不需要使用 fetch() 请求,则可以改为使用普通 HTML

,并让用户单击提交按钮以向服务器发送 POST 请求。通过这种方式,在服务器端使用 RedirectResponse(如选项 1 中所示)将导致在クライアント側自动将用户重定向到目标 URL,而无需执行任何进一步操作。

以下是可以找到实际示例的链接:

  • [答案](https://stackoverflow.com/a/52578752)
  • [答案](https://stackoverflow.com/a/42384331)
  • [答案](https://stackoverflow.com/a/33826804)
版本声明 本文转载于:1729207303如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    在CSS 问题:不正确的代码: 全球范围将所有余量重置为零,如提供的代码所建议的,可能会导致意外的副作用。解决特定的保证金问题是更建议的。 例如,在提供的示例中,将以下代码添加到CSS中,将解决余量问题: body H1 { 保证金顶:-40px; } 此方法更精确,避免了由全局保证金重置引...
    编程 发布于2025-04-11
  • 如何在Java字符串中有效替换多个子字符串?
    如何在Java字符串中有效替换多个子字符串?
    在java 中有效地替换多个substring,需要在需要替换一个字符串中的多个substring的情况下,很容易求助于重复应用字符串的刺激力量。 However, this can be inefficient for large strings or when working with nu...
    编程 发布于2025-04-11
  • 如何使用PHP从XML文件中有效地检索属性值?
    如何使用PHP从XML文件中有效地检索属性值?
    从php $xml = simplexml_load_file($file); foreach ($xml->Var[0]->attributes() as $attributeName => $attributeValue) { echo $attributeName,...
    编程 发布于2025-04-11
  • 如何在Java中执行命令提示命令,包括目录更改,包括目录更改?
    如何在Java中执行命令提示命令,包括目录更改,包括目录更改?
    在java 通过Java通过Java运行命令命令可能很具有挑战性。尽管您可能会找到打开命令提示符的代码段,但他们通常缺乏更改目录并执行其他命令的能力。 solution:使用Java使用Java,使用processBuilder。这种方法允许您:启动一个过程,然后将其标准错误重定向到其标准输出。...
    编程 发布于2025-04-11
  • 如何为PostgreSQL中的每个唯一标识符有效地检索最后一行?
    如何为PostgreSQL中的每个唯一标识符有效地检索最后一行?
    postgresql:为每个唯一标识符提取最后一行,在Postgresql中,您可能需要遇到与在数据库中的每个不同标识相关的信息中提取信息的情况。考虑以下数据:[ 1 2014-02-01 kjkj 在数据集中的每个唯一ID中检索最后一行的信息,您可以在操作员上使用Postgres的有效效率: ...
    编程 发布于2025-04-11
  • 如何处理PHP文件系统功能中的UTF-8文件名?
    如何处理PHP文件系统功能中的UTF-8文件名?
    在PHP的Filesystem functions中处理UTF-8 FileNames 在使用PHP的MKDIR函数中含有UTF-8字符的文件很多flusf-8字符时,您可能会在Windows Explorer中遇到comploreer grounder grounder grounder gro...
    编程 发布于2025-04-11
  • 如何在无序集合中为元组实现通用哈希功能?
    如何在无序集合中为元组实现通用哈希功能?
    在未订购的集合中的元素要纠正此问题,一种方法是手动为特定元组类型定义哈希函数,例如: template template template 。 struct std :: hash { size_t operator()(std :: tuple const&tuple)const {...
    编程 发布于2025-04-11
  • 在Java中使用for-to-loop和迭代器进行收集遍历之间是否存在性能差异?
    在Java中使用for-to-loop和迭代器进行收集遍历之间是否存在性能差异?
    For Each Loop vs. Iterator: Efficiency in Collection TraversalIntroductionWhen traversing a collection in Java, the choice arises between using a for-...
    编程 发布于2025-04-11
  • 如何使用FormData()处理多个文件上传?
    如何使用FormData()处理多个文件上传?
    )处理多个文件输入时,通常需要处理多个文件上传时,通常是必要的。 The fd.append("fileToUpload[]", files[x]); method can be used for this purpose, allowing you to send multi...
    编程 发布于2025-04-11
  • 为什么PHP的DateTime :: Modify('+1个月')会产生意外的结果?
    为什么PHP的DateTime :: Modify('+1个月')会产生意外的结果?
    使用php dateTime修改月份:发现预期的行为在使用PHP的DateTime类时,添加或减去几个月可能并不总是会产生预期的结果。正如文档所警告的那样,“当心”这些操作的“不像看起来那样直观。 考虑文档中给出的示例:这是内部发生的事情: 现在在3月3日添加另一个月,因为2月在2001年只有2...
    编程 发布于2025-04-11
  • 如何使用组在MySQL中旋转数据?
    如何使用组在MySQL中旋转数据?
    在关系数据库中使用mySQL组使用mySQL组进行查询结果,在关系数据库中使用MySQL组,转移数据的数据是指重新排列的行和列的重排以增强数据可视化。在这里,我们面对一个共同的挑战:使用组的组将数据从基于行的基于列的转换为基于列。 Let's consider the following ...
    编程 发布于2025-04-11
  • Android如何向PHP服务器发送POST数据?
    Android如何向PHP服务器发送POST数据?
    在android apache httpclient(已弃用) httpclient httpclient = new defaulthttpclient(); httppost httppost = new httppost(“ http://www.yoursite.com/script.p...
    编程 发布于2025-04-11
  • 如何检查对象是否具有Python中的特定属性?
    如何检查对象是否具有Python中的特定属性?
    方法来确定对象属性存在寻求一种方法来验证对象中特定属性的存在。考虑以下示例,其中尝试访问不确定属性会引起错误: >>> a = someClass() >>> A.property Trackback(最近的最新电话): 文件“ ”,第1行, AttributeError: SomeClass...
    编程 发布于2025-04-11
  • 如何从PHP中的数组中提取随机元素?
    如何从PHP中的数组中提取随机元素?
    从阵列中的随机选择,可以轻松从数组中获取随机项目。考虑以下数组:; 从此数组中检索一个随机项目,利用array_rand( array_rand()函数从数组返回一个随机键。通过将$项目数组索引使用此键,我们可以从数组中访问一个随机元素。这种方法为选择随机项目提供了一种直接且可靠的方法。
    编程 发布于2025-04-11
  • 如何使用Python理解有效地创建字典?
    如何使用Python理解有效地创建字典?
    在python中,词典综合提供了一种生成新词典的简洁方法。尽管它们与列表综合相似,但存在一些显着差异。与问题所暗示的不同,您无法为钥匙创建字典理解。您必须明确指定键和值。 For example:d = {n: n**2 for n in range(5)}This creates a dicti...
    编程 发布于2025-04-11

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3