Criar um servidor em rede local com IIS e Django no Windows 10
Tags: portugues, django, webdev, windows
Published: 2021-06-28 02:57:52

## 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](https://nspointers.com/os/windows-server/deploy-django-web-on-iis/) 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"

![Imagem](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kizlmn8wx7i2n6q5l7s4.png)

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 "+"
![Imagem 2](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qpdyldah6zl12mc2t363.png)

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.
![Imagem 3](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/acilqp9akattw0lldbl0.png)

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](http://localhost)

E se tudo estiver certo, aparecerá uma página idêntica a esta:
![Imagem 4](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hea4qpb44vg38xeqadcc.png)



### Não tenho a opção "Serviços de Informação Internet"
Caso não encontrem essa primeira pasta, tentem descarregar diretamente [daqui](https://www.microsoft.com/en-us/download/details.aspx?id=48264) 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".
![Imagem 5](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/stgfvipgkhzbq9u824fu.png)

Agora no lado direito, cliquem na opção que diz "Adicionar Aplicação..."
![Imagem 6](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/th9z5tomatb5mnotgr19.png)

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`

![Imagem 7](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6ldyc7l5neajc5v5ueta.png)


Ainda na mesma janela cliquem em "(Coleção)" e de seguida nos 3 pontos.
![Imagem 8](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uufozpj1rnt3hy0hg46k.png)

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`.

![Imagem 9](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/s4ibpnaqy4hf6pli6ygf.png)

![Imagem 10](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ps3u2ccb0fi0rcfajnul.png)

![Imagem 11](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5a6uzlnc3ayhyjqrcx79.png)


## 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
![Imagem 12](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/50xfe4f3l4g3kpjvjkg4.jpg)

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...".
![Imagem 13](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8ugyzw2hzx3qvrkj7po6.png)

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:
![Imagem 14](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e22d58cn5tyj94gfw3f8.png)

O último campo a preencher é o da "Porta" que no meu caso deixei como 8000.

A janela deverá ficar idêntica a esta:
![Imagem 15](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/i7w40m1c422t28gl3q10.png)

## 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".
![Imagem 16](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/13uz3pqggkq02gpkdf9l.png)

Após isso, do lado direito, deverá aparecer várias ações. Cliquemos em "Adicionar Mapeamento de Módulo...".
![Imagem 17](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h6zq075xxm158nbazhh7.png)

Aparecerá uma janela igual a esta:

![Imagem 18](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vkh1ffyrg3z25igcjpqi.png)

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 o `wfastcgi.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:".
![Imagem 19](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fuibia1ysoomocq2ensb.png)

No fim a janela deverá estar idêntica a esta imagem:
![Imagem 20](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/i3ip7obwqccavkstxvsy.png)

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](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".
![Imagem 21](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6bs7katsjnhrtoe5fltf.png)

Agora basta trocar o valor do item "Identidade" para "LocalSystem".
![Imagem 22](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z63dxmt2rl7tlc5r8p5r.png)

Por fim, reiniciem o servidor e verifiquem se já têm acesso ao site.
![Imagem 23](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oszz8ih90haufnulf2cw.png)

## 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:
![Imagem 24](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vdlv3ahxqc8nq9klabg7.png)

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...".
![Imagem 25](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7c79lw2y807g9cxaueim.png)

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**.
![Imagem 26](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jhfj4mdzoln9r3nw9b6g.png)

Repitam o mesmo processo para a pasta `media`, alterando o Alias para `media` e selecionando a pasta correta.

![Imagem 27](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8fhz5obdlylygpeiy1jt.png)


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".
![Imagem 28](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/09ik9shgx7z53875qr4x.png)

E agora selecionamos o nosso módulo referente ao FastCgi e clicamos em "Remover".
![Imagem 29](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2f4v6ckcne7boj3kreoq.png)

**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.