簡體   English   中英

使用 Flask-JWT-Extended 和 Flask-restx

[英]Using Flask-JWT-Extended with Flask-restx

我正在使用Flask-restx構建一個 API ,我正在使用令牌系統進行身份驗證,我正在使用Flask-JWT-Extended ,在我的情況下,我設法獲得了令牌,但我無法將其放入意見,我正在使用裝飾器

@jwt_required裝飾器在這樣的視圖上

class InputReaderView(Resource):
    @jwt_required
    def post(self):
        username = get_jwt_identity()
        input_reader = reqparse.RequestParser()
        input_reader.add_argument("type", type=str, required=True)
        input_reader.add_argument("data", type=dict, action="append", required=True)
        args = input_reader.parse_args()

        # datas = populate(os.path.join(BaseConfig.UPLOAD_FOLDER, 'f1040s1-tagged.json'), args['data'])
        pdf_path = os.path.join(BaseConfig.UPLOAD_FOLDER, "pdf")

        for pdf in os.listdir(pdf_path):
            filename = secure_filename(pdf)
            if filename == args["type"]:
                pdf_path = os.path.join(pdf_path, filename)
                datas = populate(
                    os.path.join(BaseConfig.UPLOAD_FOLDER, "f1040s1-tagged.json"),
                    args["data"],
                )
                validated: dict = {}
                fields = extract_field(pdf_path=pdf_path)
                for fv in fields:
                    for data in datas:
                        if fv["FieldName"] == data["form"]:
                            validated[fv["FieldName"]] = data["value"]

                filled_pdf = pypdftk.fill_form(
                    pdf_path,
                    datas=validated,
                    out_file="{}/{}-filled.pdf".format(
                        os.path.join(BaseConfig.UPLOAD_FOLDER, "filled"),
                        filename.replace(".pdf", ""),
                    ),
                )

                return jsonify(
                {
                    "title": f"{filename}",
                    "filled pdf download_url": "{}{}".format(
                        "http://localhost:5000",
                        url_for(
                            "api.download_filled_pdf",
                            download_url="{}-filled.pdf".format(
                                filename.replace(".pdf", "")
                            ),
                        )
                        .title()
                        .lower(),
                    ),
                }
            )

這是我在我的應用程序上使用 flask-JWT-Extended 的配置

# core/__init__.py
def create_app():
    # import models
    from apps.dashboard.models import Users
    
    
    # app = Flask(f'{DemoActor.__name__}Service')
    app = Flask(__name__)
    app.config.from_object('core.config.ProductionConfig')
    login_manager.init_app(app)
    login_manager.login_view = 'api.login_view'
    
    db.init_app(app)
    migrate.init_app(app=app, db=db)
    jwt.init_app(app)
    
    
    # register new blueprint
    app.register_blueprint(api_blueprint)
    
    # flask context
    @app.shell_context_processor
    def ctx():
        return {'app':app, 'db':db}

    
    return app
# core/initial.py
"""
initialize project
"""

from flask_jwt_extended import JWTManager
from flask_login import LoginManager
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate

login_manager = LoginManager()
migrate = Migrate()
db = SQLAlchemy()
jwt = JWTManager()

但我收到了這個錯誤

127.0.0.1 - - [14/Jul/2022 17:18:17] "POST /input-reader HTTP/1.1" 500 -
Traceback (most recent call last):
  File "C:\Users\feril\Documents\Code\JOB\pallo_project\flask-dapr\venv\lib\site-packages\flask\app.py", line 2095, in __call__
    return self.wsgi_app(environ, start_response)
  File "C:\Users\feril\Documents\Code\JOB\pallo_project\flask-dapr\venv\lib\site-packages\flask\app.py", line 2080, in wsgi_app
    response = self.handle_exception(e)
  File "C:\Users\feril\Documents\Code\JOB\pallo_project\flask-dapr\venv\lib\site-packages\flask_restx\api.py", line 671, in error_router
    return original_handler(f)
  File "C:\Users\feril\Documents\Code\JOB\pallo_project\flask-dapr\venv\lib\site-packages\flask_restx\api.py", line 669, in error_router
    return self.handle_error(e)
  File "C:\Users\feril\Documents\Code\JOB\pallo_project\flask-dapr\venv\lib\site-packages\flask\app.py", line 2077, in wsgi_app
    response = self.full_dispatch_request()
  File "C:\Users\feril\Documents\Code\JOB\pallo_project\flask-dapr\venv\lib\site-packages\flask\app.py", line 1525, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "C:\Users\feril\Documents\Code\JOB\pallo_project\flask-dapr\venv\lib\site-packages\flask_restx\api.py", line 671, in error_router
    return original_handler(f)
  File "C:\Users\feril\Documents\Code\JOB\pallo_project\flask-dapr\venv\lib\site-packages\flask_restx\api.py", line 669, in error_router
    return self.handle_error(e)
  File "C:\Users\feril\Documents\Code\JOB\pallo_project\flask-dapr\venv\lib\site-packages\flask\app.py", line 1523, in full_dispatch_request
    rv = self.dispatch_request()
  File "C:\Users\feril\Documents\Code\JOB\pallo_project\flask-dapr\venv\lib\site-packages\flask\app.py", line 1509, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**req.view_args)
  File "C:\Users\feril\Documents\Code\JOB\pallo_project\flask-dapr\venv\lib\site-packages\flask_restx\api.py", line 407, in wrapper
    return self.make_response(data, code, headers=headers)
  File "C:\Users\feril\Documents\Code\JOB\pallo_project\flask-dapr\venv\lib\site-packages\flask_restx\api.py", line 430, in make_response
    resp = self.representations[mediatype](data, *args, **kwargs)
  File "C:\Users\feril\Documents\Code\JOB\pallo_project\flask-dapr\venv\lib\site-packages\flask_restx\representations.py", line 25, in output_json
    dumped = dumps(data, **settings) + "\n"
  File "C:\src\python\lib\json\__init__.py", line 234, in dumps
    return cls(
  File "C:\src\python\lib\json\encoder.py", line 201, in encode
    chunks = list(chunks)
  File "C:\src\python\lib\json\encoder.py", line 438, in _iterencode
    o = _default(o)
  File "C:\src\python\lib\json\encoder.py", line 179, in default
    raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type function is not JSON serializable

有誰知道這是為什么? 或者有一個使用Flask-JWT-ExtendedFlask-Restx ?,可以解決嗎?

jwt_required應按如下方式調用(您缺少括號() ):

class InputReaderView(Resource):
    @jwt_required()
    def post(self):

您還可以使用@jwt_required(optional=True)無論是否提供令牌,它都將起作用。

參考

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM