【问题标题】:How to run a pyramid app in Google App engine如何在 Google App 引擎中运行金字塔应用程序
【发布时间】:2018-11-22 10:02:42
【问题描述】:

我一直试图让金字塔在谷歌应用引擎中运行,但没有成功。 我试图按照指令here 进行操作,但它似乎已经过时,因为 gae 不再有 appcfg.py。我按照应用引擎文档上的烧瓶应用教程将其与上面的结合起来得到了这个:app.yaml

runtime: python
env: flex

runtime_config:
  python_version: 3
threadsafe: false

handlers:
- url: /static
  static_dir: contractors/static
- url: /.*
  script: auto

然后是 main.py:

from pyramid.paster import get_app, setup_logging
ini_path = 'production.ini'
setup_logging(ini_path)
app = get_app(ini_path, 'main')

在 appengine shell 控制台中,我克隆了项目 repo,将所有内容安装在 virtualenv 中,然后尝试运行 python main.py 但它返回未找到我的项目的分发。然后我使用了easy_install paste,然后分发错误解决了,但python main.py 仍然无法运行。救命!

实际上,这令人沮丧。我一直想知道为什么 aws、gcloud 和 azure cloud 不包括金字塔教程,而烧瓶和 django 都在那里。社区也没有这些云服务的工作教程。作为一个新手,我认为金字塔有问题。

【问题讨论】:

    标签: pyramid gcloud


    【解决方案1】:

    这个 Pyramid 教程似乎已经过时了。此外,我认为它适用于 App Engine 标准,因为“dev_appserver.py”命令不适用于柔性环境(请注意 app.yaml 文件中的 env:flex 标记)。

    此外,通过关注Pyramid Documentation,我设法让金字塔在 App Engine Standard 上工作,类似于 Flask 应用程序:

    注意你正在配置服务器的那一行,如果你使用这个方向和端口(127.0.0.1:8080),你将能够从Cloud Shell preview'本地'查看网页。

    ma​​in.py 文件:

    from wsgiref.simple_server import make_server
    from pyramid.config import Configurator
    from pyramid.response import Response
    
    
    def hello_world(request):
        return Response('Hello World!')
    
    def bye_world(request):
        return Response('Bye!')
    
    config = Configurator()
    
    config.add_route('hello', '/')
    config.add_view(hello_world, route_name='hello')
    
    config.add_route('newHandler', '/bye')
    config.add_view(bye_world, route_name='newHandler')
    
    app = config.make_wsgi_app()
    
    if __name__ == '__main__':
        server = make_server('127.0.0.1', 8080, app)
        server.serve_forever()
    

    app.yaml

    runtime: python27
    api_version: 1
    service: default
    threadsafe: yes
    
    handlers:
    - url: /.*
      script: main.app
    

    当您使用第三方库(金字塔)时,您 need to specify them。首先创建 requirements.txt 文件并输入以下行:

    pyramid
    repoze.lru
    

    (repoze.lru 库似乎是金字塔要求)

    通过 CLI 创建一个目录(在本例中命名为 lib),与其余文件的路径相同,然后安装库:

    mkdir lib 
    pip install -t lib -r requirements.txt
    

    此命令将安装“requirements.txt”文件中列出的所有库并将它们复制到“lib”文件夹。

    现在创建一个名为 appengine_config.py 的文件,该文件将指导 App Engine 部署上传“lib”文件夹中的库,然后输入:

    from google.appengine.ext import vendor
    
    vendor.add('lib')
    

    附带说明,您不需要对 Flask 执行此操作,因为它是 App Engine 中的一个捆绑库,因此您不需要专门上传该库。

    最后要在 Cloud Shell 中“本地”测试应用程序,您可以在 CLI 中运行:

    python main.py
    

    然后在 Cloud Shell 中使用 preview function

    从 CLI 部署应用程序:

    gcloud app deploy
    

    并使用以下命令在浏览器中查看它:

    gcloud app browse -s <service_name_defined_in_app.yaml>
    

    在这个例子中,这个命令是

    gcloud app browse -s default
    

    【讨论】:

    • 如果您向Pyramid Community Cookbook 提交 PR,我会接受。
    • 感谢您的回答,这适用于单个文件应用程序,但我在云上收到错误“pkg_resources.DistributionNotFound:未找到'承包商'分发,应用程序需要”我仍然无法解决错误。
    • @splbuddy 您是否将名为“contractors”的文件夹与 app.yaml 放在同一路径中? “static_dir”元素将在您指定的文件夹中搜索(在您的情况下为“contractors/static”)并将其中的任何文件上传到您的 App Engine 应用程序。当您在应用程序中向“/static”发出请求时,即“/static/”,此处理程序将为存储在“contractors/static/”中的文件提供服务。查看有关此处理程序如何工作的更多信息here
    • @Steve Piercy 当然我会看看!另外,如果对解释有任何不清楚的地方,请告诉我。
    • 是的@Joan Grau,我的文件夹与 app.yaml 位于同一路径中,我的问题是 DistributionNotFound 错误。我猜这是因为云外壳有 python 3.5 而 appengine 正在运行 python3.7,我会尝试 python2 看看会发生什么。再次感谢您的帮助。
    猜你喜欢
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    相关资源
    最近更新 更多