Calculadora de notas do CEDERJ feita em Flask. Ela mostra quanto você precisa tirar na AP2 para fechar média 6 e, se não der, quanto precisa na AP3 para chegar a 5.
No ar em https://quero-ferias-cederj.fly.dev/
O site abre em Computação, onde a AD vale 20% e a AP vale 80%:
/: quanto você precisa tirar na AP2 para fechar média 6 (o cálculo roda no servidor, em/calculate)./ap3.html: com N1 e N2 do SCA, se você já passou ou quanto precisa na AP3 para chegar a 5.
Regra: N1 e N2 = (AD×2 + AP×8)/10; N = (N1 + N2)/2; se N ≥ 6, aprovado. Senão, NF = [MAIOR(N1, N2) + AP3]/2.
A seleção de curso leva a Biblioteconomia, onde a AD vale 40% e a AP vale 60%:
/biblioteconomia.html: quanto você precisa tirar na AP2 (ou na AP, em disciplinas de 30h) para fechar média 6./biblioteconomia-ap3.html: com N1 e N2 do SCA, se você já passou ou quanto precisa na AP3 para chegar a 5.
Nas duas telas você escolhe a carga horária da disciplina:
- 60h (regra #19): N1 e N2 = (AD×4 + AP×6)/10; N = (N1 + N2)/2; se N ≥ 6, aprovado. Senão, NF = [MAIOR(N1, N2) + AP3]/2.
- 30h (regras #37 e #38): só uma AD e uma AP; N = (AD×4 + AP×6)/10; NF = (N + AP3)/2.
app.py: servidor Flask, API de cálculo e cabeçalhos de segurança.gunicorn.conf.py: configuração do servidor de produção.*.html: as quatro páginas.static/computacao.*estatic/computacao-ap*.js: visual de fliperama e scripts de Computação.static/biblioteconomia.*estatic/biblioteconomia-ap*.js: visual de fichário e scripts de Biblioteconomia.static/fonts/: fontes hospedadas no próprio site, com as licenças.static/assets/: ícones do rodapé.
Precisa de Python 3.10 ou mais novo.
python3 -m venv venv
source venv/bin/activate # No Windows: venv\Scripts\activate
pip install -r requirements.txt
python app.pyAcesse http://localhost:8080. O python app.py usa o servidor de desenvolvimento do Flask. Para rodar como em produção (não funciona no Windows):
gunicorn --config gunicorn.conf.py app:appO fly.toml fica fora do Git (está no .gitignore). Com o flyctl instalado e logado, na raiz do projeto:
flyctl deploy -a quero-ferias-cederjO Dockerfile usa Python 3.13, roda com um usuário sem privilégios e sobe o site com o gunicorn na porta 8080.
- CSP estrita: scripts, estilos e fontes só vêm do próprio site. Não há script nem estilo inline, e o site não pode ser aberto dentro de iframes.
- Outros cabeçalhos: HSTS,
X-Content-Type-Options,Referrer-Policy: no-referrer,Permissions-PolicyeCross-Origin-Opener-Policy/Cross-Origin-Resource-Policy. O cabeçalhoServernão revela a versão. - API: aceita só JSON de até 1KB, com exatamente os campos esperados e números finitos entre 0 e 10 (texto,
trueeNaNsão recusados). Erros voltam em JSON, sem detalhes internos, e as respostas não ficam em cache. - Servidor: gunicorn em vez do servidor de desenvolvimento do Flask, com limites de tamanho de requisição.
- Dependências: fixadas em
requirements.txte checadas compip-audit. - Privacidade: as fontes são servidas pelo próprio site, então nenhuma visita é repassada ao Google.
- Fontes: Press Start 2P, VT323, Courier Prime e Libre Caslon Display (SIL Open Font License); Special Elite e Homemade Apple (Apache License 2.0). As licenças estão em
static/fonts/. - Ícones de e-mail, GitHub e LinkedIn: Icons8.