From cc44c4056e631b3b9a365057b4f7ea5993ebe9c0 Mon Sep 17 00:00:00 2001 From: Gardient Date: Sun, 19 Sep 2021 22:15:08 +0300 Subject: [PATCH] implements login view --- api/__init__.py | 6 +++++- api/login/__init__.py | 3 +++ api/login/models.py | 4 ++++ api/login/serializers.py | 11 +++++++++++ api/login/views.py | 23 +++++++++++++++++++++++ 5 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 api/login/__init__.py create mode 100644 api/login/models.py create mode 100644 api/login/serializers.py create mode 100644 api/login/views.py diff --git a/api/__init__.py b/api/__init__.py index 1a9564c..2a94ba9 100644 --- a/api/__init__.py +++ b/api/__init__.py @@ -32,7 +32,11 @@ def register_extensions(app: Flask): def register_blueprints(app: Flask): """Register Flask blueprints.""" - pass + api_blueprint = Blueprint('api', __name__, url_prefix='/api') + + api_blueprint.register_blueprint(login.views.blueprint, url_prefix='/login') + + app.register_blueprint(api_blueprint) def register_errorhandlers(app: Flask): diff --git a/api/login/__init__.py b/api/login/__init__.py new file mode 100644 index 0000000..b069c0e --- /dev/null +++ b/api/login/__init__.py @@ -0,0 +1,3 @@ +"""API Login""" + +from . import views diff --git a/api/login/models.py b/api/login/models.py new file mode 100644 index 0000000..0b3ae19 --- /dev/null +++ b/api/login/models.py @@ -0,0 +1,4 @@ +class TokenResponse(object): + def __init__(self, token: str) -> None: + super().__init__() + self.token = token diff --git a/api/login/serializers.py b/api/login/serializers.py new file mode 100644 index 0000000..93cd625 --- /dev/null +++ b/api/login/serializers.py @@ -0,0 +1,11 @@ +from marshmallow import Schema, fields + +class LoginSchema(Schema): + username = fields.Str() + password = fields.Str(load_only=True) + +class TokenResponseSchema(Schema): + token = fields.Str() + +login_schema = LoginSchema() +token_response_schema = TokenResponseSchema() diff --git a/api/login/views.py b/api/login/views.py new file mode 100644 index 0000000..536a6bc --- /dev/null +++ b/api/login/views.py @@ -0,0 +1,23 @@ +from flask import Blueprint, current_app +from flask_jwt_extended import jwt_required, create_access_token +from flask_apispec import use_kwargs, marshal_with + +from api.exceptions import BadRequestException +import api.constants as constants + +from .models import TokenResponse +from .serializers import login_schema, token_response_schema + +blueprint = Blueprint('login', __name__) + + +@blueprint.route('', methods=['POST']) +@jwt_required(optional=True) +@use_kwargs(login_schema) +@marshal_with(token_response_schema) +def login_user(username, password, **kwargs): + print(f'user: {username}; pass: {password}; expected:{current_app.config[constants.API_PASS]}') + if username == constants.API_USER and password == current_app.config[constants.API_PASS]: + return TokenResponse(create_access_token(identity=username, fresh=True)) + else: + raise BadRequestException("Wrong combination of username and password")