A. 利用python的flask框架开发智能合约
开发智能合约的框架有很多,比如:
但我是一个pythoner,显然上述都不合适
3.6
ganache是以太坊的本地测试链
web3是一个用于和以太坊交互的python库。
flask的插件,可快速构建restful风格的api
flask的插件,用于序列化/反序列化
启动一个区块链,用于测试智能合约的发布
先查看本地的solidity版本是多少
使用solidity编写智能合约。
solidity是用于编写以太坊智能合约的语言。
编写user.sol文件
官方的版本中要连接 stringUtils 和 主文件 ,因为我是一个菜鸡,不知道怎么导入外部包,所以直接省掉了这部分操作。
合约部署成功以后(仅部署一次即可),然后可以通过flaskapi来做数据 “存”,“取” 操作。
B. FastAPI - 一款新型的 Python Web 框架(对比 Flask)
近日只是为了想尽办法为 Flask 实现 Swagger UI 文档功能,基本上要让 Flask 配合 Flasgger, 所以写了篇 Flask 应用集成 Swagger UI 。然而不断的 Google 过程中偶然间发现了 FastAPI 这么一款集成了 Swagger UI 的更新的 Python Web 框架。起初想要在标题中表达的意思大概是 Flask + Swagger = FastAPI, 后来发现 FastAPI 的闪亮点不仅如此,顺便找了些 Flask 与 FastAPI 对比的文章来,在文后附有链接。
本文不对 Flask 与 FastAPI 的各个方面对进行对比,本人兴趣依然还在 FastAPI 的 Swagger UI 功能,以及与 Flask 的 Blueprint 类似的特性。如果要拿 Flask 与 FastAPI 比较的话,应该用 Flask 2.x, 因为它开始支持类似 @app.get 的装饰器,并引入了 async 路由函数。
Flask 是在 2010 年发布的,它构建于 WSGI(Python Web Server Gateway Interface) 之上的,产品环境中运行需与 uWSGI, Gunicorn 搭配,或用 mod_wsgi 模块与 Apache 集成。因发布较早,所以目前应该有较多的使用者。Flask 2.0 需要 Python 3.6+ 的支持,如果支持 async , 需 Python 3.7+
FastAPI 发布于 2018 年,构建于 ASGI(Asynchronous Server Gateway Interface) 之上,在 IO 密集型的应用中有更优越的性能。生成环境中配合 ASGI 服务器,如 Uvicorn 或 Hypercorn . FastAPI 最为亮丽的特性是集成了 Swagger UI -- 外加一个福利 ReDoc 。FastAPI 需 Python 3.6+ 版本。
毕竟是在开始学一个新的框架,还是从它的基本用法开始,途中会穿插与 Flask 的对比。
安装:
当前安装的 fastapi 版本为 0.70.1, uvicorn 版本为 0.16.0。开始第一个例子,摘自官方
创建一个 main.py 文件,内容为
注:以上两个函数前面可以加上 async 关键字
启动服务,用命令
注: uvicorn --help 列出详细帮助,如启动多少个 worker, 绑定网络接口和端口号, 配置 SSL 证书等。
访问服务
另一个服务就是 http://localhost:8000/items/100?q=somequery
与 Flask 的对比
回顾一个 Flask 启动服务的方式有
如果程序文件名为 app.py 或 wsgi.py 的话,可以省略 FLASK_APP 环境变量,直接执行 flask run 就行。另一种方式就是在代码中加上 main 入口
然后像普通 Python 代码一样执行
对于 FastAPI, 如果总是要用 uvicorn 来启动服务的话,在 IDE 中调用就变得不那么便利。由于 uvicorn 本身就是 Python 实现,当然也就可以把命令过程写到 Python 代码中
注:uvicorn.run() 可接受更多的参数,相当于 uvicorn --help 可接受的。
同样把 main.py 当作普通 Python 程序来启动即可
前面讲过,FastAPI 进入我的视野最首要的一个原因就是它集成了 Swagger UI, 在启动了 FastAPI 服务后,只要访问 http://localhost:8000/docs, 熟悉的 Swagger UI 即刻映入眼帘
同时注意到函数映射为 API 的名称,由于参数是带有类型提示的,所以在 SwaggerUI 中也能看到相应的类型。其他定制 Swagger UI 的工作需要时可细细研究。
FastAPI 除了 SwaggerUI 外,还同时给了我们另一个选择,那就是 redoc, 访问 http://localhost:8000/redoc, 看到下面的界面
我也是头一回从 FastAPI 这里了解到还有一个 Redoc 的 Web API 文档工具,它和 SwaggerUI 类似,都是支持 Open API。
使用 FastAPI 时,在 API 文档中产生请求/响应的 Model 类型也很简单,下面的例子同时包含自定义的输入输出类型
下面是 main.py 的全新内容
再查看 http://localhost:8000/docs 文档,看到 PUT /items/{item_id} 的界面如下
我们能看到请求与响应中的 Example Value 和 Schema 定义
梳理完 FastAPI 的自动 API 文档功能,进入下一个话题
FastAPI 类似于 Flask 的 Blueprints 功能没有一个特定的名称,只笼统的给出解决方案 Bigger Applications - Multiple Files . 我们来看一下它是怎么实现的。这里简化官方的例子,排除了 dependencies 的应用,要用到的目录结构为
每个目录中都可以放一个 __init__.py 文件,标识为包,接着是每个文件的内容
app/internal/admin.py
app/routers/items.py
app/routers/users.py
在每个单独定义路由的文件里用到的是 APIRouter , 它相当是一个迷你的 FastAPI , 也类似于 Flask 的 Blueprint . 上面分别演示了两种 APIRouter 的声明方式,声明时带不带 prefix 和 tags。同时在为函数定义路由时也可指定 tags,在后面我们将会注意到 tags 只是为 API 文档分类用的。
app/main.py
这里实际上使用了三种定义路径前缀与 tags(API 分类) 的方式
现在运行
查看 SwaggerUI http://localhost:8000/docs
到目前为止我重点关注 FastAPI 的就是以上那两个特性:自动 API 文档与大程序多文件(Blueprint) 功能。其他的特性可查阅 FastAPI 的 Features 。比如:
原文 https://yanbin.blog/fastapi-new-python-web-framework-vs-flask/
C. python轻量框架--Flask(入门教程)
1.建立: F:Pythonflask文件夹路径
2.安装virtualenv,在此路径下打开命令行窗口输入:
3.新建一个目录,并在里边创建virtualenv环境,在DOS下
如图:
这时你创建的myproject文件夹里面就多了一个venv文件夹:
4.激活虚拟环境
现在命令行前面多了个(venv)表示你在venv环境内
5.在virtualenv里安装Flask
完成。如图:
6.验证是否安装,你可以进入 Python 解释器,尝试导入 Flask:
如果没有报错,那么就安装成功了~如图:
1.在myproject文件夹下打开命令行:
cd app #进入app文件夹
mkdir static
mkdir templates
我们的应用程序包是放置于 app 文件夹中。子文件夹 static 是我们存放静态文件像图片,JS文件以及样式文件。子文件夹 templates 显然是存放模板文件。
2.为我们的 app 包(文件 app/ init .py )创建一个简单的初始化脚本:
上面的脚本简单地创建应用对象,接着导入视图模块,该模块我们暂未编写。
视图是响应来自网页浏览器的请求的处理器。在 Flask 中,视图是编写成 Python 函数。每一个视图函数是映射到一个或多个请求的 URL。
3.让我们编写第一个视图函数(文件 app/views.py ):
其实这个视图是非常简单,它只是返回一个字符串,在客户端的网页浏览器上显示。两个 route 装饰器创建了从网址 / 以及 /index 到这个函数的映射。
4.能够完整工作的 Web 应用程序的最后一步是创建一个脚本,启动我们的应用程序的开发 Web 服务器。让我们称这个脚本为 run.py,并把它置于根目录:
这个脚本简单地从我们的 app 包中导入 app 变量并且调用它的 run 方法来启动服务器。请记住 app 变量中含有我们在之前创建的 Flask 实例。
5.要启动应用程序,您只需运行此脚本(run.py)
如图:
6.在服务器初始化后,它将会监听 5000 端口等待着连接。现在打开你的网页浏览器输入如下 URL:
另外你也可以使用这个 URL:
你看清楚了路由映射是如何工作的吗?第一个 URL 映射到 /,而第二个 URL 映射到 /index。这两个路由都关联到我们的视图函数,因此它们的作用是一样的。如果你输入其它的网址,你将会获得一个错误,因为只有这两个 URL 映射到视图函数。
你可以通过 Ctrl-C 来终止服务器
入门就到这里,比较简单的。
下一章:
python轻量框架--Flask(模板详细版)
D. python-flask 快速搭建web
Flask是由python实现的一个web微框架,我们可以使用Python语言快速实现一个网站或Web服务,很方便的实现工具链,或者工作中其他内容的集成展示。
python官网 : https://www.python.org
flask: pip3 install flask
python具有相当多的库可以使用,可以通过 ***pip3 intall xx ***安装各类库,极大的方便快速实现功能。
E. 使用python发布接口,如何提醒用户升级
简单说下接口测试,现在常用的2种接口就是http api和rpc协议的接口,今天主要说:http api接口是走http协议通过路径来区分调用的方法,请求报文格式都是key-value形式,返回报文一般是json串;
接口协议:http、webservice、rpc等。
请求方式:get、post方式
请求参数格式:
a. get请求都是通过url?param=xxx¶m1=xxx
b. post请求的请求参数常用类型有:application/json、application/x-www-form-urlencoded、multipart/form-data、text/html等。
还需要知道接口的url、参数类型、返回结果的数据格式、了解接口是否有header、cookie等信息。
接口的实现:请求方式-get,接口的写法:
import flaskfrom flask import requestfrom flask import jsonifyimport toolsimport OP_dbimport settings'''flask: web框架,可以通过flask提供的装饰器@server.route()将普通函数转换为服务登录接口,需要传url、username、passwd'''#创建一个服务,把当前这个python文件当做一个服务server = flask.Flask(__name__)#server.config['JSON_AS_ASCII'] = False # @server.route()可以含铅肢将普通函数转变为服务 登录接口的路径、请求方式@server.route('/login', methods=['get'])def login(): # 获取通过url请求传参的数据 username = request.values.get('name') # 获取url请求传的密码,明文 pwd = request.values.get('pwd') # 判断用户名、密码都不为空,如果激哗不传用户名、密码则username和pwd为None if username and pwd: # 获取加密后的密码 password = tools.md5_pwd(pwd) #执行sql,如果查询的username和password不为空,说明数据库存在admin的账号 sql = 'select name,password from test where name= "%s" and password= "%s";' %(username, password) # 从数据查询结果后,res返回是元组 res = OP_db.getconn( host=settings.mysql_info['host'], user=settings.mysql_info['user'], passwd=settings.mysql_info['pwd'], db=settings.mysql_info['db'], port=settings.mysql_info['port'], sql=sql ) if res: #res的结果不为空,说明找到了username=admin的用户,且password为加密前的123456 resu = {'code': 200, 'message': '登录成功'} return jsonify(resu) #将字典转换为json串, json是字符串 else: resu = {'code': -1, 'message': '账号/密码错误'} return jsonify(resu) else: res = {'code': 999, 'message': '必填参数未填写'} return jsonify(res) if __name__ == '__main__': server.run(debug=True, port=8888, host=0.0.0.0) #指定端口、host,0.0.0.0代表不管几个网卡,任何ip都可以访问
md5加密、数据库mysql的操作详见我的其他博客~~~~~
get访问接口:
项目启动后,谈世接口的地址是:http://127.0.0.1:5000/,默认端口是5000。
打开浏览器,输入urlhttp://127.0.0.1:5000/xxx?name=xxx&pwd=123456,后面跟上接口的地址login,参数跟url直接使用?相连,每个请求参数直接使用&相连。请求成功,则返回{'code': 200, 'message': '登录成功'}。
请求方式-post,接口的写法:
import flaskfrom flask import jsonifyfrom flask import requestfrom conf import opMysqlfrom conf import md5_create'''注册接口:post请求,请求参数入参类型json{ "username":"aaa", "pwd":"123456", "c_pwd":"123456"}'''server = flask.Flask(__name__)@server.route('/register', methods=['get', 'post'])def registerPost(): #判断接口的请求方式是GET还是POST if request.method == 'POST': # 获取请求参数是json格式,返回结果是字典 params = request.json username = params.get('username') pwd = params.get('pwd') confirmpwd = params.get('confirmpwd') if username and pwd and confirmpwd: # 判断输入的用户名、密码、确认密码都不为空 select_sql = 'select username from lhldemo where username = "%s" ;'%username # 查询注册的用户是否存在数据库,如果存在,则username不为空,否则username为空 res_mysql = opMysql.op_select(select_sql) if res_mysql: return jsonify({"code": 999, "mesg": "用户已注册"}) else: if pwd == confirmpwd: # 判断pwd和confirmpwd一致 new_pwd = md5_create.md5_test(pwd) # 加密后的密码 insert_sql = 'insert into lhldemo(username,password) values("%s", "%s") ;' % (username, new_pwd) opMysql.op_insert(insert_sql) return jsonify({"code": 200, "msg": "注册成功"}) else: return jsonify({"code":998, "msg":"密码不一样"}) else: return jsonify({"code": 504, "msg": "必填项不能为空"}) else: return jsonify({"code": 201, "msg": "请求方式不正确"}) if __name__ == '__main__': #port可以指定端口,默认端口是5000 #host写成0.0.0.0的话,其他人可以访问,代表监听多块网卡上面,默认是127.0.0.1 server.run(debug=True, port=8899, host='0.0.0.0')
post访问接口:
项目启动后,接口的地址是:http://127.0.0.1:5000/,默认端口是5000。
打开浏览器,输入urlhttp://127.0.0.1:5000/xxx,后面跟上接口的地址register,参数使用postman或jmeter进行请求,参数类型是json。请求成功,则返回{'code': 200, 'message': '登录成功'}。
请求方式-get、post都可以访问,写法如下:import flaskfrom flask import jsonifyfrom flask import requestfrom conf import opMysqlfrom conf import md5_create'''注册接口:post请求,请求参数入参类型json{ "username":"aaa", "pwd":"123456", "c_pwd":"123456"}'''server = flask.Flask(__name__)@server.route('/register', methods=['get', 'post'])def registerPost(): #post请求获取请求的参数,返回结果类型是str username = request.values.get('username') pwd = request.values.get('pwd') confirmpwd = request.values.get('confirmpwd') if username and pwd and confirmpwd: # 判断输入的用户名、密码、确认密码都不为空 select_sql = 'select username from lhldemo where username = "%s" ;'%username # 查询注册的用户是否存在数据库,如果存在,则username不为空,否则username为空 res_mysql = opMysql.op_select(select_sql) if res_mysql: return jsonify({"code": 999, "mesg": "用户已注册"}) else: if pwd == confirmpwd: # 判断pwd和confirmpwd一致 new_pwd = md5_create.md5_test(pwd) # 加密后的密码 insert_sql = 'insert into lhldemo(username,password) values("%s", "%s") ;' % (username, new_pwd) opMysql.op_insert(insert_sql) return jsonify({"code": 200, "msg": "注册成功"}) else: return jsonify({"code": 998, "msg": "密码不一样"}) else: return jsonify({"code": 504, "msg": "必填项不能为空"}) if __name__ == '__main__': #port可以指定端口,默认端口是5000 #host默认是127.0.0.1,写成0.0.0.0的话,其他人可以访问,代表监听多块网卡上面, server.run(debug=True, port=8899, host='0.0.0.0')
F. 【Python基础】flask是什么意思
Flask 是一个微框架(Micro framework),其官方文档的前言部分对Flask做了很清楚的定性介绍:
“微”(Micro)是什么意思?
“微”(micro) 并不意味着你要把整个web应用放到一个python文件里(虽然确实可以),也不意味着Flask 在功能上有所欠缺。微框架中的“微”意味着 Flask 旨在保持核心功能的简单而易于扩展。Flask 不会替你做出太多决策,比如使用何种数据库。而那些 Flask 帮你做好的决策(比如使用哪种模板引擎),都是很容易替换。除此之外的一切都由可由你掌握。
默认情况下,Flask 不包含数据库抽象层、表单验证,或是任何已在其它已库中处理的很好的功能。相反,Flask 支持通过扩展来给应用添加这些功能,如同是 Flask 本身实现的一样。众多的扩展提供了数据库集成、表单验证、上传处理及各种各样的开放认证技术等功能。Flask 也许是“微小”的,但它已准备好在复杂的生产环境中投入使用。
Flask尽量避免重复制造轮子,而是与已有的优秀轮子去结合,这使得Flask灵活、强大,且定制性更强。 Flask 配置选项众多,均设置了合理的默认值,并会遵循一些惯例;配置选项均可以修改,但通常没必要修改,尤其是刚开始的时候。这使得Flask易于上手。