所以我的目录结构看起来像这样:
\Project-Dir\
|- lib\
| |- flask\
| |- ...
|- module1_dir\
| |- __init__.py
| |- app.yaml
| |- app.py
| |- ...
|- module2_dir\
| |- __init__.py
| |- app.yaml
| |- app.py
| |- ...
|- ...
Run Code Online (Sandbox Code Playgroud)
内 app.py
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '../lib')))
Run Code Online (Sandbox Code Playgroud)
我在同一个根目录下有两个模块.它们一起部署到App Engine.他们也共享相同的库.这些库都非常强大,所以我试图将它们放在共享目录(lib)中.
我正在dev_appserver.py从\Project-Dir\和传球两个.yamls.我sys.path的设置很好,包括lib\目录.然而沙盒似乎固执地坚持认为图书馆lib\ 不存在.
我确定我只是遗漏了一些像配置改变一样的东西.或者App Engine真的只是不支持这样的设置?
编辑:当我在外面运行它时,导入工作正常dev_appserver.py.
我有一个谷歌应用引擎(GAE)的应用程序,我使用的是Python 2.7.此应用程序从用户门户(例如Chrome)接收GET(ajax)请求.收到请求后,我准备异步连接,使用urlfetch.make_fetch_call() - GET请求从GAE外部的多个网站(比如X1,X2等)请求数据.
这适用于X1网站,但不适用于X2.开始在本地开发服务器上进行探测.在探究时我怀疑X2正在检查标题中的{'User-Agent':'Python-urllib/2.7'}标记.这是我最好的猜测,因为将此字段更改为{'User-Agent':'Mozilla/5.0'}会返回所需的结果.
所以我将代码上传到GAE并使用urlfetch.make_fetch_call()启动了该过程.在拦截此调用后,我发现无论我做什么,GAE添加的默认标头都不会被删除. 这是GAE添加的默认标题.
302 218ms 0kb Mozilla/5.0(Windows NT 6.1; WOW64)AppleWebKit/537.36(KHTML,与Gecko一样)Chrome/48.0.2564.103 Safari/537.36 AppEngine-Google; (+ http://code.google.com/appengine ; appid:s~xxx-etching-112014)module = default version = 1 107.178.194.96 - [06/Feb/2016:19:57:04 -0800] "GET/HTTP/1.1"302 383" http://www.mywebbsite.com/ ""Mozilla/5.0(Windows NT 6.1; WOW64)AppleWebKit/537.36(KHTML,与Gecko一样)Chrome/48.0.2564.103 Safari/537.36 AppEngine -Google;(+ http://code.google.com/appengine ; appid:s~xxx-etching-112014)""1.usedForIntercepting.appspot.com"ms = 218 cpu_ms = 224 cpm_usd = 0.000043 loading_request = 1 app_engine_release = 1.9.32 trace_id = fd7b7420e7f8c23371a5b0ea7e9651 instance = 00c61b117ce5ebac2a2eba44f26a01d4f2
这就是我尝试过的
for portal in self.searchPortals:
spoofHeader = {
'User-agent':'Mozilla/5.0----------------------',
'Host':portal.getURL(),
'Accept-Encoding': 'identity',
'Connection': 'close',
'Accept': 'application/json, …Run Code Online (Sandbox Code Playgroud) google-app-engine http-headers urlfetch google-app-engine-python
将 Python 2 AppEngine 应用升级到新运行时的推荐路径是将数据存储区代码切换到 Google Cloud NDB。但是,我找不到任何关于使用 Cloud NDB 的单元测试代码(以前可以使用 Python 2 测试平台库)。
如何对 Cloud NDB 代码进行单元测试?(除了自己抽象 Cloud NDB 依赖项的标准)
python google-app-engine app-engine-ndb google-cloud-datastore google-app-engine-python
(背景:我是 Google App Engine 的新手,熟悉其他云提供商的服务)
我正在寻找类似于对生产节点的 shell 访问的访问/视图。
使用基于 Python/Django 的 Google App Engine 应用程序,我想查看生产中的代码。
我能找到的一个视图是 StackDriver“调试”视图。但是,显然“调试”视图中显示的代码并不反映更新的生产代码(基于生产站点上显示的内容,例如主页上的文本不同)。
Google App Engine 是否允许我通过 ssh 进入运行应用程序/代码的虚拟机?如果没有,如何检查生产中运行的代码?
谢谢。
我在谷歌应用程序引擎上使用python,并不断接收google.appengine.api.urlfetch_errors.DeadlineExceededError从进行一些后端处理的机器发出的请求。这些请求大约需要 60 秒,有时会更长一些,因此我尝试延长截止日期。
请求被包装在重试中,从日志中我可以看到重试之间的时间始终约为 60 秒。我认为这要么是因为我配置不正确,要么误解了截止日期的限制。
机器配置为:
instance_class: B8
basic_scaling:
max_instances: 1
idle_timeout: 10m
Run Code Online (Sandbox Code Playgroud)
我正在使用的代码是(为简单起见进行了编辑):
from google.appengine.api import urlfetch
from retrying import retry
timeout = 600
retries = 10
@retry(
stop_max_attempt_number=retries,
wait_exponential_multiplier=1000,
wait_exponential_max=1000*60*5
)
def fetch(url):
"""Fetch remote data, retrying as necessary"""
urlfetch.set_default_fetch_deadline(timeout)
result = urlfetch.fetch(url)
if result.status_code != 200:
raise IOError("Did not receive OK response from server")
return result.content
data = fetch(config['url'])
Run Code Online (Sandbox Code Playgroud)
我尝试过明确设置截止日期,urlfetch.fetch(url, deadline=timeout)但设置默认值似乎是大多数人建议的方法。
谁能澄清是否可以设置最大值deadline?
我试图弄清楚如何使用 Python 3(标准)将内部包添加到 Google App Engine 部署中。
对于 Python 2,打包模块的方法是使用本地lib/文件夹和appengine_config.py. 这似乎不再适用于 Python 3?至少我的应用程序找不到lib/文件夹中的模块。
对于 Python 3,可以只pip3 install -t .使用包。但这会变得非常混乱,因为所有软件包都刚刚安装在应用程序根目录中,并且还将添加到我们应用程序的 git 存储库中。
我们不能使用,requirements.txt因为该模块是内部的,并且在 PyPI 上不可用。
是否有另一种使用 Python 3 为 Google App Engine 打包模块的方法?
google-app-engine python-3.x google-cloud-platform google-app-engine-python
/healthz对部署在 Google App Engine 上的应用程序上的路由的HTTP 请求似乎没有到达/healthz应用程序内的端点。
相反,提供了一个404页面,显然来自 GCP 基础设施。
我可以知道如何覆盖此行为并使这些请求到达我的应用程序吗?
谢谢你。
多一点背景:
我正在Google App Engine 上部署一个Streamlit应用程序。
Streamlit Web UI 似乎/healthz定期向端点发送请求,当这些请求失败时,Streamlit 应用程序停止工作并显示如下错误消息。
google-app-engine google-cloud-platform google-app-engine-python app-engine-flexible streamlit
我无法在Python标准环境上部署简单的Flask/MySQL应用程序;它超时了。
ERROR: (gcloud.app.deploy) Error Response: [4] Cloud build did not succeed within 10m.
在日志中它是这样说的:
Step #7 - "exporter": Layer 'google.python.appengine:config' SHA: sha256:c7053ac3e...
TIMEOUT
ERROR: context deadline exceeded
Run Code Online (Sandbox Code Playgroud)
这是 app.yaml(经过适当审查):
runtime: python37
instance_class: F2
handlers:
- url: /static
static_dir: static
- url: /.*
script: auto
env_variables:
GAE_USE_SOCKETS_HTTPLIB: True
DB_USER: XXXX
DB_PASS: XXXX
DB_NAME: XXXXXXXX
CLOUD_SQL_CONNECTION_NAME:XXXXXXXXXXX:us-west3:XXXXXXXXXXX
Run Code Online (Sandbox Code Playgroud)
这是要求.txt:
numpy==1.19.0
Flask==1.1.2
googleads>=24.0.0
SQLAlchemy==1.3.17
PyMySQL==0.9.3
google-search-results==1.8.3
Run Code Online (Sandbox Code Playgroud)
我尝试了各种各样的方法,但没有任何效果。这曾经运行没有问题;我们没有改变任何东西。它基本上是一个 Hello World Flask 应用程序。
google-app-engine google-cloud-platform gcloud google-app-engine-python
将旧项目从 2.7 和 Ubuntu 18.04 [逐步、Python 3.10 和 22.04 next\xe2\x80\xa6 然后 Flask!] 从供应商依赖项迁移到requirements.txt. 从项目根目录中删除了依赖项并在我的requirements.txt.
我的requirements.txtcontainsgoogle-cloud-storage==1.44.0和 wasvenv-2-7/bin/python -m pip install -t lib -r requirements.txt与 aappengine_config.py位于同一目录中app.yaml:
# From https://cloud.google.com/appengine/docs/legacy/standard/python/tools/using-libraries-python-27\nimport os\n\nfrom google.appengine.ext import vendor\n\nvendor.add(\'lib\')\nvendor.add(os.path.join(os.path.dirname(os.path.realpath(__file__)), \'lib\'))\nRun Code Online (Sandbox Code Playgroud)\n我该如何解决这个错误?- 尝试过,venv-2-7/bin/python -c \'import google.cloud.storage\'有效,但是:
$ venv-2-7/bin/python /google-cloud-sdk/platform/google_appengine/dev_appserver.py --host 127.0.0.1 .\nRun Code Online (Sandbox Code Playgroud)\n[来自 PyCharm 和手动] 的错误:
\nImportError: No module named google.cloud.storage\nRun Code Online (Sandbox Code Playgroud)\nEDIT0:根据评论请求包含更多信息[如下]:
\napp.yaml$ …Run Code Online (Sandbox Code Playgroud) python google-app-engine google-app-engine-python google-cloud-python
我正在创建一个 Python 项目并将其部署到 Google App Engine。
当我在另一个项目中使用部署的链接时,我在 Google Cloud Logging 中收到以下错误消息:
Exceeded hard memory limit of 256 MB with 667 MB after servicing 0 requests total. Consider setting a larger instance class in app.yaml.
Run Code Online (Sandbox Code Playgroud)
| 实例类 | 内存限制 | CPU限制 | 支持的缩放类型 |
|---|---|---|---|
| F1(默认) | 256MB | 600兆赫 | 自动的 |
| F2 | 512MB | 1.2GHz | 自动的 |
| F4 | 1024MB | 2.4GHz | 自动的 |
| F4_1G | 2048MB | 2.4GHz | 自动的 |
instance_class: F2
该错误表明限制为 256 MB,但记录了 667 MB。F1 的内存限制和 F2 的内存限制均小于 667 MB。所以我添加instance_class: F2并app.yaml更改F2为F4. …
python google-app-engine limit google-cloud-platform google-app-engine-python