如何在Heroku中使用Python webapp2处理静态文件?

时间:2011-12-12 06:37:43

标签: python heroku static-files webapp2

我现在将我的小型Google App Engine应用程序迁移到Heroku平台。我实际上并没有使用Bigtable,webapp2大大降低了我的迁移成本。

现在我一直在处理静态文件。

有没有好的做法?如果是的话,请带我去那里。

提前致谢。

修改

好吧,我现在正在使用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 个答案:

答案 0 :(得分:7)

以下是我如何使用它。

我猜测依靠级联应用不是最有效的选择,但它足以满足我的需求。

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

答案 1 :(得分:2)

这使您的代码更易于部署,因为您可以使用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')

答案 2 :(得分:2)

在游戏后期考虑我,但我实际上更喜欢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')