• 系列其他内容

    1. docker快速创建轻量级的可移植的容器
    2. docker&flask快速构建服务接口✓
    3. docker&uwsgi高性能WSGI服务器生产部署必备
    4. docker&gunicorn高性能WSGI服务器生产部署必备
    5. docker&nginx&gunicorn实现负载均衡
    6. docker&ngxtop并实时解析nginx日志
    7. docker&supervisor监控你的服务
    8. docker&pyinstaller两步法构建小体积容器
    9. locust对你的服务做高并发测试
    10. 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创建容器

  1. 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")
  1. 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"]
  1. 为了测试方便我们特意设置

    • 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快速构建服务接口(二)的更多相关文章

  1. C#二次开发BIMFACE系列61 File Management文件管理服务接口二次开发及实战详解

    系列目录     [已更新最新开发文章,点击查看详细] 在我的博客<C#二次开发BIMFACE系列61 File Management文件管理服务接口二次开发及实战详解>最后列出了 Fil ...

  2. [phvia/dkc] Docker Compose 快速构建(LNMP+Node)运行环境

    快速构建(LNMP+Node)运行环境. dkc 在此作为 docker-compose 的缩写,你可以理解为 alias dkc=docker-compose 准备 安装 docker 选择1) 从 ...

  3. 使用 Docker Compose 快速构建 TiDB 集群

    本文档介绍如何在单机上通过 Docker Compose 快速一键部署一套 TiDB 测试集群.Docker Compose 可以通过一个 YAML 文件定义多个容器的应用服务,然后一键启动或停止. ...

  4. HttpServerProvider实现http服务接口(一)

    啥也不说了,直接上代码,简单的示例. 服务端代码: package dyan.server; import java.io.BufferedReader; import java.io.IOExcep ...

  5. Docker搭建disconf环境,三部曲之二:本地快速构建disconf镜像

    Docker下的disconf实战全文链接 <Docker搭建disconf环境,三部曲之一:极速搭建disconf>: <Docker搭建disconf环境,三部曲之二:本地快速构 ...

  6. Docker从入门到掉坑(二):基于Docker构建SpringBoot微服务

    本篇为Docker从入门到掉坑第二篇:基于Docker构建SpringBoot微服务,没有看过上一篇的最好读过 Docker 从入门到掉坑 之后,阅读本篇. 在之前的文章里面介绍了如何基于docker ...

  7. ASP.NET Core WebApi构建API接口服务实战演练

    一.ASP.NET Core WebApi课程介绍 人生苦短,我用.NET Core!提到Api接口,一般会想到以前用到的WebService和WCF服务,这三个技术都是用来创建服务接口,只不过Web ...

  8. ASP.NET WebAPI构建API接口服务实战演练

    一.课程介绍 一.王小二和他领导的第一次故事 有一天王小二和往常一下去上早班,刚吃完早餐刚一打开电脑没一会儿.王小二的领导宋大宝走到他的面前,我们现在的系统需要提供服务给其他内部业务系统,我看你平时喜 ...

  9. 使用 Docker 和 Nginx 打造高性能的二维码服务

    使用 Docker 和 Nginx 打造高性能的二维码服务 本文将演示如何使用 Docker 完整打造一个基于 Nginx 的高性能二维码服务,以及对整个服务镜像进行优化的方法.如果你的网络状况良好, ...

随机推荐

  1. Java 反射(二)运行时获取类的信息

    目录 一.获得类的运行时结构 1. 获得类的名字 2. 获得类的属性 获取属性列表 获取指定属性 3. 获取类的方法 获得类的方法列表 获得指定方法 4. 获得的构造器 获得构造器列表 获得指定构造器 ...

  2. Android NDK 直播推流与引流

    本篇介绍一下直播技术中推流与引流的简单实现. 1.流媒体服务器测试 首先利用快直播 app (其他支持 RTMP 推流与引流的 app 亦可)和 ffplay.exe 对流媒体服务器进行测试. 快直播 ...

  3. .NetCore+Envoy+Id4+Dapr+EFCore 构建微服务之Envoy

    .NetCore比较流行的微服务应该时是用Ocelot的方式构建微服务,纯配置化,开发量也比较小.但是做过一些项目之后发现这个方式不是很适合,首先它比较笨重,其次不支持gRpc和webSocket通信 ...

  4. [开源]C++实现控制台随机迷宫

    我全程使用TCHAR系列函数,亲测可以不改动代码兼容Unicode/ANSI开发环境,功能正常.大概有100行代码是来自网络的,我也做了改动,侵权请联系删除.本文作者szx0427,只发布于CSDN与 ...

  5. 列出文件夹中分级目录java

    package test; import java.io.File; public class exportFileName { public static void main(String[] ar ...

  6. Java 多线程与并发【知识点笔记】

    Java 多线程与并发[知识点笔记] Java多线程与并发 先说一下线程与进程的由来: 在初期的计算机,计算机只能串行执行任务,并且需要长时间的等待用户的输入才行 到了后来,出现了批处理,可以预先将用 ...

  7. Sqli-Labs less17-19

    less-17 前置基础知识: UPDATEXML (XML_document, XPath_string, new_value); 第一个参数:XML_document是String格式,为XML文 ...

  8. Django推导 安装等

    HTTP协议补充 四大特性: 基于请求响应 基于TCP/IP协议之上的应用层协议 无状态 不能保存用户信息(cookie,session,token) 短链接 请求数据格式: 请求首行(请求方式,ht ...

  9. SpringCloud升级之路2020.0.x版-20. 启动一个 Eureka Server 集群

    本系列代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford 我们的业务集群结构 ...

  10. noip14

    T1 考试假贪心,20pts,能摧毁就摧毁,不管前边已经摧毁的水晶. 正解: 首先肯定要离散化,然后考虑dp,设 \(dp_{i,j}\) 表示当前处理到了i,摧毁掉的水晶的a最小为j,则转移方程: ...