2011-12-12 7 views
5

Przenoszę teraz moją małą aplikację Google App Engine na platformę Heroku. W rzeczywistości nie używam BigTable, a webapp2 bardzo obniża moje koszty migracji.Jak obsługiwać pliki statyczne za pomocą aplikacji webapp2 Python w Heroku?

Teraz utknąłem na obsłudze plików statycznych.

Czy są jakieś dobre praktyki? Jeśli tak, poprowadź mnie proszę.

Z góry dziękuję.

EDIT

Cóż, jestem teraz za pomocą paste na mój serwer WSGI. I paste.StaticURLParser() powinien być tym, czego potrzebuję do zaimplementowania obsługi plików statycznych. Jednak nie mam pojęcia, jak zintegrować go z webapp2.WSGIApplication(). Czy ktoś mógłby mi pomóc?

Może trzeba zastąpić klasę webapp2.RequestHandler, aby poprawnie załadować 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() 

Każda pomoc będzie doceniona!

Odpowiedz

6

Poniżej przedstawiam, jak to działa.

Zgaduję, że poleganie na aplikacji kaskadowej nie jest najskuteczniejszą opcją, ale działa wystarczająco dobrze dla moich potrzeb.

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

Dzięki za odpowiedź. Spróbuję tego później! Nie wiedziałem o "Kaskadzie". – Japboy

+0

Można po prostu wyświetlać pliki statyczne podczas programowania, używając zmiennej takiej jak: DEBUG: itd. Oraz w przypadku użycia produkcyjnego, jak nginx. –

+0

Dzięki! szukał odpowiedzi na to. – Amirshk

2

to sprawia, że ​​kod jest bardziej przyjazny do wdrożenia, ponieważ można używać nginx aby służyć statycznych mediów w produkcji.

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

Uważam, że jestem spóźniony, ale bardziej podoba mi się DirectoryApp. Obsługuje rzeczy trochę bardziej jak AppEngine. Mogę stworzyć "statyczny" katalog w moim katalogu src, a potem może odwoływać tych w moim HTML (lub cokolwiek) tak: http: .. localhost: 8080/statyczne/js/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')