Skip to content

djangonauta/django-template

Repository files navigation

Instalação

As seguintes váriaveis devem ser definidas no arquivo projeto/settings/.env (exemplos):

SECRET_KEY='ztibsdwjar1v1pnp-6osx@r(1@!mfklak0$acg9^l^ut!7!sf1'
DATABASE_URL='postgres://postgres:admin@localhost:5432/django-template'
ADMINS='[email protected]'
EMAIL_URL='consolemail://:@'
#EMAIL_URL='postoffice://:@localhost:1025'
CACHE_URL='redis://:admin@localhost:6379'
BROKER_URL='amqp://rabbitmq:admin@localhost:5672/projeto'
DISABLE_ACCOUNT_REGISTRATION='False'
ACCOUNT_EMAIL_VERIFICATION='none'
CSRF_TRUSTED_ORIGINS='https://localhost'
AUTH_LDAP_SERVER_URI='ldap://localhost'
AUTH_LDAP_USER_DN_TEMPLATE='uid=%(user)s,ou=Usuarios,dc=jus,dc=br'

LOGS

O diretório de logs de desenvolvimento deve ser criado na raiz do projeto.

mkdir logs
sudo mkdir -p /var/log/celery/
sudo chown usuario:grupo -R /var/log/celery/
sudo mkdir -p /var/log/gunicorn/
sudo chown usuario:grupo -R /var/log/gunicorn/

Poetry

Poetry é utilizado para gerenciar as dependências do projeto. As instruções de instalação podem ser obtidas no site oficial, ou simplesmente utilizando pip:

curl -sSL https://install.python-poetry.org | python3 -

Os seguintes comandos são utilizados para instalar as dependências do projeto.

cd projeto  # move para o diretório do projeto
`poetry env activate`  # ativa o ambiente virtual. Atenção para as crases ao redor do comando.

Caso o comando acima não funcione, utilize:

$(poetry env activate)

Dependências de produção

arrow celery crispy-bootstrap5 django django-allauth django-auditlog django-auth-ldap django-celery-beat django-celery-results django-cors-headers django-crispy-forms django-csp django-environ django-extensions django-extra-fields django-filter django-formtools django-guardian django-hijack django-model-utils django-pipeline django-post-office django-prometheus django-redis django-rest-auth django-select2 django-structlog[celery] django-view-breadcrumbs django-weasyprint django-widget-tweaks djangorestframework djangorestframework-guardian2 djangorestframework-simplejwt drf-spectacular drf-spectacular-sidecar gunicorn hiredis invoke pillow psycopg[binary] pygraphviz redis setuptools weasyprint whitenoise

Dependências de desenvolvimento

black commitizen coverage django-debug-toolbar fabric factory-boy flake8 ipython isort pyopenssl selenium werkzeug

Ambiente de Desenvolvimento

poetry install --with dev  # instala as dependências do projeto incluindo as de desenvolvimento (opcionais)

Ambiente de Produção

poetry install  # instala as dependências do projeto excluindo as de desenvolvimento (opcionais)

POSTGRES

Criação dos schemas no docker.

docker exec -it postgresql-17 psql -U postgres -d database -c "create schema arquitetura authorization postgres;"
docker exec -it postgresql-17 psql -U postgres -d database -c "create schema administrativo authorization postgres;"

Com as dependencias instaladas e o ambiente virtual ativado, é possível executar o comando acima com pyinvoke:

inv criar-schemas --database database --container postgresql-17 --usuario postgres

Certificado teste

openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -sha256 -days 365

RunServer Plus

Utilizado em conjunto com whitenoise para servir arquivos estáticos.

./manage.py runserver_plus --cert-file cert.crt --settings projeto.settings.whitenoise 0.0.0.0:8000

O comando anterior pode ser simplificado usado pyinvoke:

inv runserverplus

RabbitMQ

Remover usuário guest:

sudo rabbitmqctl delete_user guest

Adicionar VHOST do projeto:

sudo rabbitmqctl delete_vhost /
sudo rabbitmqctl add_vhost <vhost_projeto>

Adicionar usuário:

sudo rabbitmqctl add_user <usuario> <senha>

Atribuir permissões:

sudo rabbitmqctl set_permissions -p <vhost_projeto> <usuario> ".*" ".*" ".*"

Ativar inteface web localhost:15672

sudo rabbitmq-plugins enable rabbitmq_management # ativar o plugin
sudo rabbitmqctl set_user_tags <usuario> administrator # adicionar permissão ao usuário

Prometheus

/etc/prometheus/prometheus.yml

scrape_configs:
    ...

  - job_name: 'django_app'
    static_configs:
      - targets: ['<IP_DO_SERVIDOR>:<PORTA>']

Invoke

O arquivo de configuração invoke.yaml pode ser colocado na raiz do projeto (ao lado de tasks.py):

sudo:
  password: "" # apenas se alguma tarefa em tasks.py usar sudo
run:
  echo: true
  pty: true

Paginação

  1. Herdar de ElidedListView
  2. Definir paginate_by
  3. Criar e adicionar um FilterSet
  4. Incluir o template do paginador

Exemplo:

from django_filters import CharFilter, FilterSet

class ArtigoFilter(FilterSet):
    titulo = CharFilter(lookup_expr='iexact')

    class Meta:
        model = Artigo
        fields = ('id', 'titulo')


class ArtigoView(ElidedListView):
    model = Artigo
    template_name = 'artigos.html'
    context_object_name = 'artigos'
    paginate_by = 3
    filterset_class = ArtigoFilter


artigo_view = ArtigoView.as_view()
// tabela ou form
// ...

{% include "_includes/paginador.html" %}

Guardian

class ArtigoListView(PermissionListMixin, ElidedListView):
    template_name = 'artigos.html'
    queryset = Artigo.objects.all()
    context_object_name = 'artigos'
    permission_required = 'artigos.view_artigo'
    get_objects_for_user_extra_kwargs = dict(
        # leva em consideração apenas as permissões de objeto, não as globais (lista filtrada).
        accept_global_perms=False
    )
    paginate_by = 3
    filter_class = ArtigoFilter


artigo_view = ArtigoListView.as_view()


class ArtigoDetailView(PermissionRequiredMixin, generic.DetailView):
    template_name = 'artigo.html'
    model = Artigo
    context_object_name = 'artigo'
    permission_required = 'artigos.view_artigo'
    # ao acessar o recurso, 403 é retornado e processado por exception.
    return_403 = True
    raise_exception = True


artigo_detalhe = ArtigoDetailView.as_view()

DRF

class ArtigoSerializer(ObjectPermissionsAssignmentMixin, ModelSerializer):
    class Meta:
        model = models.Artigo
        fields = '__all__'

    def get_permissions_map(self, created):
        current_user = self.context['request'].user
        # group = Group.objects.get()
        return {
            'artigos.view_artigo': [current_user], # 'artigos.view_artigo': [current_user, group],
        }


class ArtigoViewSet(ModelViewSet):
    serializer_class = ArtigoSerializer
    queryset = models.Artigo.objects.all()
    permission_classes = [CoreObjectPermissions]
    filter_backends = [ObjectPermissionsFilter]

About

Simple django project template

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published