选项 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
浏览:602

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]删除
最新教程 更多>
  • 如何在 PHP 中组合两个关联数组,同时保留唯一 ID 并处理重复名称?
    如何在 PHP 中组合两个关联数组,同时保留唯一 ID 并处理重复名称?
    在 PHP 中组合关联数组在 PHP 中,将两个关联数组组合成一个数组是一项常见任务。考虑以下请求:问题描述:提供的代码定义了两个关联数组,$array1和$array2。目标是创建一个新数组 $array3,它合并两个数组中的所有键值对。 此外,提供的数组具有唯一的 ID,而名称可能重合。要求是构...
    编程 发布于2024-11-15
  • 除了“if”语句之外:还有什么地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    除了“if”语句之外:还有什么地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    无需强制转换即可上下文转换为 bool您的类定义了对 bool 的显式转换,使您能够在条件语句中直接使用其实例“t”。然而,这种显式转换提出了一个问题:“t”在哪里可以在不进行强制转换的情况下用作 bool?上下文转换场景C 标准指定了四种值可以根据上下文转换为 bool 的主要场景:语句:if、w...
    编程 发布于2024-11-15
  • 如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 识别今天生日的用户使用 MySQL 确定今天是否是用户的生日涉及查找生日匹配的所有行今天的日期。这可以通过一个简单的 MySQL 查询来实现,该查询将存储为 UNIX 时间戳的生日与今天的日期进行比较。以下 SQL 查询将获取今天有生日的所有用户: FROM USERS ...
    编程 发布于2024-11-15
  • 如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    MySQL配置不正确:相对路径的问题在Django中运行python manage.py runserver时,可能会遇到以下错误:ImproperlyConfigured: Error loading MySQLdb module: dlopen(/Library/Python/2.7/site-...
    编程 发布于2024-11-15
  • 在 Go 中使用 WebSocket 进行实时通信
    在 Go 中使用 WebSocket 进行实时通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    编程 发布于2024-11-15
  • Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta:列偏移的删除和恢复Bootstrap 4 在其 Beta 1 版本中引入了重大更改柱子偏移了。然而,随着 Beta 2 的后续发布,这些变化已经逆转。从 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    编程 发布于2024-11-15
  • 大批
    大批
    方法是可以在对象上调用的 fns 数组是对象,因此它们在 JS 中也有方法。 slice(begin):将数组的一部分提取到新数组中,而不改变原始数组。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index p...
    编程 发布于2024-11-15
  • **如何在不禁用索引的情况下优化 InnoDB 中的批量插入?**
    **如何在不禁用索引的情况下优化 InnoDB 中的批量插入?**
    禁用 InnoDB 中优化批量插入的索引在尝试禁用 InnoDB 表中的索引以增强批量插入性能时,您可能会遇到由于 InnoDB 存储引擎中缺少此功能而发出警告。以下是实现目标的替代策略:MySQL 参考建议:根据 MySQL 文档的建议,考虑使用以下命令:SET 自动提交=0;SET unique...
    编程 发布于2024-11-15
  • 如何使用命令式方法更新 React 中的嵌套状态?
    如何使用命令式方法更新 React 中的嵌套状态?
    更新嵌套状态的命令式方法在 React 中,状态更新是不可变的。这意味着要更新嵌套对象或数组,您不能简单地修改其属性并期望更改反映在 UI 中。相反,您需要创建一个包含更新值的新对象或数组,然后将其传递给 setState。考虑以下示例,其中我们要更新对象中索引 1 处的对象的 name 属性存储在...
    编程 发布于2024-11-14
  • 原子变量有哪些不同的内存排序模型?
    原子变量有哪些不同的内存排序模型?
    理解内存排序的含义原子变量提供安全的内存访问和跨线程同步。了解不同的内存顺序对于有效利用它们至关重要。轻松:无内存同步。可能重新排序的优化操作读取和写入。顺序一致 (seq_cst):最严格的排序。防止对周围的任何内存操作进行重新排序原子操作。确保所有线程的内存访问一致。获取/释放:宽松之间的混合和...
    编程 发布于2024-11-14
  • 为什么在 For 循环中放错 Return 语句会影响输入循环?
    为什么在 For 循环中放错 Return 语句会影响输入循环?
    For循环中返回语句错位在你的作业中,你遇到了一个问题,程序只允许输入一只宠物,尽管瞄准三个。这个问题源于 make_list 函数中 return 语句的定位。在 for 循环中,return 语句在到达函数时立即终止函数的执行。在提供的代码中,return 语句放置在循环内部,导致函数在第一次迭...
    编程 发布于2024-11-14
  • 如何防止用户关闭 Bootstrap 模式?
    如何防止用户关闭 Bootstrap 模式?
    禁用用户启动的 Bootstrap 模态退出您可以通过单击 Bootstrap 模态区域外部来阻止用户关闭 Bootstrap 模态。这在您想要强制用户在继续操作之前与特定模态内容交互的情况下非常有用。禁用模态背景点击关闭默认情况下,用户可以通过单击模式窗口之外的任意位置来关闭模式。要禁用此行为:在...
    编程 发布于2024-11-14
  • 如何在 Python 中将嵌套列表导出到 CSV 文件?
    如何在 Python 中将嵌套列表导出到 CSV 文件?
    在Python中将嵌套列表导出到CSV文件将嵌套列表(其中每个内部列表包含不同类型的元素)写入CSV文件可以在 Python 中处理数据时这是一项常见任务。以下是应对这一挑战的方法:Python 的 csv 模块提供了处理 CSV 操作的便捷方法。要将列表的列表(例如 a = [[1.2,'...
    编程 发布于2024-11-14
  • 如何高效提取Go Slice的最后一个元素?
    如何高效提取Go Slice的最后一个元素?
    Go 提取切片最后一个元素的最佳方法在 Go 中使用切片时,有效操作元素至关重要。一个常见的任务是提取最后一个元素,这可以通过多种方法来实现。现有解决方案的缺点使用切片提供的解决方案[len(slice)-1 :][0] 看起来很麻烦并且涉及不必要的复杂性。它返回一个仅包含最后一个元素的切片,然后使...
    编程 发布于2024-11-14
  • 为什么我的 JavaScript 事件在动态元素追加后没有触发?
    为什么我的 JavaScript 事件在动态元素追加后没有触发?
    动态元素追加后 JavaScript 事件未触发您遇到了向 DOM 追加新元素后 JavaScript 事件未触发的问题。这是因为 jQuery 仅识别页面加载期间最初运行时存在的元素。要解决此问题,您需要使用事件委托来捕获动态元素中的事件。事件委托涉及捕获页面加载期间已经存在的 DOM 中更高级别...
    编程 发布于2024-11-14

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

Copyright© 2022 湘ICP备2022001581号-3