2009-05-19 57 views
11

Nuevo en diseño web, usando Python. Tengo Apache en funcionamiento, prueba el script python trabajando en el directorio cgi-bin. Obtenga resultados válidos cuando escribo la URL explícitamente: ".../cgi-bin/showenv.py"¿Cómo ocultar "cgi-bin", ".py", etc. de mis URL?

Pero no quiero que la URL se vea de esa manera. Aquí en stackoverflow, por ejemplo, las URL que se muestran en mi barra de direcciones nunca tienen los detalles desordenados que muestran la secuencia de comandos que se utilizó para ejecutarlos. No tienen extensiones cgi-bin, .py, etc. ¿Cómo puedo hacer eso?

EDIT: Gracias por las respuestas, cada uno útil, mucho que aprender. Voy a reescribir la URL por ahora; el ejemplo en los documentos parece extremadamente cercano a lo que realmente quiero hacer. Pero estoy comprometido con Python, así que tendré que mirar a WSGI más adelante.

+1

.. Me pregunto si esta pregunta es más adecuada para serverfault.com? (ya que se trata de configurar apache) –

+0

Actualización de 3 años: le tomó muy poco tiempo (días) ver el valor de WSGI, y luego (semanas) el valor de un marco, donde ingresa Django. Comencé de cero, tuve que aprender todo por el camino difícil, pero si estás viajando por un camino similar, Django es donde terminarás. –

Respuesta

13

La forma de python de escribir aplicaciones web no es cgi-bin. Es usando WSGI.

WSGI es una interfaz estándar entre servidores web y aplicaciones web o frameworks de Python. El PEP 0333 lo define.

No hay inconvenientes en su uso en lugar de CGI. Y ganarás mucho. Las URL hermosas son solo una de las cosas buenas que puedes hacer fácilmente.

Además, escribir una aplicación WSGI significa que puede implementar en cualquier servidor web que admita la interfaz WSGI. Apache lo hace usando mod_wsgi.

Puede configurarlo en Apache así:

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

A continuación, todas las solicitudes de http://myserver.domain/myapp irán a myapp.py de application exigible, incluyendo http://myserver.domain/myapp/something/here.

ejemplo myapp.py:

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

+1 (más si pudiera). Si quieres entender el desarrollo web de Python "desde cero", aún debes ignorar por completo el CGI. Escribir su propia aplicación bare-WSGI es realmente fácil, y una buena forma de manejar lo que los frameworks de Python están ajustando para usted. –

5

Creo que puede hacerlo reescribiendo la URL a través de la configuración de Apache. Puede ver la documentación de Apache para reescribir here.

4

Sólo tiene que utilizar un buen framework web, por ejemplo, django y usted puede tener tales URL más de URLs tendrá una mejor infraestructura, plantillas, db orm, etc.

+0

Eso no siempre es una buena idea. Si está haciendo algo que es verdaderamente personalizado, siempre estará restringido por los bordes y las reglas del marco que elija. –

+0

sí, pero no estoy seguro de si quiere desarrollar un framework web propio –

+3

Use un framework: será mucho, mucho más feliz que inventar su propio framework envuelto en cgi-bin. –

4

esto es un extracto de .htaccess que utilizo para lograr tal cosa, esto por ejemplo redirige todas las solicitudes que no eran para index.php a ese archivo, por supuesto, luego debe verificar las variables del servidor dentro del archivo al que lo redirecciona para ver qué se solicitó.

O simplemente hace una regla de reescritura, donde utiliza un RegExp como ^.*\/cgi-bin\/.*\.py$ para determinar cuándo y qué reescribir. Tal RegExp se debe diseñar con mucho cuidado, de modo que la reescritura solo se realice cuando se desee.

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

El ejemplo anterior utiliza RewriteCond itions para determinar cuando volver a escribir (de .gif, de y index.php .jpeg están excluidas).

Hmm, así que eso es un texto largo ya. Espero que haya sido un poco útil, pero no podrás evitar aprender la sintaxis del Apache RewriteEngine.

3

Encontrarás la directiva ScriptAlias útil. Usando

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

se puede acceder a la secuencia de comandos a través de http://yourserver/urlpath.

También puede consultar mod_passenger, aunque la última vez que lo usé, WSGI era una especie de "ciudadano de segunda clase" dentro de la biblioteca: podía detectar scripts de WSGI si se usaba para servir a todo el dominio , pero de lo contrario no hay directivas para que ejecute una aplicación WSGI.

+0

esto no funcionó para mí – Harsha

+0

Funciona en Apache 2.4 con 'mod_python'. Guay. – TranslucentCloud

Cuestiones relacionadas