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易於上手。