
Formulário de contato com Python, Flask e envio de e-mail
Aprenda a criar um Formulário de contato com Python, Flask e envio de email
O que é Python?
Python é uma linguagem de programação de alto nível,[4] interpretada, de script, imperativa, orientada a objetos, funcional, de tipagem dinâmica e forte. Foi lançada por Guido van Rossum em 1991.[1] Atualmente possui um modelo de desenvolvimento comunitário, aberto e gerenciado pela organização sem fins lucrativos Python Software Foundation. Apesar de várias partes da linguagem possuírem padrões e especificações formais, a linguagem como um todo não é formalmente especificada. O padrão de facto é a implementação CPython.
A linguagem foi projetada com a filosofia de enfatizar a importância do esforço do programador sobre o esforço computacional. Prioriza a legibilidade do código sobre a velocidade ou expressividade. Combina uma sintaxe concisa e clara com os recursos poderosos de sua biblioteca padrão e por módulos e frameworks desenvolvidos por terceiros.
Python é uma linguagem de propósito geral de alto nível, multiparadigma, suporta o paradigma orientado a objetos, imperativo, funcional e procedural. Possui tipagem dinâmica e uma de suas principais características é permitir a fácil leitura do código e exigir poucas linhas de código se comparado ao mesmo programa em outras linguagens. Devido às suas características, ela é principalmente utilizada para processamento de textos, dados científicos e criação de CGIs para páginas dinâmicas para a web. Foi considerada pelo público a 3ª linguagem "mais amada", de acordo com uma pesquisa conduzida pelo site Stack Overflow em 2018,[5] e está entre as 5 linguagens mais populares, de acordo com uma pesquisa conduzida pela RedMonk.[6]
O nome Python teve a sua origem no grupo humorístico britânico Monty Python,[7] criador do programa Monty Python's Flying Circus, embora muitas pessoas façam associação com o réptil do mesmo nome (em português, píton ou pitão).
O que é Flask?
Flask é um pequeno framework web escrito em Python e baseado na biblioteca WSGI Werkzeug e na biblioteca de Jinja2. Flask está disponível sob os termos da Licença BSD.
Flask tem a flexibilidade da linguagem de programação Python e provê um modelo simples para desenvolvimento web. Uma vez importando no Python, Flask pode ser usado para economizar tempo construindo aplicações web. Um exemplo de aplicação desenvolvida com Flask é a página da comunidade de desenvolvedores do framework.[2]
É chamado de microframework porque mantêm um núcleo simples mas estendível. Não há uma camada de abstração do banco de dados, validação de formulários, ou qualquer outro componente onde bibliotecas de terceiros existem para prover a funcionalidade. Assim, Flask suporta extensões capazes de adicionar tais funcionalidades na aplicação final. Há uma vasta coleção de bibliotecas para resolver essas questões em Python, isso simplifica o framework e torna sua curva de aprendizado mais suave.
Instalando o Flask
Execute o comando a abaixo no terminal.
pip3 install Flask
Nosso projeto terá a seguinte estrutura. cd flask-contact ├── app.py ├── form_contact.py ├── __init__.py └── templates ├── application.html └── views ├── contacts │ └── contact.html ├── home │ └── index.html └── partials └── _header_top.html
Primeiro criaremos o arquivo base do projeto flask-contact/app.py.
Com o seguinte codigo:
#!/usr/bin/python3
import os
from flask import Flask, render_template, request, redirect
app = Flask(__name__)
@app.route('/')
def index():
return render_template('views/home/index.html')
if __name__ == "__main__":
app.run(debug = True)
Criar o arquivo templates/application.html
<!-- templates/application.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Python e Flask - GilcierWeb</title>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css" integrity="sha384-GJzZqFGwb1QTTN6wy59ffF1BuGJpLSa9DkKMp0DgiMDm4iYMj70gZWKYbI706tWS"
crossorigin="anonymous">
</head>
<body>
{% include 'views/partials/_header_top.html' %}
<div class="container">
<div class="row">
<div class="col-12">
<h1>GilcierWeb</h1>
{% block content %}{% endblock %}
</div>
</div>
</div>
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo"
crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.6/umd/popper.min.js" integrity="sha384-wHAiFfRlMFy6i5SRaxvfOCifBUQy1xHdJ/yoi7FRNXMRBu5WHdZYu1hA6ZOblgut"
crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js" integrity="sha384-B0UglyR+jN6CkvvICOB2joaf5I4l3gm9GU6Hc1og6Ls7i6U/mkkaduKaBhlAXv9k"
crossorigin="anonymous"></script>
</body>
</html>
templates/views/partials/_header_top.html
templates/views/partials/_header_top.html
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<a class="navbar-brand" href="#">GilcierWeb</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent"
aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav mr-auto">
<li class="nav-item active">
<a class="nav-link" href="{{ url_for('index') }}">Home <span class="sr-only">(current)</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="{{ url_for('contact') }}">Contatos</a>
</li>
</ul>
<form class="form-inline my-2 my-lg-0">
<input class="form-control mr-sm-2" type="search" placeholder="Search" aria-label="Search">
<button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button>
</form>
</div>
</nav>
Vamos criar um arquivo responsável pelo form e validação.
Primeiro instalaremos a lib Flask-WTF.
Execute o comando a seguir.
pip3 install Flask-WTF
Agora podemos criar o form.
flask-contact/ContactForm.py
#flask-contact/ContactForm.py
from flask_wtf import FlaskForm, CSRFProtect
from wtforms import StringField, TextAreaField
from wtforms.validators import DataRequired, Email
csrf = CSRFProtect()
class ContactForm(FlaskForm):
name = StringField('Nome', validators=[DataRequired('Nome não pode ficar vazio')])
email = StringField('E-mail', validators=[DataRequired('E-mail não pode ficar vazio'),Email('Informe um email válido')])
subject = StringField('Assunto', validators=[DataRequired('Assunto não pode ficar vazio')])
message = TextAreaField('Mensagem', validators=[DataRequired('Mensagem não pode ficar vazio')])
templates/views/contacts/contact.html
templates/views/contacts/contact.html{% extends "application.html" %}
{% block content %}
<h3>Contato</h3>
<form action="{{ url_for('contact') }}" method="POST">
{{ form.csrf_token }}
<div class="form-group">
{{ form.name.label }}
{{ form.name(class='form-control') }}
{% for error in form.name.errors %}
<span style="color: red;">[{{ error }}]</span>
{% endfor %}
</div>
<div class="form-group">
{{ form.email.label }}
{{ form.email(class='form-control') }}
{% for error in form.email.errors %}
<span style="color: red;">[{{ error }}]</span>
{% endfor %}
</div>
<div class="form-group">
{{ form.subject.label }}
{{ form.subject(class='form-control') }}
{% for error in form.subject.errors %}
<span style="color: red;">[{{ error }}]</span>
{% endfor %}
</div>
<div class="form-group">
{{ form.message.label }}
{{ form.message(class='form-control') }}
{% for error in form.message.errors %}
<span style="color: red;">[{{ error }}]</span>
{% endfor %}
</div>
<input type="submit" class="btn btn-success">
</form>
{% endblock %}
templates/views/home/index.html
templates/views/home/index.html
{% extends "application.html" %}
{% block content %}
<section class="jumbotron text-center">
<div class="container">
<h1 class="jumbotron-heading">GilcierWeb</h1>
<p class="lead text-muted">Something short and leading about the collection below—its contents, the creator, etc.
Make it short and sweet, but not too short so folks don’t simply skip over it entirely.</p>
<p>
<a href="#" class="btn btn-primary my-2">Main call to action</a>
<a href="#" class="btn btn-secondary my-2">Secondary action</a>
</p>
</div>
</section>
{% endblock %}
Alteraremos o app.py.
#app.py
...
from form_contact import ContactForm, csrf
...
SECRET_KEY = os.urandom(32)
app.config['SECRET_KEY'] = SECRET_KEY
csrf.init_app(app)
@app.route('/contact', methods=['POST', 'GET'])
def contact():
form = ContactForm()
if form.validate_on_submit():
print('-------------------------')
print(request.form['name'])
print(request.form['email'])
print(request.form['subject'])
print(request.form['message'])
print('-------------------------')
send_message(request.form)
return redirect('/success')
return render_template('views/contacts/contact.html', form=form)
@app.route('/success')
def success():
return render_template('views/home/index.html')
Agora faremos a parte d
e
envio de e-mail.
Primeiro
vamos instalar a lib
Flask-Mail
ela fica responsável pelo envio do e-mail no Flask.
pip3 install Flask-Mail
Voltamos ao arquivo flask-contact/app.py para implementar o
código
de envio de email.
#flask-contact/app.py
...
from flask_mail import Mail, Message
mail = Mail()
app.config['MAIL_SERVER']='smtp.gmail.com'
app.config['MAIL_PORT'] = 465
app.config['MAIL_USERNAME'] = '[email protected]'
app.config['MAIL_PASSWORD'] = '*****'
app.config['MAIL_USE_TLS'] = False
app.config['MAIL_USE_SSL'] = True
mail.init_app(app)
...
def send_message(message):
print(message.get('name'))
msg = Message(message.get('subject'), sender = message.get('email'),
recipients = ['[email protected]'],
body= message.get('message')
)
mail.send(msg)
Veja como ficou o arquivo app.py.
#app.py
#!/usr/bin/python3
import os
from flask import Flask, render_template, request, redirect
from flask_mail import Mail, Message
from form_contact import ContactForm, csrf
mail = Mail()
app = Flask(__name__)
SECRET_KEY = os.urandom(32)
app.config['SECRET_KEY'] = SECRET_KEY
csrf.init_app(app)
app.config['MAIL_SERVER']='smtp.gmail.com'
app.config['MAIL_PORT'] = 465
app.config['MAIL_USERNAME'] = '[email protected]'
app.config['MAIL_PASSWORD'] = '*****'
app.config['MAIL_USE_TLS'] = False
app.config['MAIL_USE_SSL'] = True
mail.init_app(app)
@app.route('/')
def index():
return render_template('views/home/index.html')
@app.route('/contact', methods=['POST', 'GET'])
def contact():
form = ContactForm()
if form.validate_on_submit():
print('-------------------------')
print(request.form['name'])
print(request.form['email'])
print(request.form['subject'])
print(request.form['message'])
print('-------------------------')
send_message(request.form)
return redirect('/success')
return render_template('views/contacts/contact.html', form=form)
@app.route('/success')
def success():
return render_template('views/home/index.html')
def send_message(message):
print(message.get('name'))
msg = Message(message.get('subject'), sender = message.get('email'),
recipients = ['[email protected]'],
body= message.get('message')
)
mail.send(msg)
if __name__ == "__main__":
app.run(debug = True)
Para rodar a aplicação execute o comando abaixo no terminal.
python3 app.py flask run
Github do projeto https://github.com/gilcierweb/contact-form-python-flask
Espero ter ajuda alguém, até a próxima.