在 Django/Flask 开发服务器上使用 HTTPS


Posted in Python onJuly 03, 2014

使用 Django 或 Flask 这种框架开发 web app 的时候一般都会用内建服务器开发和调试程序,等程序完成后再移交到生产环境部署。问题是这些内建服务器通常都不支持 HTTPS,我们想在开发的时候就能够使用和测试 HTTPS,不想还没测试就部署到生产环境,所以我们需要内建服务器能支持 HTTPS.

这个问题可以通过一个外部程序 stunnel 来解决,stunnel 的作用是通过 OpenSSL 库对 TCP 会话进行加密,建立起一个安全通道,保护没有加密功能或未加密的程序。其主要功能有两个:

接收未加密的数据流,进行 SSL 加密,然后把加密后的数据流通过网络发送出去;
对已加密的数据流进行解密,并将解密后的数据流其通过网络发送给另一个程序。
了解了 stunnel 的功能后我们很容易就能想到利用 stunnel 建立一个 SSL 加密通道绑定到 Django/Flask 内建服务器上,stunnel 启动 443 端口接受用户的 HTTPS 请求,解密后发送给内建服务器的 8000 端口处理,内建服务器处理完后发送数据给 stunnel 然后加密后返回给浏览器用户。

好吧,上面说了一堆貌似很复杂,其实使用 stunnel 很简单。

在 Django/Flask 开发服务器所在的服务器上安装 stunnel:

# yum install stunnel(在 CentOS 上)

或者

$ sudo apt-get install stunnel4(在 Ubuntu 上)

如果没有购买 SSL 证书的话自己生成一个,对了,这个文件的权限必须是 600 哦:

# openssl req -new -x509 -days 365 -nodes -out vpsee.pem -keyout vpsee.pem

# chmod 600 vpsee.pem

新建一个配置文件叫做 https,然后用 stunnel 执行这个配置文件,启动 443 端口连接到 Django/Flask 内建服务器的 8000 端口:

# vi https
pid =
cert = vpsee.pem
debug = 7
foreground = yes

[https]
accept = 443
connect = 8000

# stunnel https

启动 Django 内建服务器绑定到上面配置文件提到的 8000 端口:

# HTTPS=1 python manage.py runserver 0.0.0.0:8000
启动 Flask 内建服务器不需要特别的,改变端口到 8000,按照正常的方式启动就可以了:

# vi run.py
#!flask/bin/python
from app import app
app.run(host='0.0.0.0', port=8000, debug = True)

# ./run.py
 * Running on http://0.0.0.0:8000/
 * Restarting with reloader
Python 相关文章推荐
Ubuntu 14.04+Django 1.7.1+Nginx+uwsgi部署教程
Nov 18 Python
Python 冒泡,选择,插入排序使用实例
Feb 05 Python
MAC中PyCharm设置python3解释器
Dec 15 Python
Python、 Pycharm、Django安装详细教程(图文)
Apr 12 Python
浅谈Python3 numpy.ptp()最大值与最小值的差
Aug 24 Python
pytorch制作自己的LMDB数据操作示例
Dec 18 Python
Python hashlib模块实例使用详解
Dec 24 Python
解决import tensorflow as tf 出错的原因
Apr 16 Python
tensorflow图像裁剪进行数据增强操作
Jun 30 Python
python小程序之飘落的银杏
Apr 17 Python
Python获取指定日期是"星期几"的6种方法
Mar 13 Python
在NumPy中深拷贝和浅拷贝相关操作的定义和背后的原理
Apr 14 Python
采用python实现简单QQ单用户机器人的方法
Jul 03 #Python
centos系统升级python 2.7.3
Jul 03 #Python
python实现定制交互式命令行的方法
Jul 03 #Python
小结Python用fork来创建子进程注意事项
Jul 03 #Python
在Windows8上的搭建Python和Django环境
Jul 03 #Python
Win7上搭建Cocos2d-x 3.1.1开发环境
Jul 03 #Python
盘点提高 Python 代码效率的方法
Jul 03 #Python
You might like
PHP在Web开发领域的优势
2006/10/09 PHP
用PHP实现递归循环每一个目录
2010/08/08 PHP
浅谈PHP接收POST数据方式
2015/06/05 PHP
利用PHP如何实现Socket服务器
2015/09/23 PHP
PHP实现QQ快速登录的方法
2016/09/28 PHP
Javascript写了一个清除“logo1_.exe”的杀毒工具(可扫描目录)
2007/02/09 Javascript
JavaScript获得选中文本内容的方法
2008/12/02 Javascript
再谈javascript图片预加载技术(详细演示)
2011/03/12 Javascript
javascript中2个感叹号的用法实例详解
2014/09/04 Javascript
简单实现jQuery进度条轮播实例代码
2016/06/20 Javascript
详解Jquery 遍历数组之$().each方法与$.each()方法介绍
2017/01/09 Javascript
js以及jquery实现手风琴效果
2020/04/17 Javascript
EasyUI Datebox 日期验证之开始日期小于结束时间
2017/05/19 Javascript
深入浅析var,let,const的异同点
2018/08/07 Javascript
vue组件从开发到发布的实现步骤
2018/11/11 Javascript
关于layui导航栏不展示下拉列表的解决方法
2019/09/25 Javascript
jquery 时间戳转日期过程详解
2019/10/12 jQuery
微信小程序 wx:for 与 wx:for-items 与 wx:key的正确用法
2020/05/19 Javascript
ElementUI 修改默认样式的几种办法(小结)
2020/07/29 Javascript
Python的string模块中的Template类字符串模板用法
2016/06/27 Python
Python图片裁剪实例代码(如头像裁剪)
2017/06/21 Python
Python 3中print函数的使用方法总结
2017/08/08 Python
python-tkinter之按钮的使用,开关方法
2019/06/11 Python
Django框架静态文件使用/中间件/禁用ip功能实例详解
2019/07/22 Python
Pyinstaller 打包exe教程及问题解决
2019/08/16 Python
Django 对IP访问频率进行限制的例子
2019/08/30 Python
python多线程扫描端口(线程池)
2019/09/04 Python
Django基于Models定制Admin后台实现过程解析
2020/11/11 Python
python爬虫看看虎牙女主播中谁最“顶”步骤详解
2020/12/01 Python
python 操作excel表格的方法
2020/12/05 Python
高级3D打印市场:Gambody
2019/12/26 全球购物
美国滑板店:Tactics
2020/11/08 全球购物
幼儿园大班毕业教师寄语
2014/04/03 职场文书
本科毕业生求职自荐信
2014/04/09 职场文书
党内外群众意见范文
2015/06/02 职场文书
Python实现简单的猜单词
2021/06/15 Python