Как я могу обрабатывать статические файлы с помощью Python webapp2 в Heroku? - PullRequest
5 голосов
/ 12 декабря 2011

Я перевожу свое небольшое приложение Google App Engine на платформу Heroku. На самом деле я не использую Bigtable, и webapp2 значительно снижает мои затраты на миграцию.

Теперь я застрял в обработке статических файлов.

Есть ли хорошие практики? Если да, приведи меня туда, пожалуйста.

Заранее спасибо.

EDIT

Хорошо, теперь я использую paste для моего сервера WSGI. И paste.StaticURLParser() должно быть тем, что мне нужно для реализации статического обработчика файлов. Однако я понятия не имею, как интегрировать его с webapp2.WSGIApplication(). Кто-нибудь может мне помочь?

Может быть, мне нужно переопределить webapp2.RequestHandler класс, чтобы загрузить 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()

Любая помощь будет оценена!

Ответы [ 3 ]

7 голосов
/ 05 января 2012

Ниже я понял, как это работает.

Полагаю, что полагаться на каскадное приложение - не самый эффективный вариант, но он работает достаточно хорошо для моих нужд.

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()
2 голосов
/ 01 августа 2012

Считай, что я опоздал на игру, но на самом деле мне нравится DirectoryApp немного лучше.Это обрабатывает вещи немного больше, как AppEngine.Я могу создать «статический» каталог в моем каталоге src, а затем я могу ссылаться на те в моем HTML (или где-либо еще), например: http: .. localhost: 8080 / static / 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')
2 голосов
/ 07 января 2012

это делает ваш код более удобным для развертывания, поскольку вы можете использовать nginx для обслуживания ваших статических носителей в производственном процессе.

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')
...