10 dicas insanamente úteis sobre Django

Existem alguns pequenos truques e dicas excelentes que alguém poderia usar em seus projetos Django que acelerariam o desenvolvimento e evitariam muitas dores de cabeça a longo prazo. Do básico ao obscuro, essas dicas podem ajudar qualquer nível de habilidade do programador a se tornar mais adepto do Django e de toda a sua glória.

Django é um excelente framework para Python. Embora possa não receber tanta tinta quanto outros frameworks populares como o Rails, é um framework polido tanto quanto qualquer outro. Ele coloca muita ênfase no princípio DRY (Don’t Repeat Yourself) na codificação limpa, automatizando muitos dos processos na programação.

1. Use caminhos relativos na configuração

Caminho relativo significa usar o caminho relativo ao diretório de trabalho atual para definir arquivos em vez de codificar o caminho completo. Por alguma razão, os projetos tendem a ser movidos de lugar de tempos em tempos. Isso pode ser um urso absoluto para lidar se você não planejar com antecedência para a possibilidade. Se você não usar caminhos relativos, o projeto será interrompido se outra pessoa estiver trabalhando no mesmo projeto ou se o aplicativo for implantado no servidor. Rob Hudson tem uma técnica excelente para garantir que suas implantações do Django possam ser movidas com facilidade, tendo apenas que editar algumas linhas de código em seus arquivos de configurações.

Meu arquivo de configurações padrão do Django mudou ao longo do tempo para agora incluir configurações que não dependem da localização do projeto no sistema de arquivos. Isso é ótimo em um ambiente de equipe em que mais de uma pessoa está trabalhando no mesmo projeto ou ao implantar seu projeto em um servidor Web que provavelmente possui caminhos diferentes para o diretório raiz do projeto.

A maneira correta de definir os diretórios estáticos é seguindo o caminho relativo. Por padrão, o Django fornece a BASE_DIR e ainda dá uma dica de como definir seus caminhos.

1
# Build paths inside the project like this: BASE_DIR / 'subdir'.

2
BASE_DIR = Path(__file__).resolve().parent.parent

Aqui está como você definiria o STATIC_ROOT e a MEDIA_ROOT diretórios.

1
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
2
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

2. Use o {% url %} Marcação

Em vez de codificar links individuais, tente usar o compatível com versões anteriores {% url %} tag para obter o mesmo resultado. Isso lhe dará o absoluto URL, de modo que, se Deus o livre, seu projeto Django mover os links ainda permanecerão intactos.

Essencialmente {% url %} pega um nome de exibição e seus parâmetros e faz uma pesquisa reversa para retornar o URL consultado. Se você fizer alterações em seu urls.py arquivo, os links não serão quebrados.

Embora não seja a dica mais avançada, é uma excelente técnica para usar em seus projetos Django.

3. Use select_related e prefetch_related

Consultas desnecessárias sempre terão efeitos adversos no desempenho do banco de dados. Os bancos de dados usam chaves estrangeiras e relacionamentos muitos-para-muitos para gerenciar relacionamentos entre tabelas. select_related permite que os desenvolvedores busquem objetos relacionados em um relacionamento de chave estrangeira, enquanto prefetch_related permite que os desenvolvedores busquem objetos relacionados em muitos para muitos ou revertam relacionamentos de chave estrangeira. Esses dois métodos permitirão reduzir o número de consultas feitas ao banco de dados. Por exemplo, suponha que você tenha os seguintes modelos:

1
class Author(models.Model):
2
    full_name = models.CharField(max_length=100)
3

4
    def __str__(self):
5
        return self.full_name
6

7
   
8
class Course(models.Model):
9
    title = models.CharField(max_length=100)
10
    description = models.TextField()
11
    author = models.ForeignKey(Author)
12

13

14
    def __str__(self):
15
        return self.title

Permite realizar consultas usando select_related e prefetch_related.

1
>>> from mysite.models import Course,Author
2
>>> tutorials = Course.objects.select_related('author').all()
3
>>> tutorials
4
[, , ]>
5
>>> tutorials1 = Course.objects.prefetch_related('author').all()
6
>>> tutorials1
7
[, , ]>
8
>>> 

4. Use um servidor de mídia separado

Django permite que você servir arquivos estáticos em seu ambiente de desenvolvimento, mas não é seu ambiente de produção. Por que? Não é eficiente.

Servir arquivos estáticos no mesmo servidor que seu aplicativo Django pode tornar as coisas mais lentas. A melhor solução é usar um servidor dedicado como nginx, um serviço de nuvem ou um CDN. Algumas das soluções de serviço de nuvem de armazenamento disponíveis são:

  • Cloudinário
  • Amazon S3
  • Armazenamento em nuvem do Google
  • Armazenamento de arquivos do Azure

Eles fornecem uma maneira mais rápida de servir arquivos estáticos, melhorando assim o desempenho do seu site. Ao usar um servidor separado para hospedar e servir esses arquivos estáticos, seu desempenho não será prejudicado. Se você não quiser comprar um servidor, você pode usar Amazon S3 para hospedar os arquivos de forma relativamente barata.

O Django deliberadamente não serve mídia para você, e foi projetado dessa forma para salvá-lo de si mesmo. Se você tentar servir a mídia da mesma instância do Apache que está servindo o Django, você vai acabar com o desempenho. O Apache reutiliza processos entre cada solicitação, portanto, uma vez que um processo armazena em cache todo o código e bibliotecas do Django, eles permanecem na memória. Se você não estiver usando esse processo para atender a uma solicitação do Django, toda a sobrecarga de memória será desperdiçada.

5. Use a barra de ferramentas do depurador

Ferramentas de depuração para qualquer linguagem são inestimáveis. Eles aceleram o desenvolvimento detectando erros em seu código e possíveis armadilhas que podem acontecer. A barra de ferramentas de depuração do Django para ajudar na depuração do código e pode ajudar muito qualquer desenvolvedor.

A própria barra de ferramentas é um middleware que instancia cada objeto de painel mediante solicitação e realiza o processamento e a renderização à medida que a resposta é gravada de volta no navegador. Dessa forma, é essencialmente um conjunto de classes de middleware (os painéis) agrupadas para exibir uma única barra de ferramentas. Cada painel subclasse uma classe de painel base e substitui alguns métodos para renderizar a barra de ferramentas.

A barra de ferramentas de depuração do Django também é usada para observar consultas lentas e pode ajudar na otimização do banco de dados. Aqui está uma captura de tela mostrando a barra de ferramentas em ação.

barra de ferramentas de depuração do Djangobarra de ferramentas de depuração do Djangobarra de ferramentas de depuração do Django

6. Use o teste de unidade do Django

O teste de unidade é uma ótima maneira de garantir que suas alterações no código funcionem conforme o esperado e não quebrem nenhum código antigo para manter a compatibilidade com versões anteriores. Um ótimo recurso do Django é que é incrivelmente fácil escrever testes de unidade. O Django oferece a capacidade de usar o doctest ou unittest diretamente da caixa.

A documentação do Django oferece um ótimo tutorial e alguns exemplos de código sobre como configurar testes de unidade para manter seu código rodando sem problemas e detectar quaisquer bugs desagradáveis.

7. Use um ambiente virtual para gerenciar dependências

Ao contrário de outras linguagens de programação, o Python não é bom para gerenciar dependências de aplicativos. Os ambientes virtuais permitem separar as dependências do sistema das dependências do aplicativo. Por exemplo, suponha que você tenha o Python 3.9 globalmente instalado em seu sistema operacional. Nesse caso, um ambiente virtual permitirá que você use diferentes versões do Python em diferentes projetos na mesma máquina. Outra ótima dica é usar o requisitos.txt arquivo para listar todas as bibliotecas ou pacotes usados ​​em seu projeto.

Versões diferentes de pacotes específicos podem causar problemas. Se você estiver interessado, você pode leia mais sobre ambientes virtuais.

8. Use exibições baseadas em classe

O Django fornece visualizações baseadas em classes que abstraem a implementação de algumas tarefas repetitivas. As exibições baseadas em classe são reutilizáveis ​​e facilitam a adição de lógica com alterações mínimas de código. Por exemplo, observe o código abaixo para enviar um formulário usando exibições baseadas em classe e de função.

1
# function based view

2

3
def member_form(request):
4
    if request.method == 'POST':
5
        form = MemberForm(request.POST)
6
        if form.is_valid():
7
            member = Member( 
8
                first_name = request.POST['first_name'],
9
                last_name = request.POST['last_name'],
10
                email = request.POST['email'],
11
                address = request.POST['address'],
12
                mobile = request.POST['mobile'])
13
            member.save()
14
            return HttpResponse("Member Added")
15
 
16

17
    else: 
18
        form = MemberForm()
19

20
    return render(request, 'mysite/member_form.html', {'form': form})
21

22

23

24
# Class Based View: 

25

26
from django.views.generic import CreateView
27
from .models import Member
28

29
class SubmitFormView(CreateView):
30
    model = Member 
31
    fields = ['first_name', 'last_name', 'email', 'address', 'mobile'] 
32
    template_name = 'mysite/member_form.html' 
33

34
    def form_valid(self, form): 
35
        form.save() 
36
        return HttpResponse("Member Added")

Como você pode ver acima, a visualização baseada em classe precisará de alterações mínimas se a lógica mudar.

9. Use Memcache

Se o desempenho for um problema com seu aplicativo desenvolvido com Django, você desejará instalar algum tipo de cache. Embora o Django ofereça muitas opções de cache, a melhor de longe é o memcached. Outros tipos de cache disponíveis no Django incluem

  • cache de banco de dados
  • cache do sistema de arquivos
  • cache local
  • cache fictício

10. Pare de hackear scripts juntos e apenas use Django

Se você ainda não entende totalmente o poder do Django, há um raciocínio lógico para usar o Django em seu próximo projeto: você economiza tempo combinando projetos com diferentes conjuntos de software. De acordo com Jeff Croft, um dos co-criadores do Django,

Agora, se você está acostumado a criar sites usando um aplicativo de blog (WordPress, TXP, etc.) como um CMS, está acostumado a obter tudo isso de graça. Mas você também está incorporando muitas coisas que talvez não queira (a menos, é claro, que esteja criando um blog). A limitação que encontrei ao usar um aplicativo de blog para meu site pessoal é que eu queria que fosse mais do que apenas um blog. Assim que tentei hackear um blog em uma galeria de fotos, ou um feed de links, ou um banco de dados de estatísticas, um jogo de Sudoku ou qualquer outra coisa que eu pudesse pensar, as coisas começaram a ficar complicadas. Também construí um site no qual tentei usar um aplicativo de fóruns de discussão (vBulletin) como um CMS, e tive os mesmos resultados. Funcionou – mais ou menos – mas não era extensível, era muito hackeado e geralmente era deselegante.
Com o Django, você obtém todas essas coisas e nenhuma das limitações de um aplicativo de blog.

O Django permite que você expanda seu site literalmente em qualquer direção sem ter que se preocupar em hackear o design ou garantir que os scripts e bancos de dados sejam compatíveis. É só funciona.

Deixe uma resposta