共计 1237 个字符,预计需要花费 4 分钟才能阅读完成。
回顾
通过前几篇文章的内容, 我们已经基于 Python 的 Flask 框架搭建了一个基本 Web 应用, ~/webapp/server.py 的代码如下
from flask import Flask
from flask.views import MethodView
app = Flask(__name__)
class IndexHandler(MethodView):
def __init__(self, name):
print(name)
def get(self):
return ‘It is a GET request’
def post(self):
return ‘It is a POST request’
if __name__ == ‘__main__’:
app.add_url_rule(‘/’, view_func=IndexHandler.as_view(‘index’))
context = (‘./server.cer’, ‘./server.key’)
app.run(port=443, host=’0.0.0.0′, debug=True, threaded=True, ssl_context=context)
此外, 我们还为其申请了公网 IP 和域名 www.awesome.com , 并且部署了 Let’s Encrypt 的 HTTPS 证书. 现在, 当我们在浏览器地址栏输入 https://www.awesome.com 即可访问我们的网站.
不过, 我们的网站目前还存在几个问题:
1. 无法访问 http://www.awesome.com
2. 每次都需要用户手动输入 https:// 前缀以制定 https 形式的访问
为此, 我们需要重新编写一个 server 并监听 80 端口, 并对所有请求返回一个 redirect 响应, 把所有 http 请求都重定向为 https 请求. 最后, 我们还将开启 HSTS, 方便用户、提高安全性的同时减少无效的访问.
监听 80 端口
考虑我们的目的只是为了进行重定向, 我们不如暂且撇开 Flask, 用 Python 自带的网络库写一个简单的 server, 把它当成一个练手的 demo.
结合文档 wsgiref, 我们可以写出如下代码
from wsgiref.util import setup_testing_defaults
from wsgiref.simple_server import make_server
def simple_app(environ, start_response):
status = ‘200 OK’
headers = [(‘Content-type’, ‘text/plain; charset=utf-8’)]
start_response(status, headers)
ret = [(“%s: %s\n” % (key, value)).encode(“utf-8″) for key, value in environ.items()]
return ret
with make_server(”, 80, simple_app) as httpd:
httpd.serve_forever()