docker&flask快速构建服务接口(二)
系列其他内容
- docker快速创建轻量级的可移植的容器✓
- docker&flask快速构建服务接口✓
- docker&uwsgi高性能WSGI服务器生产部署必备
- docker&gunicorn高性能WSGI服务器生产部署必备
- docker&nginx&gunicorn实现负载均衡
- docker&ngxtop并实时解析nginx日志
- docker&supervisor监控你的服务
- docker&pyinstaller两步法构建小体积容器
- locust对你的服务做高并发测试
- postman热门的API调试工具
环境依赖
- 本教程是基于redhat linux服务器的
python: 3.8.3
click==8.0.1
Flask==2.0.1
Flask-Limiter==1.4
itsdangerous==2.0.1
Jinja2==3.0.1
limits==1.5.1
MarkupSafe==2.0.1
six==1.16.0
Werkzeug==2.0.1
WTForms==2.3.3
- 本文主要内容
- 包括docker部署flask服务、文件夹挂载、设置flask日志、设置参数验证部分、设置固定ip的请求次数限制、设置ip白名单。
docker&flask创建容器
- python文件
- 设置debug=True,当文件更新时,服务会自动重启
import flask, json
from flask import request
import platform
# 创建一个服务,把当前这个python文件当做一个服务
app = flask.Flask(__name__)
@app.route('/test', methods=['get'])
def login():
username = request.values.get('name')
pwd = request.values.get('pwd')
system = platform.system()
systemnode = platform.node()
system_info = "平台是{0} & 运行节点是{1}".format(system, systemnode)
if username and pwd:
if username=='xiaoming' and pwd=='111':
resu = {'code': 200, 'message': '登录成功', 'system':system_info}
return json.dumps(resu, ensure_ascii=False)
else:
resu = {'code': -1, 'message': '账号密码错误', 'system':system_info}
return json.dumps(resu, ensure_ascii=False)
else:
resu = {'code': 10001, 'message': '参数不能为空', 'system':system_info}
return json.dumps(resu, ensure_ascii=False)
if __name__ == '__main__':
app.run(debug=True, port=2222, host="0.0.0.0")
- Dockerfile文件
FROM python:3.8
WORKDIR /home/myfirstapi/
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
COPY . .
RUN pip install -r requirements.txt -q -i https://pypi.tuna.tsinghua.edu.cn/simple && \
rm -rf /var/cache/apk/*
expose 2222
CMD ["python3", "flask_test.py"]
- 为了测试方便我们特意设置
- python脚本中debug=True,当脚本更新时服务自动重启
- docker容器设置数据卷,使本地的更改可以自动同步到容器中。
# 构建名称为test/dockerflask,版本为1.0的镜像
docker build -t test/dockerflask:1.0 .
# 通过镜像test/api创建一个后台运行的容器,且映射端口2222,将本地文件夹/root/first_api/flask_api挂载到容器指定目录下
docker run -d -p 2222:2222 --name docker_flask_api -v /root/first_api/flask_api:/home/myfirstapi/ test/dockerflask:1.0
- 得到结果如下:

flask设置日志
可以参考python的logger库
def login():
...
app.logger.debug('this is a DEBUG message')
app.logger.info('this is an INFO message')
app.logger.warning('this is a WARNING message')
app.logger.error('this is an ERROR message')
app.logger.critical('this is a CRITICAL message')
得到结果如下

flask增加参数验证部分
设置验证部分
from wtforms.fields import simple
from wtforms import Form, StringField, IntegerField
from wtforms.validators import Length, Regexp, NumberRange, AnyOf, DataRequired
class parameters_validation(Form):
username = StringField(validators=[AnyOf(values = ["xiaoming", "laolitou"])])
pwd = StringField(validators = [DataRequired()
Length(max=4,min=2,message="the length of the pwd must between %(min)d and %(max)d"),
Regexp(regex="\d+",message="pwd must be start with numbers")],
) @app.route('/test', methods=['get'])
def login():
form = parameters_validation(request.args)
if form.validate():
username = form.username.data
pwd = form.pwd.data
...
else:
return jsonify(form.errors) if __name__ == '__main__':
app.run(debug=True, port=2222, host="0.0.0.0")
得到结果如下

flask增加ip限制部分
flask设置ip访问次数
from flask import Flask
from flask_limiter import Limiter
from flask_limiter.util import get_remote_address app = Flask(__name__)
limiter = Limiter(
app,
key_func=get_remote_address,
default_limits=["5 per day", "2 per hour"]
)
@app.route("/1times")
@limiter.limit("1 per day")
def slow():
return "每天只能访问1次" @app.route("/2times")
def fast():
return "每天能访问5次,一小时内只能访问2次" @app.route("/nolimits")
@limiter.exempt # 无访问速率限制
def ping():
return "访问无次数限制呀" if __name__ == '__main__':
app.run(debug=True, port=2222, host="0.0.0.0")
得到结果如下
- 有了这个,对外提供给包月服务的话,这个是不是就可以很容易的加上服务次数的限制了啦

- 有了这个,对外提供给包月服务的话,这个是不是就可以很容易的加上服务次数的限制了啦
flask设置ip白名单
- flask设置ip白名单,只针对部分ip提供服务
from flask import abort, Flask, render_template, request
ALLOWED_IPS = ['10.92', '10.91']
app = Flask(__name__)
@app.errorhandler(403)
def permission_error(e):
return "没权限呀没权限呀出现了403错误: %s"%e
@app.before_request
def limit_remote_addr():
client_ip = str(request.remote_addr)
valid = False
for ip in ALLOWED_IPS:
if client_ip.startswith(ip) or client_ip == ip:
valid = True
break
if not valid:
abort(403)
@app.route('/', methods = ['GET'])
def home():
return "Your IP: {}".format(request.remote_addr)
if __name__ == '__main__':
app.run(host='0.0.0.0', debug=True)
- 得到如下结果

后续
- 一般而言,我们正式提供一个服务是需要做负载均衡的,毕竟要考虑用户的使用体验;
- 在nginx做负载均衡的过程中,请求限制,ip白名单也都是可以配置的。
docker&flask快速构建服务接口(二)的更多相关文章
- C#二次开发BIMFACE系列61 File Management文件管理服务接口二次开发及实战详解
系列目录 [已更新最新开发文章,点击查看详细] 在我的博客<C#二次开发BIMFACE系列61 File Management文件管理服务接口二次开发及实战详解>最后列出了 Fil ...
- [phvia/dkc] Docker Compose 快速构建(LNMP+Node)运行环境
快速构建(LNMP+Node)运行环境. dkc 在此作为 docker-compose 的缩写,你可以理解为 alias dkc=docker-compose 准备 安装 docker 选择1) 从 ...
- 使用 Docker Compose 快速构建 TiDB 集群
本文档介绍如何在单机上通过 Docker Compose 快速一键部署一套 TiDB 测试集群.Docker Compose 可以通过一个 YAML 文件定义多个容器的应用服务,然后一键启动或停止. ...
- HttpServerProvider实现http服务接口(一)
啥也不说了,直接上代码,简单的示例. 服务端代码: package dyan.server; import java.io.BufferedReader; import java.io.IOExcep ...
- Docker搭建disconf环境,三部曲之二:本地快速构建disconf镜像
Docker下的disconf实战全文链接 <Docker搭建disconf环境,三部曲之一:极速搭建disconf>: <Docker搭建disconf环境,三部曲之二:本地快速构 ...
- Docker从入门到掉坑(二):基于Docker构建SpringBoot微服务
本篇为Docker从入门到掉坑第二篇:基于Docker构建SpringBoot微服务,没有看过上一篇的最好读过 Docker 从入门到掉坑 之后,阅读本篇. 在之前的文章里面介绍了如何基于docker ...
- ASP.NET Core WebApi构建API接口服务实战演练
一.ASP.NET Core WebApi课程介绍 人生苦短,我用.NET Core!提到Api接口,一般会想到以前用到的WebService和WCF服务,这三个技术都是用来创建服务接口,只不过Web ...
- ASP.NET WebAPI构建API接口服务实战演练
一.课程介绍 一.王小二和他领导的第一次故事 有一天王小二和往常一下去上早班,刚吃完早餐刚一打开电脑没一会儿.王小二的领导宋大宝走到他的面前,我们现在的系统需要提供服务给其他内部业务系统,我看你平时喜 ...
- 使用 Docker 和 Nginx 打造高性能的二维码服务
使用 Docker 和 Nginx 打造高性能的二维码服务 本文将演示如何使用 Docker 完整打造一个基于 Nginx 的高性能二维码服务,以及对整个服务镜像进行优化的方法.如果你的网络状况良好, ...
随机推荐
- oracle控制用户权限命令
ORACLE控制用户权限: 首先使用系统中的拥有DBA权限的账号(system)登录: 一.创建用户: 1.DBA使用creater user语句创建用户: --创建登录用户名为:user01,密码为 ...
- ssrf漏洞随笔
一.ssrf漏洞定义 SSRF漏洞:SSRF是一 种由攻击者构造请求,由服务端发起请求的安全漏洞.一般情况下,ssrf攻击的目标是外网无法访问的内部系统 SSRF漏洞( 服务器端请求伪造 )也被称为跨 ...
- Java异常01——捕获和抛出异常
捕获和抛出异常 异常处理五个关键字 try , catch , finally , throw , throws try catch finally(快捷键:选中要要监控的代码语句 快捷键: ctrl ...
- 刷到血赚!字节跳动内部出品:722页Android开发《360°全方面性能调优》学习手册首次外放,附项目实战!
前言 我们平时在使用软件的过程中是不是遇到过这样的情况:"这个 app 怎么还没下载完!"."太卡了吧!"."图片怎么还没加载出来!".&q ...
- VLAN-2 配置Trunk接口
一.实验拓扑图 二.实验编址 三.实验步骤 1.给对应的PC设置对应的IP和掩码还有接口,以及根据需要划分不同的vlan区域,再用文本标记出不同部门. 2.启动设备(全选) 3.首先用ping命令检查 ...
- Java MyEclipse:The type java.lang.CharSequence cannot be resolved. It is indirectly referen
从svn上下载项目后配置weblogic后启动报错: myeclipse The type java.lang.CharSequence cannot be resolved. It is indi ...
- Longhorn,企业级云原生容器分布式存储 - 监控(Prometheus+AlertManager+Grafana)
内容来源于官方 Longhorn 1.1.2 英文技术手册. 系列 Longhorn 是什么? Longhorn 企业级云原生容器分布式存储解决方案设计架构和概念 Longhorn 企业级云原生容器分 ...
- 题解 w
传送门 一直觉得有点后效性什么的,也不知道怎么写 这题什么时候再康一遍,第一次见这个样子的树形DP,是个树上带不定权边的DP(??? 这里能树形DP的原因好像是在这里所有子节点的状态都能表示出来 还有 ...
- Ubuntu完全卸载Docker步骤
Ubuntu完全卸载Docker步骤:https://www.jianshu.com/p/c03044dbeaaf
- Centos7上安装最新的nodejs
下载nodejs包 安装wget yum install -y wget 下载nodejs到/usr/local/nodejs/下 https://cdn.npm.taobao.org/dist/no ...