从Google App Engine迁移到Heroku(缺少YAML)

时间:2011-11-02 19:03:59

标签: python google-app-engine heroku

一夜之间的黑客攻击,试图创建一个环境,GAE代码(使用Python库/包)可以很容易地移植到Heroku,只需要很少的编辑。

修改
问:YAML只提供3行代码提供静态文件共享,我试图找出如何使用_minimal_editing_(关键字)实现此文件共享。

例如,要共享'static /'文件夹。一种解决方案是实现http://docs.webob.org/en/latest/file-example.html中的一些类 - 不是一个优雅的答案。

重要的是让开发人员可以自由选择(希望)更好/更便宜的云提供商,按照步骤1,2,3 ......并且应用程序将以最小的麻烦启动并运行。希望这能消除困惑。


如果有人询问,我的代码如下......

main.py ”文件:

import jinja2
import webapp2
import os

jinja_environment = jinja2.Environment(
    loader=jinja2.FileSystemLoader(
        os.path.join(os.path.dirname(__file__), 'templates')))


class HelloWebapp2(webapp2.RequestHandler):
    def get(self):
        template_values = { 'test': 'Hello World!!'}
        template = jinja_environment.get_template('jinja2_test.html')
        return self.response.out.write(template.render(template_values))


app2 = webapp2.WSGIApplication([
    ('/', HelloWebapp2)
], debug=True)

def main():
    from paste import httpserver
    port = int(os.environ.get("PORT", 5000))
    httpserver.serve(app2, host='0.0.0.0', port=port)

if __name__ == '__main__':
    main()

在“ requirements.txt ”文件中:

Jinja2==2.6
webapp2==2.3
paste==1.7.5.1
webob==1.1.1

输出文件“ templates / jinja2_test.html ”:

{{test}}

默认“ procfile ”:

web: python main.py

2 个答案:

答案 0 :(得分:1)

听起来我觉得你要解决的问题是在Heroku上使用Django提供静态页面。

collectstatic似乎是对此的正确答案: web:python my_django_app / manage.py collectstatic --noinput; bin / gunicorn_django --workers = 4 --bind = 0.0.0.0:$ PORT my_django_app / settings.py

http://matthewphiong.com/managing-django-static-files-on-heroku

答案 1 :(得分:1)

在heroku平台上,对于大批量应用,您应该使用amazon s3进行静态资产存储:https://devcenter.heroku.com/articles/s3

出于开发目的,我创建了一个简单的" catch all"处理程序(它应该是列表中的最后一个处理程序),它提供以项目目录中某些后缀结尾的静态文件。添加这个很简单。但请记住,它不是很有效,而且浪费了网络动力资源。

import webapp2
import re
import os

class FileHandler(webapp2.RequestHandler):
  def get(self,path):

    if re.search('html$',path):
      self.response.headers['Content-Type'] = 'text/html' 
    elif re.search('css$',path):
      self.response.headers['Content-Type'] = 'text/css' 
    elif re.search('js$',path):
      self.response.headers['Content-Type'] = 'application/javascript' 
    elif re.search('gif$',path):
      self.response.headers['Content-Type'] = 'image/gif' 
    elif re.search('png$',path):
      self.response.headers['Content-Type'] = 'image/png' 
    else:
      self.abort(403)
    try:
      f=open("./"+path,'r')
    except IOError:
      self.abort(404)
    self.response.write(f.read())
    f.close

app = webapp2.WSGIApplication([
    (r'/(.*)', FileHandler),
], debug=True)

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

if __name__ == '__main__':
    main()