#Drop – O melhor framework web do Universo

Só começo este post dizendo que o título é mentira. Mas já que você chegou aqui, não custa nada conhecer mais sobre esse framework massa demais chamado Django, certo?.

O que é?

Django é um framework web (dãa) que possui como melhor qualidade a comunidade e os ótimos artigos. A curva de aprendizado não é tão simples assim e os conceitos um pouco díficeis, mesmo para quem vem de outros frameworks web, contudo os ótimos artigos e a ótima documentação permitem que qualquer pessoa com pouquíssima experiência em Python comece a criar coisas em Django se dedicar o tempo necessário para aprender.

Arquitetura

Uma aplicação Django é dividida em apps. E apps são somente pacotes para serem utilizados dentro de aplicações Django. A principal característica de um bom app é sua reusabilidade mas isso não significa que apps devem ser pequenos mas sim, modulares, de forma que eles possam ser removidos(ou substítuidos) sem que haja tantas implicações no projeto.

Tudo isso é gerenciado por um app principal que possui um arquivo chamado settings.py, basicamente  é dele que vem todas as configurações iniciais da sua aplicação Django, é importante compreender quase todos os parâmetros colocados dentro deste settings.py se você estiver sério em construir um app django de qualidade.

Principais Componentes

Existem dois componentes principais em Django: Views e Models. 

Onde as Views são responsáveis por gerenciar o acesso aos Dados e como as respostas às URLs irão acontecer e definidas no arquivo views.py. E os Models por definir a comunicação com o DB e definidos no arquivo models.py.

Exemplo de Views:

class CreateCategory(LoginRequiredMixin, views.StaffuserRequiredMixin, LogMixin, CreateView):
    log_component = 'category'
    log_action = 'create'
    log_resource = 'category'
    log_context = {}

    login_url = reverse_lazy("users:login")
    redirect_field_name = 'next'
    
    form_class = CategoryForm
    template_name = 'categories/create.html'
    success_url = reverse_lazy('categories:index')

    def get_initial(self):
        initial = super(CreateCategory, self).get_initial()

        if self.kwargs.get('slug'):
            category = get_object_or_404(Category, slug = self.kwargs['slug'])
            initial = initial.copy()

            initial['description'] = category.description
            initial['name'] = category.name
            initial['visible'] = category.visible
            initial['coordinators'] = category.coordinators.all()

            self.log_action = 'replicate'

            self.log_context['replicated_category_id'] = category.id
            self.log_context['replicated_category_name'] = category.name
            self.log_context['replicated_category_slug'] = category.slug

        return initial

    def get_context_data(self, **kwargs):
        context = super(CreateCategory, self).get_context_data(**kwargs)
        context['users_count'] = User.objects.all().count()
        context['switch'] = True

        if self.kwargs.get('slug'):
            context['title'] = _('Replicate Category')
        else:
            context['title'] = _('Create Category')

        if 'categories' in self.request.META.get('HTTP_REFERER'):
            context['template_extends'] = 'categories/list.html'
            context['settings_menu_active'] = "settings_menu_active"
        else:
            context['template_extends'] = 'subjects/list.html'
            context['subjects_menu_active'] = 'subjects_menu_active';

        return context

    def form_valid(self, form):
        self.object = form.save()
        
        self.log_context['category_id'] = self.object.id
        self.log_context['category_name'] = self.object.name
        self.log_context['category_slug'] = self.object.slug

        super(CreateCategory, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)

        return super(CreateCategory, self).form_valid(form)

    def get_success_url(self):
    
        objeto = self.object.name
        messages.success(self.request, _('Category "%s" register successfully!')%(objeto))
        return reverse_lazy('categories:index')

Exemplo de Models:

from django.db import models
from autoslug.fields import AutoSlugField
from django.utils.translation import ugettext_lazy as _
from users.models import User

class Category(models.Model):
	"""Represents a Course """

	name = models.CharField(_("Name"), max_length = 100, blank = False, null = False, unique = True)
	slug = AutoSlugField(_("Slug"), populate_from = 'name', unique = True)
	description = models.CharField(_("description"), max_length = 300,blank = True, null = True)
	visible = models.BooleanField(_("visible"), default = True)
	coordinators = models.ManyToManyField(User, related_name = "coordinators", blank = True)
	create_date = models.DateTimeField(_('Creation Date'), auto_now_add = True)
	modified_date = models.DateTimeField(_('Modified Date'), auto_now_add = True)

	REQUIRED_FIELDS = ['name',]
	class Meta:
		verbose_name = _('Category')
		verbose_name_plural = _('Categories')

	def __str__(self):
		return self.name

Provavelmente surgiu a dúvida na sua cabeça: de onde o Django acerta quais Views utilizar?

Todos os apps em Django possuem um arquivo chamado urls.py, nele, Django utiliza de regex para criar uma conexão entre um caminho (ex: http://www.teste.com/users/1 ) no browser e uma determinada View, com isso, você não precisa se preocupar muito sobre o que acontece por debaixo dos panos (como a aplicação lê o caminho, transforma em View e como responde ao Browser) e sim sobre o que a sua View vai retornar como resposta.

Exemplo de urls.py:

from django.conf.urls import url
from . import views

urlpatterns = [
	url(r'^$', views.IndexView.as_view(), name='index'),
	url(r'^create/$', views.CreateCategory.as_view(), name='create'),
	url(r'^delete/(?P<slug>[\w_-]+)/$', views.DeleteCategory.as_view(), name='delete'),
	url(r'^replicate/(?P<slug>[\w_-]+)/$', views.CreateCategory.as_view(), name='replicate'),
	url(r'^update/(?P<slug>[\w_-]+)/$', views.UpdateCategory.as_view(), name='update'),
	url(r'^view_log/(?P<category>[\w_-]+)/$', views.category_view_log, name = 'view_log')
]

Os modelos dentro de cada app, por sua vez, são definidos por classes que herdam (geralmente) da classe models.Model padrão do Django, que possuem vários tipos de campos prontos onde o Django framework cuida para o desenvolvedor de como o DB vai ser construido através destes modelos, um conceito importante para entender de frameworks como Django são as migrations, que irei explorar em outros posts.

Então galera, é isso, seguem uns links que podem ajudar à aqueles que procuram se aprofundar mais (e questionar se eu falei alguma besteira por aqui):

(Documentação) https://docs.djangoproject.com/en/1.11/

(Views) https://docs.djangoproject.com/en/1.11/topics/http/views/

(Apps reusáveis) https://docs.djangoproject.com/en/1.11/intro/reusable-apps/

 

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s