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 的高性能二维码服务,以及对整个服务镜像进行优化的方法.如果你的网络状况良好, ...
随机推荐
- Spring Cloud分区发布实践(5)--定制ServiceInstanceListSupplier
现在我们简单地来定制二个 ServiceInstanceListSupplier, 都是zone-preference的变种. 为了方便, 我重新调整了一下项目的结构, 把一些公用的类移动到hello ...
- 为ScrollView增加圆角的三种方式,及自定义属性【在Linearlayout中新增ScrollView支持滚动 后续】
获取圆角的几种方案如下:方案一:通过shape来实现,给scrollView增加背景来实现方案二:通过自定义ScrollView,还要自定义属性,在dispatchDraw中不停的裁剪方案三:用And ...
- 数据库技术中的触发器(Trigger)——和ContentObserver功能类似
刚总结过ContentObserver的作用和特点,顺便总结下数据库技术中的触发器(Trigger),触 发 器 分 为 表 触 发 器 . 行 触 发 器
- 正则表达式-固定XML格式提取内容
(?<=(<(?<a>([A-Za-z]*?))>)).*?(?=(</\k<a>>))
- 针对不同场景的Python合并多个Excel方法
大家好,我是辰哥~ 在辰哥看来,技术能够减少繁琐工作带来的枯燥,技术+实际=方便.最近辰哥也是在弄excel文件的时候发现手动去整理有点繁琐枯燥,想着技术可以代替我去处理这部分繁琐的工作那何乐而不为呢 ...
- Java基础——逻辑运算符、位运算符
逻辑运算符.位运算符.三元运算符 逻辑运算符 public class Demon05 { public static void main(String[] args) { ...
- 字节跳动Android春招,三轮面试,夺命连环问,心态崩了
我是春招参加字节面试的,现在已经入职俩月啦,当时没有及时记录下来拖到现在...我尽量回忆当时的内容希望能帮到大家. 投的部门是深圳字节影像,不得不说这个部门的效率,上午投下午就接到hr的电话约面试时间 ...
- 35岁Android程序员被阿里辞退,生活压力太大痛哭,中年危机如何自救?
多数人都喜欢安逸的生活,尤其是随着年龄的增长,很多人都希望工作和生活趋于稳定,不愿意再让生活有很大的变动.可是,当达到一定的年龄时,危机还是存在的. 之前有一位阿里员工在脉脉上,晒出了自己被辞退的经历 ...
- VRRP协议原理与配置
一.VRRP协议概述 1.1.VRRP协议基本概念 局域网中的用户终端通常采用配置一个默认网关的形式访问外部网络,如果此时默认网关设备发生故障,将中断所有用户终端的网络访问,这很可能会给用户带来不可预 ...
- Vue系列-01-基础语法
vue.js文件 # https://blog-static.cnblogs.com/files/lichengguo/vue.js # 下载该文件,保存的路径为代码同级目录 js/vue.js 文件 ...