• 系列其他内容

    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. 什么是软件的CLI安装

    Websoft9 在进行开源软件的集成与自动化安装研究过程中发现有些软件有CLI安装模式,例如Gitlab CLI版本.Ghost CLI.PHP CLI等,CLI安装是什么意思? CLI(Comma ...

  2. HCNA Routing&Switching之VLAN间路由

    前文我们了解了二层交换技术vlan相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15091491.html:今天我们来聊一聊不同VLAN间通信相关话题 ...

  3. ACM金牌选手讲解LeetCode算法《哈希》

    大家好,我是编程熊. 往期文章介绍了<线性表>中的数组.链表.栈.队列,以及单调栈和滑动窗口. ACM金牌选手讲解LeetCode算法<线性表> ACM金牌选手讲解LeetCo ...

  4. 自学linux——10.Linux的网络知识

    linux的网络知识 一.网络相关概述 1.网络的分类 局域网(LAN):在几百米到十几公里内办公楼群或校园内的计算机相互连接所构成的计算机网络 城域网(MAN):覆盖相距不远的几栋办公楼,也可以覆盖 ...

  5. CF559B Equivalent Strings TJ

    前言 题目传送门 正解:模拟,递归. 考试的 T4,还是想复杂了 qwq. 这题不要用 STL,容易 \(\texttt{TLE}\)!! 题意简述 翻译够简了. 对了给一下样例解释的翻译: 第一个样 ...

  6. Java流程控制03——选择结构

    选择结构 if单语句结构 我们很多时候要去判断一个东西是否可行,然后我们才去执行,这样一个过程我们用if语句来表示 语法  if(布尔表达式){ //如果布尔表达式结果为true将执行的语句 } if ...

  7. 使用脚本下载Gmail邮件附件

    以下脚本连接上我的Gmail帐号,将收件箱中2013年1月份的新语丝邮件的附件保存在当前目录的xys文件夹中. import imaplib import email import os dir_na ...

  8. minio设置永久访问链接

    1.通过minio分享的链接只能支持7天. 解决方案是设置对应的bucket 可通过路径直接访问.(必须通过minio client才能设置下载策略) wget https://dl.min.io/c ...

  9. Sqli-Labs less38-45

    less-38 前置基础知识:堆叠注入 参考链接:https://www.cnblogs.com/lcamry/p/5762905.html 实际上就是多条sql语句一起使用. 在38关源码中加入输出 ...

  10. 题解—P2511 [HAOI2008]木棍分割

    这道题第一眼直接一个二分板子把第一问解决掉,然后主要是统计方案. 其实这个方程还不算难推,只要推出来朴素 \(dp\) ,之后的一步一步也很顺理成章,所以这种题主要看能不能静下心来慢慢做. solut ...