Alfred Thaddeus Crane Pennyworth é um personagem fictício da DC Comics. Ele é mordomo e tutor do bilionário Bruce Wayne.
Alfred tem sua origem muitas vezes envolta em mistério e pouco se fala de suas atividades antes de ele se tornar mordomo da rica e tradicional família Wayne. Em algumas mini-series e edições avulsas das HQs fala-se de sua distante ligação com a Scotland Yard onde ele teria trabalhado como um de seus agentes mais discretos.
Sabe-se ainda de um passado como ator competente, tendo essa experiência na dramaturgia se provado útil em diversas ocasiões. Como, por exemplo, tendo ensinado ao Bruce, ainda jovem, como modificar sua voz para imitar as vozes de outras pessoas. Algo que se provou muito útil na criação da persona do Homem-Morcego.
Demonstra também muitas outras habilidades úteis, como conhecimentos médicos básicos, por exemplo. Contudo, fica-se com a impressão que nem Bruce Wayne conhece totalmente esse passado de seu mordomo. Muitas vezes, as palavras de Alfred são sugestões quase que subliminares que ajudam o "cruzado mascarado" na solução de enigmas complexos de crimes. Mesmo assim, Alfred, várias vezes, faz o papel de ingênuo.
Primeiramente você deve instanciar o docker com o comando
make buildApós o build, é só rodar os testes
make testPara utilizar a classe de cache do Alfred, primeiramente deve adicionar o walrus (https://walrus.readthedocs.io/en/latest/api.html) no seu requirements, recomendamos versões maiores que a 0.8.2
walrus==X.X.X
Após adicionar o walrus no projeto, você deve adicionar a sua conexação com o redis nas variáveis de ambiente do projeto.
ALFRED_REDIS_HOST=sua-conexao-com-redisComo utilizar
from alfred.cache import Cache
value = 100
Cache.set("cache_key", value, 60)
Cache.get("cache_key")
Cache.delete("cache_key")Para quem usa o sqlalchemy e precisar de um campo de password, pode utilizar o campo do alfred, que já faz as validações de senha.
Primeiro deve definir a sua chave de criptografia
ALFRED_PASSWORD_SALT = very-numric-keyfrom alfred.sqlalchemy_utils.fields.password import PasswordType
class SeuModel:
password = Column(PasswordType, nullable=True)Para quem usa o sqlalchemy e precisar de um campo de password, pode utilizar o campo do PasswordSalt. O campo criptografa a senha baseado em um salt randômico que também é persistido no banco. O formato final do valor persistido contem: "password_salt-password_interations-password_hash", separados por um hifen "-".
from alfred.sqlalchemy_utils.fields.password import PasswordSaltType
class SeuModel:
password = Column(PasswordSaltType, nullable=True)Para utilizar o basic_auth_authorizer, serão necessários no seu requirements:
pynamodb>=5.1.0
Será necessário também o acesso a um banco de dados Dynamodb. Detalhes da configuração do banco em: (https://docs.aws.amazon.com/dynamodb/index.html)
Primeiro, é necessário criar a tabela do BasicAuthUser, com o seguinte script:
from alfred.auth.models import BasicAuthUser
from alfred.settings import DYNAMODB_PREFIX
class DynamoDBException(Exception):
pass
def dynamodb_create_tables():
if not DYNAMODB_PREFIX:
raise DynamoDBException("DYNAMODB_PREFIX enviroment variable must be set")
if not BasicAuthUser.exists():
BasicAuthUser.create_table(
read_capacity_units=1, write_capacity_units=1, wait=True
)
if __name__ == "__main__":
dynamodb_create_tables()Na sequencia, será necessário registrar o basic_auth_authorizer no seu app chalice.
from alfred import auth
@app.authorizer()
def basic_auth_authorizer(auth_request):
return auth.basic_auth_authorizer(auth_request)Agora basta popular o tabela de usuários e utilizar o authorizer em seus endpoints.
@app.route("/ping", methods=["GET"], authorizer=basic_auth_authorizer)
def login():
passPara utilizar o jwt_authorizer, serão necessários:
- Adicionar no seu requirements:
pyjwt==2.3.0
cryptography==36.0.0
- Adicionar as variáveis de ambiente:
JWT_ALGORITHM
JWT_EXP_DELTA_SECONDS
JWT_SECRET
FERNET_CRYPT_KEYNa sequencia, será necessário registrar o jwt_authorizer no seu app chalice.
O argumento encrypted_fields aponta quais fields serão criptografados dentro do token
from alfred import auth
@app.authorizer()
def jwt_authorizer(auth_request):
encrypted_fields = ["foo", "bar"]
return auth.jwt_authorizer(auth_request, encrypted_fields)Para utilizar o authorizer em seus endpoints:
@app.route("/ping", methods=["GET"], authorizer=basic_auth_authorizer)
def login():
passPara criar um token, utilize a função encode_auth:
from alfred.auth import encode_auth
token = encode_auth(id, token, date)Para utilizar o sqs, primeiro você deve adicionar o endereço de sua fila default na AWS as variáveis de ambiente do projeto:
SQS_QUEUE_URL=endereço-da-sua-fila-defaultComo utilizar
@app.on_sqs_message(queue=SQS_QUEUE_URL)
def handle_sqs_message(event):
alfred.sqs.handle_sqs_message(event)Para utilizar o Feature Flag, você deve instanciar a classe FeatureFlag passando como parâmetro o id e data.
from alfred.feature_flag.models import FeatureFlag
FeatureFlag(id=1, data={"foo": "bar"}).save()Como acessar as informações:
- Passando o
idno métodoget_data, você acessa os dados contido no campodata:
flag = FeatureFlag.get_data(id=1)Resposta:
print(flag)
# >>> {"foo": "bar"}- Caso o parâmetro
idseja Nulo ou id que não existe o método irá retornar None.
