2011-12-12 24 views
5

Ahora estoy migrando mi pequeña aplicación Google App Engine a la plataforma Heroku. En realidad, no uso Bigtable, y webapp2 reduce mucho mis costos de migración.¿Cómo puedo manejar archivos estáticos con Python webapp2 en Heroku?

Ahora estoy atascado en el manejo de los archivos estáticos.

¿Hay alguna buena práctica? Si es así, guíame allí por favor.

Gracias de antemano.

EDITAR

Bueno, ahora estoy usando paste para mi servidor WSGI. Y paste.StaticURLParser() debería ser lo que necesito para implementar el controlador de archivos estáticos. Sin embargo, no tengo idea de cómo integrarlo con webapp2.WSGIApplication(). ¿Alguien podría ayudarme?

Quizás necesito anular la clase webapp2.RequestHandler para cargar correctamente paste.StaticURLParser();

import os 
import webapp2 
from paste import httpserver 

class StaticFileHandler(webapp2.RequestHandler): 
    u"""Static file handler""" 

    def __init__(self): 
     # I guess I need to override something here to load 
     # `paste.StaticURLParser()` properly. 
     pass 

app = webapp2.WSGIApplication([(r'/static', StaticFileHandler)], debug=True) 


def main(): 
    port = int(os.environ.get('PORT', 5000)) 
    httpserver.serve(app, host='0.0.0.0', port=port) 

if __name__ == '__main__': 
    main() 

¡Cualquier ayuda sería apreciada!

Respuesta

6

Debajo está cómo conseguí que esto funcionara.

Supongo que confiar en una aplicación en cascada no es la opción más eficiente, pero funciona lo suficientemente bien para mis necesidades.

from paste.urlparser import StaticURLParser 
from paste.cascade import Cascade 
from paste import httpserver 
import webapp2 
import socket 


class HelloWorld(webapp2.RequestHandler): 
    def get(self): 
     self.response.write('Hello cruel world.') 

# Create the main app 
web_app = webapp2.WSGIApplication([ 
    ('/', HelloWorld), 
]) 

# Create an app to serve static files 
# Choose a directory separate from your source (e.g., "static/") so it isn't dl'able 
static_app = StaticURLParser("static/") 

# Create a cascade that looks for static files first, then tries the webapp 
app = Cascade([static_app, web_app]) 

def main(): 
    httpserver.serve(app, host=socket.gethostname(), port='8080') 

if __name__ == '__main__': 
    main() 
+0

Gracias por responder. ¡Voy a intentar esto más tarde! No sabía sobre 'Cascade'. – Japboy

+0

Puede servir archivos estáticos durante el desarrollo usando una variable como: si DEPURAR: etc. y en producción use nginx. –

+0

Gracias! estaba buscando una respuesta a esto. – Amirshk

2

esto hace que su código sea más fácil de implementar ya que puede usar nginx para servir sus medios estáticos en producción.

def main(): 
    application = webapp2.WSGIApplication(routes, config=_config, debug=DEBUG) 
    if DEBUG: 
    # serve static files on development 
    static_media_server = StaticURLParser(MEDIA_ROOT) 
    app = Cascade([static_media_server, application]) 
    httpserver.serve(app, host='127.0.0.1', port='8000') 
else: 
    httpserver.serve(application, host='127.0.0.1', port='8000') 
2

Considéreme tarde para el juego, pero en realidad me gusta DirectoryApp un poco mejor. Maneja las cosas un poco más como App Engine. Puedo crear un directorio "estática" en mi directorio src, y luego puedo hacer referencia a aquellos en mi HTML (o lo que sea) como esto: http: .. localhost: 8080// JS/estáticas jquery.js

static_app = DirectoryApp("static") 

# Create a cascade that looks for static files first, then tries the webapp 
app = Cascade([static_app,wsgi_app]) 

httpserver.serve(app, host='0.0.0.0', 
       port='8080') 
Cuestiones relacionadas