Skip to content

Goliass/django-blog

Repository files navigation

Objetivo

Projeto com o intuito de estudar / conhecer o framework web Django (Python), através da implementação de um blog simples (página inicial com título dos posts, e página do post em si)

A seguir imagens em ordem que, após a aplicação de um dos tópicos de "Como executar" (mais abaixo), exemplificam a fucionalidade e utilização do projeto:

1area_admin_login | 2area_admin_inicio_e_inclusao_post | 3area_admin_inclusao_post_campos | 4area_admin_inclusao_post_campo_content | 5site_pagina_inicial | 6site_pagina_post

Como executar localmente [no linux / WSL, e já tendo Python instalado]:

  • criar vars de ambiente em arquivo .env na raiz do projeto:

    SECRET_KEY=your_secret_key
    DEBUG=True
    ALLOWED_HOSTS=localhost, 127.0.0.1
    
  • na raiz do projeto, criar o ambiente virtual (assim os módulos / dependências Python são instalados apenas para este projeto, e não globalmente): $ python3 -m venv venv [apenas uma vez]

  • ativar este ambiente virtual: $ source venv/bin/activate

    • para desativar: $ deactivate
  • instalar as bibliotecas (dependências): $ pip install -r requirements.txt [apenas uma vez]

  • executar as migrations (aplica as alterações feitas nos models do projeto [ou provenientes dos models das bibliotecas / dependências instaladas] - inclusão de campo, exclusão de model, etc. - no esquema do banco de dados): $ python manage.py migrate [apenas uma vez]

  • executar o comando $ python manage.py collectstatic (para enviar os arquivos estáticos - css, imagens, etc. - para a pasta static)

    • se perguntar para sobrescrever (overwrite) os arquivos existentes, confirmar (digitar yes), e aguardar alguns segundos
  • rodar o servidor [Django] localmente: $ python manage.py runserver

    • [info] para parar o servidor, teclas ctrl c
  • abrir/clicar no link exibido no terminal, por ex: http://127.0.0.1:8000/

  • Será aberta a página inicial (home), mas não será exibido nenhum post, a menos que esteja cadastrado. Para isso:

    • criar usuário admininistrador / root: $ python manage.py createsuperuser

    • informar usuário/user, email [opcional] e senha/password

    • [se ainda não estiver rodando] rodar o servidor [Django] localmente: $ python manage.py runserver

    • abrir a url exibida no terminal no navegador, acrescentando /admin, por ex: http://127.0.0.1:8000/admin

      • preencher com o usuário/user e senha/password informados anteriormente

      • clicar em "Add"/"Adicionar" na seção "Posts"

      • preencher os campos

        • Se os campos "Content" e "Categories" não tiverem nenhuma opção para escolha, basta cadastrá-los clicando no botão "+" [visível ao lado de cada um destes campos]
      • clicar em "Save" / "Salvar"

      • Abrir nova aba no navegador, acessar a página inicial (por ex: http://127.0.0.1:8000) e clicar no post recém cadastrado.

        • [info] O post somente aparecerá na página inicial se, no momento da inclusão, o campo Status for igual a "Publish"
  • [infos] sobre as pastas media e static no projeto:

    • a pasta static contém os arquivos estáticos (css, imagens do site, etc.)
    • a pasta media pode conter os arquivos incluídos (anexos / uploads) em cada post (campo "Content"), por exemplo imagens

Como executar remotamente / "colocar no ar" (exemplo com deploy na plataforma Pythonanywhere):

  • [info] Porque foi escolhida esta plataforma (ao invés da Render, por ex) para deploy? Porque esta plataforma, na versão gratuita, tem um pequeno espaço para armazenamento (o qual possibilita armazenar as mídias - por ex imagens - e o banco de dados nativo do Django - SQLite - sem configurações adicionais), ou seja, sem a necessidade de configuração e integração do projeto (em Django) com um serviço de armazenamento externo (por ex Cloudinary)

  • criar conta na plataforma e logar

  • acessar o bash console ($) e, na pasta do seu usuário (ex /home/user/), criar e acessar a pasta projects:

    • [info] isso faz-se necessário apenas porque, o projeto local (no "pc") foi criado dentro desta pasta e, nesta plataforma, para o carregamento das variáveis de ambiente, considera um caminho/path a partir do diretório home do usuário, que precisa ser atribuído/fixo no código (ver "project_folder" abaixo)
    cd ~
    mkdir projects
    cd projects
  • seguir os passos de deploy da plataforma

    • para clonar o repositório do github para o Pythonanywhere, foi considerada a solução set up your ssh key do link acima.

    • se após os passos de deploy (link acima) ocorrer erro ao abrir o site, provavelmente é porque falta o próximo passo (criação das variáveis de ambiente)

    • [info] se for necessário reabrir o bash disponilizado pelo Pythonanywhere em seu site, para reativar o ambiente virtual (venv, por ex) - se você já aplicou os passos do link acima sobre deploy: $ workon venv

  • criar as seguintes variáveis de ambiente em arquivo .env na raiz do projeto:

    SECRET_KEY=your_secret_key
    DEBUG=False
    # valor do ALLOWED_HOSTS sem aspas, e hosts separados por vírgula (se mais do que um). Para este exemplo o valor é apenas um host, que é a url principal/domínio do site
    ALLOWED_HOSTS=exemplo.pythonanywhere.com
    
  • [info] para carregar as vars de ambiente (contidas no arquivo .env) na plataforma Pythonanywhere foi necessário considerar o load_dotenv() do settings.py da seguinte forma (1-normalmente nos projetos Django apenas é necessário o load_dotenv(); 2-diferente da documentação da plataforma, o código abaixo precisou ser considerado no arquivo settings.py- ao invés do que a doc da plataforma pedia, que era utilizar o código abaixo no "WSGI file" ):

    project_folder = os.path.expanduser('~/projects/django-blog')  # adjust as appropriate
    
    load_dotenv(os.path.join(project_folder, '.env'))
  • para usar / trabalhar com CSS, Javascript e outros arquivos estáticos na plataforma, seguir estes passos da página https://help.pythonanywhere.com/pages/DjangoStaticFiles :

    • opção "Set STATIC_ROOT in settings.py"
    • opção "Run pythonX.Y manage.py collectstatic"
    • opção "Set up a static files mapping"
  • Acessar a aba "Web" da plataforma Pythonanywhere no navegador, clicar em "Reload exemplo.pythonanywhere.com", aguardar finalizar e abrir o link do site em si (ao lado de "Configuration for"), por ex. exemplo.pythonanywhere.com

  • será aberta a página inicial (home), mas não será exibido nenhum post, a menos que esteja cadastrado. Para isso:

    • criar usuário admininistrador / root: $ python manage.py createsuperuser

    • informar usuário/user, email [opcional] e senha/password

    • abrir o site no navegador (link exibido na aba Web da plataforma Pythonanywhere) acrescido de /admin, por ex.: https://exemplo.pythonanywhere.com/admin

      • preencher com o usuário/user e senha/password informados anteriormente

      • clicar em "Add"/"Adicionar" na seção "Posts"

      • preencher os campos

        • Se os campos "Content" e "Categories" não tiverem nenhuma opção para escolha, basta cadastrá-los clicando no botão "+" [visível ao lado de cada um destes campos]
      • clicar em "Save" / "Salvar"

      • abrir o site no navegador (por ex. https://exemplo.pythonanywhere.com) e clicar no post recém cadastrado.

        • [info] O post somente aparecerá na página inicial se, no momento da inclusão, o campo Status for igual a "Publish"
  • [info] em relação aos arquivos de mídia (por ex imagem), não foi necessária nenhuma configuração.

    • o armazenamento é automático ao incluir (botão de upload / "Attach Files") e salvar por ex. uma imagem em um conteúdo (campo Content) de um post (provavelmente internamente a biblioteca de Rich text editor utilizada django-prose é quem faz este armazenamento)
  • [info] caso o repositório / código seja atualizado (por ex. novos commits), diferentemente de outras plataformas (que tem opções explicítas para deploy, por ex a Render), na Pythonanywhere a aplicação pode ser atualizada das seguintes formas:

    • git pull em linha de comando / bash (na raiz do projeto)

      • [info] se a atualização for de arquivos estáticos (CSS, Javascript, etc.), o comando $ python manage.py collectstatic deve ser executado novamente [lembrando de reativar o ambiente virtual - explicação acima - antes desse comando]
    • outras opções