用 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.
沒有留言:
張貼留言