用 swagger-py-codegen 產生 flask control code.
然後用 flask-jwt-extended 來完成需要的bearer function.
完成的 project 在 從openapi.yaml 開始。
用
swagger-py-codegen --swagger-doc openapi.yaml example --ui --spec產生 python code
browser 開啟http://localhost:5000/static/swagger-ui/index.html 就可以用 swagger 測試 flask server code
大概就是:
flask_jwt_extended 自己會處理 global , static 變數問題。
所以可以在任意module import, call create_access_token, jwt_required() .. 等。 只要確定在使用前,app 啟動時 call JWTManager() 初始化,和 設定 ['JWT_SECURITY_KEY']
diff --git a/example/example/__init__.py b/example/example/__init__.py index fe02a18..ccf02a9 100644 --- a/example/example/__init__.py +++ b/example/example/__init__.py @@ -2,16 +2,21 @@ from __future__ import absolute_import from flask import Flask +from flask_jwt_extended import JWTManager import v1 def create_app(): app = Flask(__name__, static_folder='static') app.register_blueprint( v1.bp, url_prefix='/v1') + app.config["JWT_SECRET_KEY"] = "mysecret" + JWTManager(app) return app
另外,codegen 預計在 scopes[] 實做 security,因為不知道怎嘛用,所以只好把 schemas.py 中,scopes = { } 的內容刪除,讓 scope 是空 dictionary
否則有yaml 中有 security 的 path。一律回 permission deny
diff --git a/example/example/v1/schemas.py b/example/example/v1/schemas.py index 4b20894..7e54c7c 100644 --- a/example/example/v1/schemas.py +++ b/example/example/v1/schemas.py @@ -61,7 +61,6 @@ filters = { } scopes = { - ('protect', 'GET'): ['secret'], } resolver = RefResolver.from_schema(definitions) @@ -228,4 +227,4 @@ def normalize(schema, data, required_defaults=None, resolver=None): return funcs[type_](schema, data)
還有就是..用 postman 測試都 OK,用 swagger-ui 卻都是 fail,開啟 chrome debugger panel,可以看到 fail 的內容是 CORS。
diff --git a/example/example/__init__.py b/example/example/__init__.py index fe02a18..ccf02a9 100644 --- a/example/example/__init__.py +++ b/example/example/__init__.py @@ -2,16 +2,21 @@ from __future__ import absolute_import from flask import Flask +from flask_cors import CORS import v1 def create_app(): app = Flask(__name__, static_folder='static') + CORS(app)
另外,flask 官方有範例,使用 jwt package,不用 flask_jwt_extened 來做的方法: 也是一樣,做一個 decorator @token_required.
沒有留言:
張貼留言