Introdução
Devido a um trabalho, precisei configurar uma WebApp, feita em Django, que deveria, apenas, funcionar em uma rede local.
Ela precisava ser hospedada em um computador com Windows 10 Home e executar python manage.py runserver
sempre que ligasse a máquina, não era o desejável.
Decidi, então, escrever este post com base neste outro artigo que apesar de cobrir grande parte dos passos necessários, faltaram alguns pormenores para que o servidor funcionasse a 100%.
Parto do princípio que o leitor já tenha configurado o seu projeto em Django, de forma a que possa funcionar tanto em um ambiente de desenvolvimento quanto em produção.
Ativar/Instalar IIS
O IIS (Internet Information Services) precisa ser ativo para vocês terem acesso à área de gestão do mesmo.
Sigam os seguintes passos:
Pesquisem por "Painel de Controlo" na barra de pesquisa do Windows e executem-no
De seguida, no canto superior direito, estará, em letras pequenas, a opção "Ver por:", devem selecionar "Categoria"
Cliquem em "Programas"
E por fim cliquem na opção "Ativar ou desativar funcionalidades do Windows"
Vai aparecer uma pequena janela com várias "pastas".
Devem procurar por uma pasta denominada de "Serviços de Informação Internet" e marquem-na.
Agora precisamos de expandir essa pasta, clicando no ícone "+"
De seguida expandimos a pasta "Serviços da World Wide Web" e, por fim, expandimos a pasta "Funcionalidades de Desenvolvimento de Aplicações".
Dentro dessa última, deverá constar algo chamado de "CGI" que tem de ser marcado também.
Após tudo isto, devem clicar em "OK" e o IIS deverá estar a funcionar. Para testar-mos isso, abrimos um navegador e colamos o seguinte URL: http://localhost
E se tudo estiver certo, aparecerá uma página idêntica a esta:
Não tenho a opção "Serviços de Informação Internet"
Caso não encontrem essa primeira pasta, tentem descarregar diretamente daqui e verifiquem se, após reiniciar o computador, já aparece a opção desejada.
Instalar o wfastcgi
Primeiramente, aconselho que criem um ambiente virtual para a vossa aplicação, já que eu irei demonstrar a configuração fazendo uso de um ambiente virtual.
Para criar um ambiente virtual, basta abrir um terminal/cmd no diretório raiz do vosso projeto (onde está o ficheiro manage.py
) e executar o seguinte comando: python -m venv env
- em que env
é o nome do vosso ambiente virtual.
Não necessita chamar-se assim, podem atribuir o nome que desejarem.
Para ativarem o ambiente, basta que nesse mesmo terminal/cmd, executem: .\env\Scripts\activate
- deverá aparecer um (env)
no lado esquerdo do vosso terminal/cmd.
Agora devem utilizar o pip
para instalar os vossos pacotes, como por exemplo, o Django e, obrigatoriamente, o wfastcgi: pip install Django wfastcgi
Configurar o FastCGI
Comecemos por abrir o Gestor de Serviços de Informação Internet (IIS). Dentro dele, vão clicar no nome do vosso computador (no canto superior esquerdo) e aparecerá um painel no centro, onde clicarão em "Definições de FastCGI".
Agora no lado direito, cliquem na opção que diz "Adicionar Aplicação..."
E agora terão uma janela, onde devem preencher os 2 seguintes espaços:
Caminho Completo: Caminho até ao vosso executável de python, o mesmo estará presente na vossa pasta de ambiente
env
.
Sendo assim, o caminho é algo deste tipo:C:\Users\Usuario\projeto_django\env\Scripts\python.exe
Argumentos: aqui vocês devem colocar o caminho até ao
wfastcgi.py
que também estará presente na vossa pasta de ambiente.
O caminho será algo assim:C:\Users\Usuario\projeto_django\env\Lib\site-packages\wfastcgi.py
Ainda na mesma janela cliquem em "(Coleção)" e de seguida nos 3 pontos.
Agora vamos criar 3 membros (clicando em adicionar) e vamos alterar o Name e o Value deles:
-
DJANGO_SETTINGS_MODULE:
- Name = DJANGO_SETTINGS_MODULE
- Value = nome_do_app.settings
-
WSGI_HANDLER:
- Name = WSGI_HANDLER
- Value = nome_do_app.wsgi.application
-
PYTHONPATH:
- Name = PYTHONPATH
- Value = Caminho\para\a\pasta\raiz\do\projeto
Vocês podem achar os 2 primeiros valores nos ficheiros do vosso projeto, sendo que o primeiro está no ficheiro wsgi.py
e o segundo no settings.py
na variável WSGI_APPLICATION
.
Deploy do site
Agora que configuramos a CGI (Common Gateway Interface), vamos colocar o nosso site no servidor.
Para isso precisam expandir o nome do computador/servidor, clicando na seta
De seguida, basta clicar em "Sites" e do lado direito aparecerá a opção "Adicionar Website...", na qual devem clicar.
Vai aparecer uma janela, e nela devem preencher o campo "Nome do site" com o nome que acharem melhor.
Para o campo "Caminho físico" basta clicarem nos 3 pontos e escolherem a pasta raiz do vosso projeto (lembrando que a pasta raiz é a pasta que contém o ficheiro manage.py
)
Devem testar se está tudo bem, clicando em "Definições de Teste...", se não estiver tudo verde, devem clicar em "Ligar como..", marcar "Utilizador específico" e clicarem em "Definir...".
O utilizador que colocarem, TEM de ter permissões na vossa pasta do projeto.
Depois voltem a testar e deverá aparecer algo deste género:
O último campo a preencher é o da "Porta" que no meu caso deixei como 8000.
A janela deverá ficar idêntica a esta:
Mapeamento de Processador
Bem agora temos de definir onde está o nosso site e selecionar a FastCGI que definimos nos passos anteriores.
Para isso vamos expandir "Sites" (do lado esquerdo) e clicar no nome do nosso site. De seguida, clicamos em "Mapeamento do Processador".
Após isso, do lado direito, deverá aparecer várias ações. Cliquemos em "Adicionar Mapeamento de Módulo...".
Aparecerá uma janela igual a esta:
Devemos preencher da seguinte forma:
Caminho do pedido:
*
Módulo: Selecionar "FastCgiModule"
Executável (opcional): Devem colocar o caminho para o executável do python,
|
e coloca-se o caminho para owfastcgi.py
. Aqui vai um exemplo:C:\Users\User\projeto_django\env\Scripts\python.exe|C:\Users\User\projeto_django\env\Lib\site-packages\wfastcgi.py
Nome: Colocar o nome que bem entenderem
Devem depois clicar em "Restrições de Pedido..." e desmarcar a opção "Invocar o processador apenas se o pedido estiver mapeado para:".
No fim a janela deverá estar idêntica a esta imagem:
Basta clicar em "OK" em tudo e caso apareça um Pop-up, cliquem em "Sim".
ALLOWED_HOSTS
É importante que no ficheiro settings.py
, na variável ALLOWED_HOSTS
coloquem dentro dessa lista tanto o "localhost"
quanto o IP da vossa máquina na rede local, exemplo: "192.168.20.135"
.
Podem ver o IPv4 utilizando o comando ipconfig
no CMD do Windows.
Agora basta vocês entrarem em http://localhost:8000 e ficarem frustrados...
ERROR 500 - FastCgi Desconhecido
Este foi o primeiro e único erro que me apareceu e pode ser facilmente mitigado, trocando a Identidade da nossa aplicação.
Bem para isto preciso que abram o vosso "Gestor de Serviços de Informação Internet".
Vão expandir o nome do vosso computador/servidor e clicar em "Conjuntos Aplicacionais".
Deverá aparecer o nome da aplicação no centro da janela e ao clicar no nome da vossa app, aparecerá, do lado direito, várias ações e vocês clicarão em "Definições Avançadas".
Agora basta trocar o valor do item "Identidade" para "LocalSystem".
Por fim, reiniciem o servidor e verifiquem se já têm acesso ao site.
Servir ficheiros estáticos
Após a resolução do erro citado acima, vocês poderão se deparar com um site que aparentemente não carregou os ficheiros CSS, JS nem imagens.
Para corrigirmos isso, vamos precisar criar alguns diretórios virtuais.
Vamos ao Python primeiro!
Antes de mais verifiquem se no fim do vosso ficheiro settings.py
, têm as seguintes variáveis devidamente declaradas:
Depois de verificar o código, devem gerar o vosso conteúdo estático, executando, dentro da pasta raiz, o seguinte comando:
python manage.py collectstatic
No meu caso, criar-se-á uma pasta static_root
com todos os meus ficheiros estáticos.
Voltando para o IIS
Para criarmos esses diretórios virtuais, temos de estar dentro do "Gestor de Serviços de Informação Internet", expandir o nome do computador/servidor, expandir "Sites" e, finalmente, clicar com o botão direito no nome do nosso site, para de seguida selecionarmos a opção "Adicionar Diretório Virtual...".
Na seguinte janela, devemos colocar o "Alias" como static
e no "Caminho físico", utilizamos os 3 pontos para selecionar a pasta criada pelo collectstatic
, contendo os vossos ficheiros estáticos (no meu caso é a pasta static_root
).
Lembrando que devem, novamente, testar as "Definições de Teste..." e caso dê erros/avisos, devem usar a opção "Ligar como..." e usarem um utilizador com as devidas permissões na pasta do site.
Repitam o mesmo processo para a pasta media
, alterando o Alias para media
e selecionando a pasta correta.
Mesmo fazendo isto, ainda não vai funcionar. Precisamos remover o mapeamento do módulo FastCgi destas pastas, já que elas são apenas pastas de ficheiros estáticos.
Para isso, clicamos no nosso diretório virtual (parece com o ícone de atalho) e de seguida, duplo clique em "Mapeamento do Processador".
E agora selecionamos o nosso módulo referente ao FastCgi e clicamos em "Remover".
Atenção: Devem fazer este processo em todos o vossos diretórios virtuais que sirvam ficheiros estáticos.
Agora voltem a reiniciar o vosso servidor e se tudo correr bem, terão o vosso site a funcionar normalmente.
Considerações finais
Quero pedir desculpa por toda a censura nos prints, mas eu fui tirando prints conforme fui fazendo os passos e não quero expor informações.
Qualquer coisa que não tenham entendido, erro gramatical ou alguma dúvida que tenham, podem deixar nos comentários, tentarei ajudar o melhor que conseguir.
Top comments (6)
Sucesso ! Realmente muito bem detalhado o post... apenas duas considerações a fazer:
1) As pastas virtuais precisam ser criadas na raiz do website... ou seja, se a pasta
static_root
estiver em /portal/static_root... o virtual deve ficar em /static para funcionar corretamente.2) Para aplicações django que usam SQL Server com pyodbc será necessário, no passo
ERROR 500 - FastCgi Desconhecido
, não pode ser LocalSystem, o sistema deve autenticar com o usuário atualmente conectado ao servidor e que possui permissão de leitura / escrita nos bancos de dados envolvidos, ex: DOMINIO\usuario e a senha.!(dev-to-uploads.s3.amazonaws.com/up...
Tudo funcionando ok. Obrigado e parabéns pelo artigo, muito bem detalhado e elucidado. Me ajudou muito!!!
Depois de muita pesquisa, descobri que o FastCGI já não tem mais suporte no Django e nem é mais mantido pela Microsoft.
Mas para os que assim como eu, não tem opção e precisa fazer funcionar, encontrei uma saída:
Ao invés do FastCGI, encontrei um utilitário chamado: HttpPlatformHandler
Você pode baixar e instalar ele direto do site da Microsoft e então seguir esse tutorial que encontrei: adrianjnkns.medium.com/django-on-i...
Caso você esteja vendo esse comentário no futuro e o tutorial já não esteja disponível, segue um exemplo do web.config do HttpPlatformHandler já funcionando:
`<?xml version="1.0" encoding="UTF-8"?>
<!--Altere stdoutLogEnabled para "true" para habilitar o arquivo de log-->
<!--Os espaços no início do key e do value já estavam aí quando eu copiei o config da internet. Não tentei tirar pois funciona assim. -->
`
Por algum motivo o código do config não foi direito:
Boa amigo. Meus parabéns pela postagem!! Preciso muito da ajuda de vocês. Fiz o deploy da aplicação django para o IIS no windows em servidor local e o servidor não está aceitando requisições POST, sempre dá erro de csrf_token. Lembrando que todos os meus forms possuem a tag csrf_token e funcionam corretamente se acessado do IP 127.0.0.0 ou localhost
Segue parte do meu settings.py
import os
from pathlib import Path
from django.contrib.messages import constants
from dotenv import load_dotenv
load_dotenv()
BASE_DIR = Path(file).resolve().parent.parent
SECRET_KEY = os.environ.get('SECRET_KEY', 'INSECURE')
DEBUG = False
Local Network IP 192.168.10.24"
CSRF_TRUSTED_ORIGINS = ['192.168.10.24']
ALLOWED_HOSTS = ['*']
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
#restrição por grupo 'django_group_role', 'guardian'
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'Access_Login',
'Atendimento',
'Triagem',
'Medicos',
'utils',
'websocket_app',
#'channels',
'django.contrib.humanize',
'configUPA',
'PrintPDFs',
'ckeditor'
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
# SessionMiddleware é o responsável gerenciar as sessões de usuarios
'django.contrib.sessions.middleware.SessionMiddleware',
# ----------------------------------------------------------
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
Section configured to use session storage in cache
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
--------------------------------------------------------------
ROOT_URLCONF = 'upa.urls'
Liquid syntax error: Unknown tag 'CSRF_token'