Hello Sanca! Hello World!

Ótima oportunidade para você que é de São Carlos e região e quer aprender mais sobre open source: https://opensanca.wordpress.com/2015/06/16/hello-world/.

Anúncios

Projeto Esqueleto – Django REST and AngularJS

Resolvi criar um esqueleto, tentando seguir boas práticas do Django, Django REST framework e do AngularJS. A intenção é ser o mais simples possível e menos intrusivo.

Segue instruções no repositório:

https://github.com/raul010/django-angular-skeleton

Envio de Email com Django pelo Console

Fala galera! Hoje vamos ver um exemplo bem simples de envio de email com Django, para isso usaremos apenas o console (sim, não vamos usar django-forms).

Primeiro vamos configurar o arquivo settings.py. Abaixo segue um exemplo de como configurar o envio de email com django:

# Email configuration
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
DEFAULT_FROM_EMAIL = 'Name <myemail@gmail.com>'
EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'myemail@gmail.com'
EMAIL_HOST_PASSWORD = 'mypassword'
EMAIL_PORT = 587

Note que as configurações que fiz servem para envio de email com gmail, mas se você utiliza outro servidor de email basta alterar as configurações de EMAIL_HOST e EMAIL_PORT.

Agora, na tua aplicação, abra o shell do python: python manage.py shell

Dentro do shell vamos importar o método send_mail do django:

>>> from django.core.mail import send_mail

Antes de realizarmos o envio vamos dar uma olhada em como usaremos o método send_mail:

>>> help(send_mail)

Help on function send_mail in module django.core.mail:

send_mail(subject, message, from_email, recipient_list, fail_silently=False, auth_user=None, auth_password=None, connection=None)
    Easy wrapper for sending a single message to a recipient list. All members
    of the recipient list will see the other recipients in the 'To' field.
    
    If auth_user is None, the EMAIL_HOST_USER setting is used.
    If auth_password is None, the EMAIL_HOST_PASSWORD setting is used.
    
    Note: The API for this method is frozen. New code wanting to extend the
    functionality should use the EmailMessage class directly.

Note que os primeiros quatro parâmetros (subject, message, from_email, recipient_list) são obrigatórios e são apenas os que vamos usar. Abaixo vemos a função send_mail funcionando:

>>> send_mail('Teste', 'Teste de envio de email com Django', 'myemail@gmail.com', ['lucas@desenvolvo.com', 'raul@desenvolvo.com'])

Se você configurou tudo certinho é para o envio de email ter funcionado 🙂

Um abraço e até a próxima!

Integrando Django 1.6 + Python 3 com o MySQL (Utilizando o conector MySQLdb)

Após passar dias tentando integrar minha aplicação Django 1.6 + Python 3.* com o banco de dados MySQL finalmente encontrei a solução! =D

O problema de compatibilidade acontecia pelo fato de que, entre todos os conectores MySQL para Python, o Django só suporta o MySQLdb, porém o MySQLdb só funciona com Python 2.*. Entretanto, após várias pesquisas, encontrei um repositório no github onde consertaram tal problema de compatibilidade: https://github.com/davispuh/MySQL-for-Python-3

Para instalar este conector basta cloná-lo na tua máquina ou clicar no botão Download Zip e descompactar onde você quiser (o que é ainda mais fácil). Após isso, entre na pasta do conector com o terminal (ou prompt de comando) e digite: python3 setup.py install

Depois que tudo estiver instalado configure o settings.py do teu projeto. Abaixo segue um exemplo de configuração:

# Database
# https://docs.djangoproject.com/en/1.6/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', 
        'NAME': 'DB_NAME',
        'USER': 'DB_USER',
        'PASSWORD': 'DB_PASSWORD',
        'HOST': 'localhost',   # Or an IP Address that your DB is hosted on
        'PORT': '3306',
    }
}

Pronto, agora (no terminal) digite: python3 manage.py syncdb

Obs.: Caso for um usuário linux não se esqueça de que, para tudo funcionar, você precisa ter instalado em sua máquina o libmysqlclient-dev

É isso aí, galera! Agora a aplicação de vocês está rodando normalmente com o banco de dados MySQL 😉

Nota: É altamente recomendável utilizar o virtualenv para este tutorial (e para qualquer outra coisa que você queira fazer com python =D )

Integrando Django Forms ao Twitter Bootstrap

Para mim que venho principalmente do trio Java + JSF2+Primefaces, venho encontrando alguns desafios ao integrar o framework web Django com o Front-end Bootstrap. Porém no final das contas, acho que os dois se integram muito bem, assim também como o AngularJS ao Django, e futuramente pretendo escrever sobre também.

Ao ler sobre formulários customizados e filtros customizados na documentação do Django, cheguei a seguinte solução:

O retorno de renderização do seu método, de sua view será, naturalmente, algo como isto:

views.py


return render(request, 'meuapp/form-user.html', {
"form": form,
 })

O fragmento base abaixo é o nosso formulário customizado:

form.html

{% load addcss %}
    {% for field in form %}
    	{% if field.errors %}
            <div>
                <label for="{{ field.id_for_label }}">{{ field.label }}{% if field.field.required %}*{% endif %}</label>
				<div>
                    {{ field|attr:"class=form-control; placeholder=teste" }}
                    <span></span>
                    <div>
                        {% for error in field.errors %}{{ error }}{% endfor %}
                    </div>
                    </span>
                </div>
            </div>
        {% else %}
            <div>
                <label for="{{ field.id_for_label }}">{{ field.label }}{% if field.field.required %}*{% endif %}</label>
				<div>
                	{{ field|attr:"class=form-control; placeholder=teste" }}
                    {% if field.help_text %}
                    	<div>{{ field.help_text }}</div>
                	{% endif %}
                </div>
            </div>
        {% endif %}
	{% endfor %}
</form>
{% comment %}
	{% block formsets %}
	    {% for formset in inlines %}
	        %{ include "inline_formset.html" with formset=formset }%
	    {% endfor %}
	{% endblock formsets %}
{% endcomment %}

Segue abaixo o template base:

base-form-user.html

<div id="LC1">
<pre><!DOCTYPE html>
{% load staticfiles %}
<!doctype html>
<html lang="en" ng-app="formUserApp">
	<head>
 		<meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">

	  	<link href="{% static "formulario/bootstrap/css/bootstrap.css" %}" rel="stylesheet">
		<title>{% block title %} TITLE {% endblock %}</title>
		<!-- {% block extrahead %}{% endblock %} -->
	</head>
	<body ng-controller="StarListCtrl">
		{% block content%}{% endblock %}
	</body>

	<!-- {% block extrajs %}{% endblock %} -->

	<script src="{% static "formulario/angular/angular.js" %}"></script>
	<script src="{% static "formulario/js/controllers.js" %}"></script>
	<!-- script src="{% static "formulario/bootstrap/js/bootstrap.js" %}"></script -->
</html></pre>
</div>

E agora vai a página que utiliza o template acima:

form-user.html

{% extends "base-form-user.html" %}

{% block title %} Form User {% endblock %}

{% block content%}
<h1>Hello, Bootstrap ツ</h1>
<br />
<form role="form" method="post" action=".">{% csrf_token %}
    <div>
		{% include 'form.html' %}
	<div class="">
		<button type="submit">Enviar !!!</button>
	</div>
</div><!-- /container -->

	<div>
		{% for nome in book %}
			<li>{{nome.name}}</li>
		{% endfor %}
	</div>
{% endblock %}

Eis então, nosso aclamadíssimo Django Bootstraped:

snapshot1 snapshot2

Deixei meu código no GitHub, notem em form.html que criei um Custom Filter  — {{ field|attr…}} –para incluir qualquer atributo seguindo o padrão do exemplo.  Fiquem a vontade em visualizar o arquivo no git, mas voltarei para falar mais dele, e da integração do Django com o AngularJs.

Não tem segredo, por enquanto estou achando que vale muito a pena sacrificar os “benefícios” que os grandes Java + JSF2 + ORM e até Spring3, SpringMVC trazia, em prol da liberdade Python + Django.

Abraços a todos e até logo.

Curso de Python – Aula Bônus (Compreensão da Lista)

Trabalhar com Listas em Python é algo bem interessante. Uma das vantagens disso é que, em Python, temos uma ferramenta poderosa chamada Compreensão da Lista. Ela consiste em reduzir a quantidade de código quando você quer transformar uma lista em outra. Hã? Como assim? Vamos supor que você tenha uma lista de strings maiúsculas e com espaçamentos em cada string, mas você deseja “limpar” esta lista (removendo os espaçamentos e deixando tudo em minúsculo) e atribuir os dados limpos a outra, como você faria isso?
Talvez faríamos da seguinte forma:

mylist = [' A ', ' B ', ' C ', ' D ', ' E ']
cleanedlist = []

for item in mylist:
    cleanedlist = mylist.strip().lower()

Esse é um código simples para uma tarefa simples. Perfeito! Vejo vocês na próxima aula 😉
Não, brincadeira! Esperem! Aplicando o conceito de Compreensão da Lista tem como simplificarmos ainda mais nosso código. Dêem uma olhada no seguinte exemplo:

mylist = [' A ', ' B ', ' C ', ' D ', ' E ']
cleanedlist = [item.strip().lower() for item in mylist]

Pronto! Reduzimos a lógica de limpeza e atribuição para apenas uma linha. Fantástico, não? Agora vamos entender o que está se passando ali. Em Compreensão da Lista lemos o código da direita para a esquerda, assim fica mais fácil de entender. Para cada item em mylist eu vou apagar os espaços em branco com o método split() e deixar a string em letra minúscula com o método lower(); após isso, vou atribuir essa nova lista para cleanedlist.

O Python é uma linguagem fantástica! Nunca deixe de explorar a fundo suas características, você não vai se arrepender 😉

Um abraço e até a próxima!