DEV Community

Tiago M
Tiago M

Posted on

Criar um servidor em rede local com IIS e Django no Windows 10

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"

Imagem

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

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

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:
Imagem 4

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".
Imagem 5

Agora no lado direito, cliquem na opção que diz "Adicionar Aplicação..."
Imagem 6

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

Ainda na mesma janela cliquem em "(Coleção)" e de seguida nos 3 pontos.
Imagem 8

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

Imagem 10

Imagem 11

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

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

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

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

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

Após isso, do lado direito, deverá aparecer várias ações. Cliquemos em "Adicionar Mapeamento de Módulo...".
Imagem 17

Aparecerá uma janela igual a esta:

Imagem 18

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

No fim a janela deverá estar idêntica a esta imagem:
Imagem 20

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".
Imagem 21

Agora basta trocar o valor do item "Identidade" para "LocalSystem".
Imagem 22

Por fim, reiniciem o servidor e verifiquem se já têm acesso ao site.
Imagem 23

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

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

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

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

Imagem 27

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

E agora selecionamos o nosso módulo referente ao FastCgi e clicamos em "Remover".
Imagem 29

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)

Collapse
 
fassad profile image
Felipe Assad • Edited

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

Collapse
 
igorsantrocha profile image
Igor Santos Rocha

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






`

Collapse
 
igorsantrocha profile image
Igor Santos Rocha

Por algum motivo o código do config não foi direito:

<?xml version="1.0" encoding="UTF-8"?>
<!--Arquivo de configuração para rodar aplicação no IIS usando HttpPlatformHandler 
Depois de realizar os ajustes, basta salvar o arquivo na pasta raiz com o nome "web.config"-->
<configuration>
    <system.webServer>
      <validation validateIntegratedModeConfiguration="false" />
        <!--Altere stdoutLogEnabled para "true" para habilitar o arquivo de log-->
        <httpPlatform processPath="C:\Python311\python.exe" arguments="C:\inetpub\wwwroot\Pasta_raiz_projeto\manage.py runserver %HTTP_PLATFORM_PORT%" stdoutLogEnabled="false" stdoutLogFile="C:\inetpub\wwwroot\Pasta_raiz_projeto\logs_iis\myapp.log">
            <environmentVariables>
                <environmentVariable name="SERVER_PORT" value="%HTTP_PLATFORM_PORT%" />
            </environmentVariables>
        </httpPlatform>
        <handlers>
            <add name="MyPyHandler" path="*" verb="*" modules="httpPlatformHandler" resourceType="Unspecified" />
        </handlers>
    </system.webServer>
    <appSettings>
        <!--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. -->
      <add key=" PYTHONPATH" value=" C:\inetpub\wwwroot\Pasta_raiz_projeto" />  
      <add key="WSGI_HANDLER" value="django.core.wsgi.get_wsgi_application()" />
      <add key="DJANGO_SETTINGS_MODULE" value="Nome_Projeto.settings" />
    </appSettings>
</configuration>

Enter fullscreen mode Exit fullscreen mode
Collapse
 
leonine1983 profile image
leonine1983

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'

Collapse
 
leonine1983 profile image
leonine1983

Liquid syntax error: Unknown tag 'CSRF_token'

Collapse
 
ricardobotelhoti profile image
RicardoBotelhoTI

Tudo funcionando ok. Obrigado e parabéns pelo artigo, muito bem detalhado e elucidado. Me ajudou muito!!!