Como o Django / WSGI e PHP podem compartilhar / no Apache?

2

Eu tenho um servidor rodando um site PHP, assim como alguns aplicativos do Django.

Atualmente, uma configuração do VirtualHost para o PHP escuta na porta 80, e solicitações para certos diretórios são intermediadas por proxy para uma configuração do VirtualHost para Django com WSGI.

Eu gostaria de mudar isso, então o Django lida com qualquer coisa que não exista como um script PHP ou arquivo estático.

Por exemplo,

/ - > analisado pelo PHP como index.php
/page.php - > analisado como PHP normalmente /images/border.jpg - > servido como um arquivo estático
/ johnfreep - > manipulado pelo Django (interpretado por urls.py)
/ pages / john - > manipulado pelo Django
/ (qualquer outra coisa) - > manipulado pelo Django

Eu tenho algumas ideias. Parece que as opções são 'php first' ou 'wsgi first'.

  • configure o Django na porta 80, e configure o Apache para pular todos os arquivos conhecidos de PHP, CSS ou imagem. Talvez usando o SetHandler? Qualquer outra coisa vai para o Django para ser analisada pelo urls.py.

  • Configure um script referindo tudo ao Django como um manipulador 404 no PHP. Portanto, se um arquivo não for encontrado para um nome, ele envia o caminho da requisição para um VirtualHost que está executando o Django para ser analisado.

por Mark Snidovich 25.01.2011 / 02:13

1 resposta

4

Use o método descrito em:

link

Assim, temos a configuração do DocumentRoot como normal para arquivos estáticos e arquivos php, etc. Em seguida, adicione:

AddHandler wsgi-script .wsgi

para o bloco Directory para DocumentRoot, ou globalmente para o servidor.

Você precisará ter:

Options ExecCGI

ativado para o DocumentRoot agora, se você ainda não o fez.

Em seguida, adicione também:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /site.wsgi/$1 [QSA,PT,L]

em que site.wsgi está no DocumentRoot e é o arquivo de script WSGI que mapeia para seu aplicativo Django.

No arquivo de script Django WSGI, altere-o para usar:

import django.core.handlers.wsgi

_application = django.core.handlers.wsgi.WSGIHandler()

import posixpath

def application(environ, start_response):
    # Wrapper to set SCRIPT_NAME to actual mount point.
    environ['SCRIPT_NAME'] = posixpath.dirname(environ['SCRIPT_NAME'])
    if environ['SCRIPT_NAME'] == '/':
        environ['SCRIPT_NAME'] = ''
    return _application(environ, start_response)

Deve ser isso.

Qualquer solicitação mapeada para um recurso real baseado em arquivo em DocumentRoot, seja arquivo estático ou arquivo php, incluindo a configuração por DirectoryIndex, por exemplo, index.php, será tratada normalmente. Qualquer outra URL que, de outra forma, resultaria em 404, será roteada para o aplicativo Django.

O / johnfreep e / pages / john teriam que ter o URL correspondente como se estivesse montado na raiz, no arquivo urls.py.

Se o Django não souber o que fazer com uma URL, o Django retornará 404.

Leia o documento wiki para mais informações.

    
por 25.01.2011 / 04:20