繁体   English   中英

python flask 从 http 重定向到 https

[英]python flask redirect to https from http

我有一个使用 python3.4 和 flask 构建的网站...我已经生成了自己的自签名证书,目前我正在通过本地主机测试我的网站。

我正在使用 python ssl 模块以及这个 flask 扩展名: https://github.com/ke.nethreitz/flask-sslify

context = ('my-cert.pem', 'my-key.pem')
app = Flask(__name__)
sslify = SSLify(app)

...

if __name__ == '__main__':
    app.debug = False
    app.run(
    host="127.0.0.1",
    port=int("5000"),
    ssl_context=context
)

但是,这似乎不起作用。 我查看了 sslify 源代码,这一行似乎不起作用

def init_app(self, app):
    """Configures the configured Flask app to enforce SSL."""
    app.before_request(self.redirect_to_ssl)
    app.after_request(self.set_hsts_header)

特别是 function 对 redirect_to_ssl 的调用(我在 redirect_to_ssl function 下添加了自己的打印语句,但我的语句从未打印过)

def redirect_to_ssl(self):
    print("THIS IS WORKING")
    """Redirect incoming requests to HTTPS."""
    Should we redirect?
    criteria = [
        request.is_secure,
        current_app.debug,
        request.headers.get('X-Forwarded-Proto', 'http') == 'https'
    ]

    if not any(criteria) and not self.skip:
        if request.url.startswith('http://'):
            url = request.url.replace('http://', 'https://', 1)
            code = 302
            if self.permanent:
                code = 301
            r = redirect(url, code=code)
            return r

我对 python 很陌生。有什么想法吗?

我有一个使用python3.4和flask的网站构建...我生成了自己的自签名证书,目前正在通过本地主机测试我的网站。

我正在使用python ssl模块以及此flask扩展名: https : //github.com/kennethreitz/flask-sslify

context = ('my-cert.pem', 'my-key.pem')
app = Flask(__name__)
sslify = SSLify(app)

...

if __name__ == '__main__':
    app.debug = False
    app.run(
    host="127.0.0.1",
    port=int("5000"),
    ssl_context=context
)

但是,这似乎不起作用。 我看了一下sslify源代码,这行似乎不起作用

def init_app(self, app):
    """Configures the configured Flask app to enforce SSL."""
    app.before_request(self.redirect_to_ssl)
    app.after_request(self.set_hsts_header)

特别是对redirect_to_ssl的函数调用(我在redirect_to_ssl函数下添加了自己的print语句,但从未打印过我的语句)

def redirect_to_ssl(self):
    print("THIS IS WORKING")
    """Redirect incoming requests to HTTPS."""
    Should we redirect?
    criteria = [
        request.is_secure,
        current_app.debug,
        request.headers.get('X-Forwarded-Proto', 'http') == 'https'
    ]

    if not any(criteria) and not self.skip:
        if request.url.startswith('http://'):
            url = request.url.replace('http://', 'https://', 1)
            code = 302
            if self.permanent:
                code = 301
            r = redirect(url, code=code)
            return r

我是python的新手。 有任何想法吗?

我有一个使用python3.4和flask的网站构建...我生成了自己的自签名证书,目前正在通过本地主机测试我的网站。

我正在使用python ssl模块以及此flask扩展名: https : //github.com/kennethreitz/flask-sslify

context = ('my-cert.pem', 'my-key.pem')
app = Flask(__name__)
sslify = SSLify(app)

...

if __name__ == '__main__':
    app.debug = False
    app.run(
    host="127.0.0.1",
    port=int("5000"),
    ssl_context=context
)

但是,这似乎不起作用。 我看了一下sslify源代码,这行似乎不起作用

def init_app(self, app):
    """Configures the configured Flask app to enforce SSL."""
    app.before_request(self.redirect_to_ssl)
    app.after_request(self.set_hsts_header)

特别是对redirect_to_ssl的函数调用(我在redirect_to_ssl函数下添加了自己的print语句,但从未打印过我的语句)

def redirect_to_ssl(self):
    print("THIS IS WORKING")
    """Redirect incoming requests to HTTPS."""
    Should we redirect?
    criteria = [
        request.is_secure,
        current_app.debug,
        request.headers.get('X-Forwarded-Proto', 'http') == 'https'
    ]

    if not any(criteria) and not self.skip:
        if request.url.startswith('http://'):
            url = request.url.replace('http://', 'https://', 1)
            code = 302
            if self.permanent:
                code = 301
            r = redirect(url, code=code)
            return r

我是python的新手。 有任何想法吗?

我有一个使用python3.4和flask的网站构建...我生成了自己的自签名证书,目前正在通过本地主机测试我的网站。

我正在使用python ssl模块以及此flask扩展名: https : //github.com/kennethreitz/flask-sslify

context = ('my-cert.pem', 'my-key.pem')
app = Flask(__name__)
sslify = SSLify(app)

...

if __name__ == '__main__':
    app.debug = False
    app.run(
    host="127.0.0.1",
    port=int("5000"),
    ssl_context=context
)

但是,这似乎不起作用。 我看了一下sslify源代码,这行似乎不起作用

def init_app(self, app):
    """Configures the configured Flask app to enforce SSL."""
    app.before_request(self.redirect_to_ssl)
    app.after_request(self.set_hsts_header)

特别是对redirect_to_ssl的函数调用(我在redirect_to_ssl函数下添加了自己的print语句,但从未打印过我的语句)

def redirect_to_ssl(self):
    print("THIS IS WORKING")
    """Redirect incoming requests to HTTPS."""
    Should we redirect?
    criteria = [
        request.is_secure,
        current_app.debug,
        request.headers.get('X-Forwarded-Proto', 'http') == 'https'
    ]

    if not any(criteria) and not self.skip:
        if request.url.startswith('http://'):
            url = request.url.replace('http://', 'https://', 1)
            code = 302
            if self.permanent:
                code = 301
            r = redirect(url, code=code)
            return r

我是python的新手。 有任何想法吗?

我有一个使用python3.4和flask的网站构建...我生成了自己的自签名证书,目前正在通过本地主机测试我的网站。

我正在使用python ssl模块以及此flask扩展名: https : //github.com/kennethreitz/flask-sslify

context = ('my-cert.pem', 'my-key.pem')
app = Flask(__name__)
sslify = SSLify(app)

...

if __name__ == '__main__':
    app.debug = False
    app.run(
    host="127.0.0.1",
    port=int("5000"),
    ssl_context=context
)

但是,这似乎不起作用。 我看了一下sslify源代码,这行似乎不起作用

def init_app(self, app):
    """Configures the configured Flask app to enforce SSL."""
    app.before_request(self.redirect_to_ssl)
    app.after_request(self.set_hsts_header)

特别是对redirect_to_ssl的函数调用(我在redirect_to_ssl函数下添加了自己的print语句,但从未打印过我的语句)

def redirect_to_ssl(self):
    print("THIS IS WORKING")
    """Redirect incoming requests to HTTPS."""
    Should we redirect?
    criteria = [
        request.is_secure,
        current_app.debug,
        request.headers.get('X-Forwarded-Proto', 'http') == 'https'
    ]

    if not any(criteria) and not self.skip:
        if request.url.startswith('http://'):
            url = request.url.replace('http://', 'https://', 1)
            code = 302
            if self.permanent:
                code = 301
            r = redirect(url, code=code)
            return r

我是python的新手。 有任何想法吗?

我有一个使用python3.4和flask的网站构建...我生成了自己的自签名证书,目前正在通过本地主机测试我的网站。

我正在使用python ssl模块以及此flask扩展名: https : //github.com/kennethreitz/flask-sslify

context = ('my-cert.pem', 'my-key.pem')
app = Flask(__name__)
sslify = SSLify(app)

...

if __name__ == '__main__':
    app.debug = False
    app.run(
    host="127.0.0.1",
    port=int("5000"),
    ssl_context=context
)

但是,这似乎不起作用。 我看了一下sslify源代码,这行似乎不起作用

def init_app(self, app):
    """Configures the configured Flask app to enforce SSL."""
    app.before_request(self.redirect_to_ssl)
    app.after_request(self.set_hsts_header)

特别是对redirect_to_ssl的函数调用(我在redirect_to_ssl函数下添加了自己的print语句,但从未打印过我的语句)

def redirect_to_ssl(self):
    print("THIS IS WORKING")
    """Redirect incoming requests to HTTPS."""
    Should we redirect?
    criteria = [
        request.is_secure,
        current_app.debug,
        request.headers.get('X-Forwarded-Proto', 'http') == 'https'
    ]

    if not any(criteria) and not self.skip:
        if request.url.startswith('http://'):
            url = request.url.replace('http://', 'https://', 1)
            code = 302
            if self.permanent:
                code = 301
            r = redirect(url, code=code)
            return r

我是python的新手。 有任何想法吗?

我有一个使用python3.4和flask的网站构建...我生成了自己的自签名证书,目前正在通过本地主机测试我的网站。

我正在使用python ssl模块以及此flask扩展名: https : //github.com/kennethreitz/flask-sslify

context = ('my-cert.pem', 'my-key.pem')
app = Flask(__name__)
sslify = SSLify(app)

...

if __name__ == '__main__':
    app.debug = False
    app.run(
    host="127.0.0.1",
    port=int("5000"),
    ssl_context=context
)

但是,这似乎不起作用。 我看了一下sslify源代码,这行似乎不起作用

def init_app(self, app):
    """Configures the configured Flask app to enforce SSL."""
    app.before_request(self.redirect_to_ssl)
    app.after_request(self.set_hsts_header)

特别是对redirect_to_ssl的函数调用(我在redirect_to_ssl函数下添加了自己的print语句,但从未打印过我的语句)

def redirect_to_ssl(self):
    print("THIS IS WORKING")
    """Redirect incoming requests to HTTPS."""
    Should we redirect?
    criteria = [
        request.is_secure,
        current_app.debug,
        request.headers.get('X-Forwarded-Proto', 'http') == 'https'
    ]

    if not any(criteria) and not self.skip:
        if request.url.startswith('http://'):
            url = request.url.replace('http://', 'https://', 1)
            code = 302
            if self.permanent:
                code = 301
            r = redirect(url, code=code)
            return r

我是python的新手。 有任何想法吗?

我有一个使用python3.4和flask的网站构建...我生成了自己的自签名证书,目前正在通过本地主机测试我的网站。

我正在使用python ssl模块以及此flask扩展名: https : //github.com/kennethreitz/flask-sslify

context = ('my-cert.pem', 'my-key.pem')
app = Flask(__name__)
sslify = SSLify(app)

...

if __name__ == '__main__':
    app.debug = False
    app.run(
    host="127.0.0.1",
    port=int("5000"),
    ssl_context=context
)

但是,这似乎不起作用。 我看了一下sslify源代码,这行似乎不起作用

def init_app(self, app):
    """Configures the configured Flask app to enforce SSL."""
    app.before_request(self.redirect_to_ssl)
    app.after_request(self.set_hsts_header)

特别是对redirect_to_ssl的函数调用(我在redirect_to_ssl函数下添加了自己的print语句,但从未打印过我的语句)

def redirect_to_ssl(self):
    print("THIS IS WORKING")
    """Redirect incoming requests to HTTPS."""
    Should we redirect?
    criteria = [
        request.is_secure,
        current_app.debug,
        request.headers.get('X-Forwarded-Proto', 'http') == 'https'
    ]

    if not any(criteria) and not self.skip:
        if request.url.startswith('http://'):
            url = request.url.replace('http://', 'https://', 1)
            code = 302
            if self.permanent:
                code = 301
            r = redirect(url, code=code)
            return r

我是python的新手。 有任何想法吗?

我有一个使用python3.4和flask的网站构建...我生成了自己的自签名证书,目前正在通过本地主机测试我的网站。

我正在使用python ssl模块以及此flask扩展名: https : //github.com/kennethreitz/flask-sslify

context = ('my-cert.pem', 'my-key.pem')
app = Flask(__name__)
sslify = SSLify(app)

...

if __name__ == '__main__':
    app.debug = False
    app.run(
    host="127.0.0.1",
    port=int("5000"),
    ssl_context=context
)

但是,这似乎不起作用。 我看了一下sslify源代码,这行似乎不起作用

def init_app(self, app):
    """Configures the configured Flask app to enforce SSL."""
    app.before_request(self.redirect_to_ssl)
    app.after_request(self.set_hsts_header)

特别是对redirect_to_ssl的函数调用(我在redirect_to_ssl函数下添加了自己的print语句,但从未打印过我的语句)

def redirect_to_ssl(self):
    print("THIS IS WORKING")
    """Redirect incoming requests to HTTPS."""
    Should we redirect?
    criteria = [
        request.is_secure,
        current_app.debug,
        request.headers.get('X-Forwarded-Proto', 'http') == 'https'
    ]

    if not any(criteria) and not self.skip:
        if request.url.startswith('http://'):
            url = request.url.replace('http://', 'https://', 1)
            code = 302
            if self.permanent:
                code = 301
            r = redirect(url, code=code)
            return r

我是python的新手。 有任何想法吗?

我有一个使用python3.4和flask的网站构建...我生成了自己的自签名证书,目前正在通过本地主机测试我的网站。

我正在使用python ssl模块以及此flask扩展名: https : //github.com/kennethreitz/flask-sslify

context = ('my-cert.pem', 'my-key.pem')
app = Flask(__name__)
sslify = SSLify(app)

...

if __name__ == '__main__':
    app.debug = False
    app.run(
    host="127.0.0.1",
    port=int("5000"),
    ssl_context=context
)

但是,这似乎不起作用。 我看了一下sslify源代码,这行似乎不起作用

def init_app(self, app):
    """Configures the configured Flask app to enforce SSL."""
    app.before_request(self.redirect_to_ssl)
    app.after_request(self.set_hsts_header)

特别是对redirect_to_ssl的函数调用(我在redirect_to_ssl函数下添加了自己的print语句,但从未打印过我的语句)

def redirect_to_ssl(self):
    print("THIS IS WORKING")
    """Redirect incoming requests to HTTPS."""
    Should we redirect?
    criteria = [
        request.is_secure,
        current_app.debug,
        request.headers.get('X-Forwarded-Proto', 'http') == 'https'
    ]

    if not any(criteria) and not self.skip:
        if request.url.startswith('http://'):
            url = request.url.replace('http://', 'https://', 1)
            code = 302
            if self.permanent:
                code = 301
            r = redirect(url, code=code)
            return r

我是python的新手。 有任何想法吗?

在应用引擎 flex 上,添加:

from werkzeug.middleware.proxy_fix import ProxyFix

def create_app(config=None):

    app = Flask(__name__)
    app.wsgi_app = ProxyFix(app.wsgi_app)

除了以下解决方案:

@app.before_request
def before_request():
    if not request.is_secure:
        url = request.url.replace('http://', 'https://', 1)
        code = 301
        return redirect(url, code=code)

否则,它会导致无限重定向,因为 SSL 在代理后面展开,但在标头中注明。

利用:

app.run(port="443")

当端口为 443 或 8443 时,所有现代浏览器都会自动使用 HTTPS。

我有一个使用python3.4和flask的网站构建...我生成了自己的自签名证书,目前正在通过本地主机测试我的网站。

我正在使用python ssl模块以及此flask扩展名: https : //github.com/kennethreitz/flask-sslify

context = ('my-cert.pem', 'my-key.pem')
app = Flask(__name__)
sslify = SSLify(app)

...

if __name__ == '__main__':
    app.debug = False
    app.run(
    host="127.0.0.1",
    port=int("5000"),
    ssl_context=context
)

但是,这似乎不起作用。 我看了一下sslify源代码,这行似乎不起作用

def init_app(self, app):
    """Configures the configured Flask app to enforce SSL."""
    app.before_request(self.redirect_to_ssl)
    app.after_request(self.set_hsts_header)

特别是对redirect_to_ssl的函数调用(我在redirect_to_ssl函数下添加了自己的print语句,但从未打印过我的语句)

def redirect_to_ssl(self):
    print("THIS IS WORKING")
    """Redirect incoming requests to HTTPS."""
    Should we redirect?
    criteria = [
        request.is_secure,
        current_app.debug,
        request.headers.get('X-Forwarded-Proto', 'http') == 'https'
    ]

    if not any(criteria) and not self.skip:
        if request.url.startswith('http://'):
            url = request.url.replace('http://', 'https://', 1)
            code = 302
            if self.permanent:
                code = 301
            r = redirect(url, code=code)
            return r

我是python的新手。 有任何想法吗?

我有一个使用python3.4和flask的网站构建...我生成了自己的自签名证书,目前正在通过本地主机测试我的网站。

我正在使用python ssl模块以及此flask扩展名: https : //github.com/kennethreitz/flask-sslify

context = ('my-cert.pem', 'my-key.pem')
app = Flask(__name__)
sslify = SSLify(app)

...

if __name__ == '__main__':
    app.debug = False
    app.run(
    host="127.0.0.1",
    port=int("5000"),
    ssl_context=context
)

但是,这似乎不起作用。 我看了一下sslify源代码,这行似乎不起作用

def init_app(self, app):
    """Configures the configured Flask app to enforce SSL."""
    app.before_request(self.redirect_to_ssl)
    app.after_request(self.set_hsts_header)

特别是对redirect_to_ssl的函数调用(我在redirect_to_ssl函数下添加了自己的print语句,但从未打印过我的语句)

def redirect_to_ssl(self):
    print("THIS IS WORKING")
    """Redirect incoming requests to HTTPS."""
    Should we redirect?
    criteria = [
        request.is_secure,
        current_app.debug,
        request.headers.get('X-Forwarded-Proto', 'http') == 'https'
    ]

    if not any(criteria) and not self.skip:
        if request.url.startswith('http://'):
            url = request.url.replace('http://', 'https://', 1)
            code = 302
            if self.permanent:
                code = 301
            r = redirect(url, code=code)
            return r

我是python的新手。 有任何想法吗?

我有一个使用python3.4和flask的网站构建...我生成了自己的自签名证书,目前正在通过本地主机测试我的网站。

我正在使用python ssl模块以及此flask扩展名: https : //github.com/kennethreitz/flask-sslify

context = ('my-cert.pem', 'my-key.pem')
app = Flask(__name__)
sslify = SSLify(app)

...

if __name__ == '__main__':
    app.debug = False
    app.run(
    host="127.0.0.1",
    port=int("5000"),
    ssl_context=context
)

但是,这似乎不起作用。 我看了一下sslify源代码,这行似乎不起作用

def init_app(self, app):
    """Configures the configured Flask app to enforce SSL."""
    app.before_request(self.redirect_to_ssl)
    app.after_request(self.set_hsts_header)

特别是对redirect_to_ssl的函数调用(我在redirect_to_ssl函数下添加了自己的print语句,但从未打印过我的语句)

def redirect_to_ssl(self):
    print("THIS IS WORKING")
    """Redirect incoming requests to HTTPS."""
    Should we redirect?
    criteria = [
        request.is_secure,
        current_app.debug,
        request.headers.get('X-Forwarded-Proto', 'http') == 'https'
    ]

    if not any(criteria) and not self.skip:
        if request.url.startswith('http://'):
            url = request.url.replace('http://', 'https://', 1)
            code = 302
            if self.permanent:
                code = 301
            r = redirect(url, code=code)
            return r

我是python的新手。 有任何想法吗?

在我的情况下,Flask 应用程序位于 AWS API Gateway 后面,@app.before_request 的解决方案给了我永久重定向。

以下简单的解决方案终于奏效了:

@app.after_request
def adjust_response(response):
    ....
    if response.location:
        if app.env != "development":
            response.location = response.location.replace("http://", "https://", 1)
    return response

如果出于安全原因希望所有请求都为 HTTPS,则正确的方法称为HSTS ,在Flask Docs 中提到了如何做到这一点:

response.headers['Strict-Transport-Security'] = 'max-age=31536000; includeSubDomains'

https://flask.palletsprojects.com/en/2.0.x/security/#http-strict-transport-security-hsts

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM