2009-05-19 7 views
11

Tout nouveau pour la conception web, en utilisant python. Activez Apache, testez le script python qui fonctionne dans le répertoire cgi-bin. Obtenez des résultats valides lorsque je tape l'URL explicitement: ".../cgi-bin/showenv.py"Comment masquer "cgi-bin", ".py", etc. à partir de mes URL?

Mais je ne veux pas que l'URL ressemble à cela. Ici, à stackoverflow, par exemple, les URL qui s'affichent dans ma barre d'adresse n'ont jamais les détails désordonnés montrant le script qui a été utilisé pour les exécuter. Ils sont propres de cgi-bin, .py, etc extensions. Comment je fais ça?

EDIT: Merci pour les réponses, chacun utile, beaucoup à apprendre. Je vais avec la réécriture d'URL pour le moment; exemple dans les docs ressemble extrêmement à ce que je veux réellement faire. Mais je suis engagé à python, donc je vais devoir regarder WSGI sur la route.

+1

.. Je me demande si cette question est mieux adaptée à serverfault.com? (car il s'agit vraiment de configurer Apache) –

+0

Mise à jour de 3 ans: il a fallu très peu de temps pour voir la valeur de WSGI, puis (semaines) la valeur d'un framework, d'où entrer dans Django. En partant de zéro, j'ai dû apprendre tout cela à la dure, mais si vous suivez un chemin similaire, Django est l'endroit où vous allez vous retrouver. –

Répondre

13

La manière python d'écrire des applications web n'est pas cgi-bin. C'est en utilisant WSGI. WSGI est une interface standard entre les serveurs Web et les applications Web ou les frameworks Python. Le PEP 0333 le définit.

Il n'y a aucun inconvénient à l'utiliser à la place du CGI. Et vous allez gagner beaucoup. Les belles URL sont juste l'une des choses que vous pouvez faire facilement. Par ailleurs, l'écriture d'une application WSGI signifie que vous pouvez déployer sur n'importe quel serveur Web prenant en charge l'interface WSGI. Apache le fait en utilisant mod_wsgi.

Vous pouvez le configurer dans apache comme ça:

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

Ensuite, toutes les demandes sur http://myserver.domain/myapp iront à application de myapp.py appelable, y compris http://myserver.domain/myapp/something/here.

exemple myapp.py:

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

+1 (plus si je pouvais). Si vous voulez comprendre le développement web de Python "à partir de zéro", vous devriez toujours ignorer totalement CGI. Écrire votre propre application sans WSGI est vraiment facile, et un bon moyen de comprendre ce que les frameworks Python enveloppent pour vous. –

5

Je pense que vous pouvez le faire en réécrivant l'URL via la configuration Apache. Vous pouvez voir la documentation d'Apache pour réécrire here.

4

Il suffit d'utiliser un bon framework web par exemple django et vous pouvez avoir de telles URL plus que des URLs vous aurez une meilleure infrastructure, des modèles, db orm etc

+0

Ce n'est pas toujours une bonne idée. Si vous faites quelque chose qui est vraiment personnalisé, vous serez toujours limité par les frontières et les règles du cadre que vous choisissez. –

+0

oui bien, mais pas sûr s'il veut développer son propre cadre web –

+3

Utilisez un framework - vous serez beaucoup, beaucoup plus heureux que d'inventer votre propre cadre autour de cgi-bin. –

4

c'est un extrait d'un .htaccess que j'utilise pour réaliser une telle chose, ceci par exemple redirige toutes les demandes qui n'étaient pas index.php à ce fichier, bien sûr, vous devez ensuite vérifier les variables du serveur dans le fichier que vous redirigez pour voir, ce qui a été demandé.

Ou vous créez simplement une règle de réécriture, où vous utilisez un RegExp comme ^.*\/cgi-bin\/.*\.py$ pour déterminer quand et quoi réécrire. Un tel RegExp doit être conçu avec soin, de sorte que la réécriture n'ait lieu que lorsque cela est souhaité.

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

L'exemple ci-dessus utilise RewriteCond itions pour déterminer le moment de réécrire (gif, années de .jpeg et index.php sont exclus).

Hmm, donc c'est déjà un long texte. J'espère que ce fut un peu utile, mais vous ne pourrez pas éviter d'apprendre la syntaxe de l'Apache RewriteEngine.

3

Vous trouverez la directive ScriptAlias utile. En utilisant

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

vous pouvez accéder à votre script via http://yourserver/urlpath. Vous pourriez également vouloir regarder dans mod_passenger, bien que la dernière fois que je l'ai utilisé, WSGI était une sorte de «citoyen de deuxième classe» dans la bibliothèque - il pourrait détecter des manuscrits de WSGI s'il a été employé pour servir le domaine entier , mais sinon il n'y a pas de directives pour l'obtenir pour exécuter une application WSGI.

+0

cela n'a pas fonctionné pour moi – Harsha

+0

Fonctionne sur Apache 2.4 avec 'mod_python'. Cool. – TranslucentCloud

Questions connexes