代码之家  ›  专栏  ›  技术社区  ›  pmlk

烧瓶:可以创建自定义302(重定向)页面吗?

  •  1
  • pmlk  · 技术社区  · 7 年前

    在单元测试期间,烧瓶应用程序I首先意外地忽略了 follow_redirects=True 参数,导致以下测试失败:

    from unittest import TestCase
    class TestFlask(TestCase):
        def test_settings(self):
            # user not logged in
            r = self.app.get("/user/settings", follow_redirects=False)
            data = r.data.decode('utf-8')
            self.assertIn("Sign In", data)
    

    对于此页面(/用户/设置),用户需要登录,并且通常会重定向到包含“登录”字样的登录页面。具有 follow_redirects=False 一、 当然,获取 AssertionError (请注意自动生成的HTML):

    AssertionError: 'Sign In' not found in '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">\n<title>Redirecting...</title>\n<h1>Redirecting...</h1>\n<p>You should be redirected automatically to target URL: <a href="/user/login?next=%2Fuser%2Fsettings">/user/login?next=%2Fuser%2Fsettings</a>.  If not click the link.'
    

    问题

    如何自定义由302重定向生成的HTML,而不遵循该重定向?

    我试过的

    from flask import Flask
    app = Flask(__name__)
    # ...
    @app.errorhandler(404)
    def page_not_found(e):
        return "page not found, {}".format(e)
    
    @app.errorhandler(302)
    def redirect(e):
        return "redirecting... {}".format(e)
    

    采用与自定义404页面相同的方法会导致 KeyError: 302 启动web服务器时。我知道302并不表示错误,因此,尝试 errorhandler 注定要失败。然而,我没有找到任何选择。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Community CDub    3 年前

    RFC 7231 :

    服务器的响应负载通常包含一个简短的超文本注释,其中包含指向不同URI的超链接。

    但实际上,大多数用户代理完全忽略了重定向负载。当浏览器遇到 Location 它立即开始重定向到新页面,因此302响应的有效负载永远不会呈现。

    如果您关心非浏览器用户代理在未跟踪重定向上的行为(为什么?)您可以像平常一样构建响应(例如使用 flask.render_template )并手动设置 response.status = 302 response.headers['Location'] = '/path/to/redirect/to' ,而不是使用 flask.redirect 助手函数。如果你发现自己一直在做这类事情,你可以定义自己 redirect 函数,或者您可以编写一个Werkzeug中间件来为您转换重定向响应。