https://slides.com/superdiana/flask-pt
Google Developer Expert:
- Web Technologies - Google Maps Platform
- Google Cloud Platform - Firebase
Auth0 Ambassador
Microsoft MVP: Developer Technologies
Python Developer Advocate @ Vonage
🚀 https://superdi.dev
🐦 @cotufa82
Uma pessoa que aprende algo novo todos os dias !!
"Flask e um microframework de Python que é baseado em Werkzeug, Jinja 2 e boas intenções. Através do Flask, podemos criar aplicaçoes Web e Restful com Python de uma maneira extremamente simple ".
Contexto...
### layout.hmtl
<!DOCTYPE html>
<html lang="en">
<head>
<link rel="stylesheet" href="{{ url_for('static', filename='css/materialize.min.css') }}">
<link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
{% block head %}{% endblock %}
</head>
<body>
<header class="container-fluid">
<nav class="teal">
<div class="container">
<div class="row">
<div class="col">
<a href="#" class="brand-logo"><i class="material-icons logo">record_voice_over</i> Scout = Nexmo + Nightscout</a>
</div>
</div>
</div>
</nav>
</header>
<main class="container">
{% block content %}{% endblock %}
</main>
<footer class="page-footer teal">
<div class="footer-copyright">
<div class="container">
Made By <a class="brown-text text-lighten-3">CodeON</a>
</div>
</div>
</footer>
<script language="javascript" src="{{ url_for('static', filename='js/materialize.min.js') }}"></script>
{% block script %}{% endblock %}
</body>
</html>
### login.html
{% extends "layout.html" %}
{% block head %}
<script src="https://apis.google.com/js/platform.js" async defer></script>
<meta name="google-signin-client_id" content="{{ client_id }}">
{% endblock %}
{% block content %}
<div id="user" class="guest">Welcome guest, You need to authenticate</div>
<div class="row">
<div class="col s6 offset-s3">
<div class="card blue-grey darken-1">
<div class="card-content white-text">
<span class="card-title">Login To Enter Scout</span>
<p>This application is going to allow you configure some alerts to your Phone, a Favorite Phone or 5 contact Phones. If you use a nightscout device and you have your api available for external queries. You can use this server and when the glucose level is to low and to high you will receive a call to indicates the glucose level. If you not Answer the call then an sms is sent to your favorite number and other 5 contact numbers.</p>
<div class="g-signin2" data-onsuccess="onSignIn"></div>
</div>
</div>
</div>
</div>
<script language="javascript">
function onSignIn(googleUser) {
var profile = googleUser.getBasicProfile();
if(profile.getId()!==null && profile.getId()!==undefined){
var xhr = new XMLHttpRequest();
xhr.open('POST', '{{ site_url|safe }}/login');
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.onload = function() {
console.log('Signed in as: ' + xhr.responseText);
//Authenticated so redirect to index
window.location = "{{ site_url|safe }}/";
};
xhr.send('idtoken=' + googleUser.getAuthResponse().id_token + "&username=" + profile.getName() + "&email=" + profile.getEmail());
}
}
</script>
### app.py
@app.route('/login',methods=["POST"])
def login():
try:
token = request.form.get("idtoken")
client_id = os.getenv("GOOGLE_CLIENT_ID")
infoid = id_token.verify_oauth2_token(token, google.auth.transport.requests.Request(), client_id)
if infoid['iss'] not in ['accounts.google.com', 'https://accounts.google.com']:
raise ValueError('Wrong issuer.')
userid = infoid['sub']
#Here is a good place to create the session
session["user"] = {"userid": userid, "username": request.form.get("username"), "email": request.form.get("email")}
return userid
except ValueError:
return "Error"
pass
PRAISE YOURSELF
@cotufa82
https://superdi.dev