2009-05-19 11 views
11

Nuovo di zecca per il web design, usando python. Ottenuto Apache attivo e funzionante, testare lo script Python funzionante nella directory cgi-bin. Ottieni risultati validi quando digito esplicitamente l'URL: ".../cgi-bin/showenv.py"Come nascondere "cgi-bin", ".py", ecc. Dai miei URL?

Ma non voglio che l'URL sia così. Qui ad StackOverflow, ad esempio, gli URL che vengono visualizzati nella mia barra degli indirizzi non hanno mai i dettagli disordinati che mostrano lo script utilizzato per eseguirli. Sono puliti da estensioni cgi-bin, .py, ecc. Come lo faccio?

EDIT: Grazie per le risposte, ogni singolo utile, molto da imparare. Sto andando con URL riscrittura per ora; l'esempio nei documenti sembra estremamente vicino a ciò che voglio realmente fare. Ma sono impegnato con Python, quindi dovrò guardare al WSGI lungo la strada.

+1

.. Mi chiedo se questa domanda è più adatta a serverfault.com? (dal momento che si tratta veramente di configurare apache) –

+0

aggiornamento di 3 anni: ci sono voluti pochissimo tempo (giorni) per vedere il valore di WSGI, e quindi (settimane) il valore di un framework, da cui immettere Django. Partendo da zero, ho dovuto imparare tutto questo in modo duro, ma se stai percorrendo un percorso simile, Django è dove finirai. –

risposta

13

Il modo Python di scrivere applicazioni Web non è cgi-bin. È usando WSGI.

WSGI è un'interfaccia standard tra server Web e framework o applicazioni Web Python. Lo definisce PEP 0333.

Non ci sono svantaggi nell'utilizzarlo al posto di CGI. E otterrai molto. I bellissimi URL sono solo una delle cose belle che puoi fare facilmente.

Inoltre, scrivere un'applicazione WSGI significa che è possibile eseguire l'installazione su qualsiasi server Web che supporti l'interfaccia WSGI. Apache lo fa usando mod_wsgi.

È possibile configurare in apache così:

WSGIScriptAlias /myapp /usr/local/www/wsgi-scripts/myapp.py 

Poi tutte le richieste su http://myserver.domain/myapp andranno al di myapp.py application callable, tra cui http://myserver.domain/myapp/something/here.

esempio myapp.py:

def application(environ, start_response): 
    start_response('200 OK', [('Content-type', 'text/plain')]) 
    return ['Hello World!'] 
+1

+1 (di più se potessi). Se vuoi comprendere lo sviluppo web di Python "da zero", dovresti comunque ignorare del tutto il CGI. Scrivere la tua app WSGI nuda è davvero semplice e un buon modo per capire come funzionano i framework Python. –

5

Penso che si possa fare riscrivendo l'URL attraverso la configurazione di Apache. È possibile visualizzare la documentazione di Apache per la riscrittura here.

4

Basta usare qualche buon framework web per esempio django e puoi avere tali URL più di URL avrai una migliore infrastruttura, modelli, db orm ecc

+0

Non è sempre una buona idea. Se stai realizzando qualcosa che è davvero personalizzato, sarai sempre trattenuto dai confini e dalle regole del framework che scegli. –

+0

sì giusto, ma non sono sicuro se vuole sviluppare il proprio framework web –

+3

Usa un framework - sarai molto, molto più felice di inventare il tuo framework avvolto attorno a cgi-bin. –

4

questo è un estratto da un .htaccess che uso per ottenere una cosa del genere, questo per esempio reindirizza tutte le richieste che non dovevano index.php su quel file, ovviamente bisognerà controllare le variabili del server all'interno del file a cui si sta reindirizzando per vedere cosa è stato richiesto.

O semplicemente si effettua una regola di riscrittura, in cui si utilizza un RegExp come ^.*\/cgi-bin\/.*\.py$ per determinare quando e cosa riscrivere. Tale RegExp deve essere creato con molta attenzione, in modo che la riscrittura avvenga solo quando lo si desidera.

<IfModule mod_rewrite.c> 
    RewriteEngine On #activate rewriting 
    RewriteBase/ #url base for rewriting 
    RewriteCond %{REQUEST_FILENAME} !index.php #requested file is not index.php 
    RewriteCond %{REQUEST_FILENAME} !^.*\.gif$ #requested file is no .gif 
    RewriteCond %{REQUEST_FILENAME} !^.*\.jpg$ #requested file is no .jpg 
    RewriteCond %{REQUEST_FILENAME} !-d  #is not a directory 
    RewriteRule . /index.php [L]    #send it all to index.php 
</IfModule> 

che questo esempio utilizza RewriteCond izioni per determinare quando riscrivere (Gif del .jpeg, di e index.php sono esclusi).

Hmm, quindi questo è già un lungo testo. Spero che sia stato un po 'utile, ma non sarai in grado di evitare di imparare la sintassi di Apache RewriteEngine.

3

Troverete la direttiva ScriptAlias utile. Utilizzo di

ScriptAlias /urlpath /your/cgi-bin/script.py 

è possibile accedere allo script tramite http://yourserver/urlpath.

Si potrebbe anche voler esaminare mod_passenger, anche se l'ultima volta che l'ho usato, WSGI era una sorta di "cittadino di seconda classe" all'interno della libreria: poteva rilevare gli script WSGI se fosse stato utilizzato per servire l'intero dominio , ma altrimenti non ci sono direttive per farlo funzionare con un'app WSGI.

+0

questo non ha funzionato per me – Harsha

+0

Funziona su Apache 2.4 con 'mod_python'. Freddo. – TranslucentCloud

Problemi correlati