Google AppEngine app.yaml 中的上传有啥作用?

Posted

技术标签:

【中文标题】Google AppEngine app.yaml 中的上传有啥作用?【英文标题】:What does upload in Google AppEngine app.yaml do?Google AppEngine app.yaml 中的上传有什么作用? 【发布时间】:2011-02-07 16:29:56 【问题描述】:

我有时会浏览各种 Google AppEngine 教程,我只是在 *** 关于 favicon.ico 的问题中发现了一些奇怪的问题 - 特别是这个问题:favicon.ico "not found error" in app engine

- 网址:/favicon.ico 静态文件:media/img/favicon.ico上传: media/img/favicon.ico

- 网址:/robots.txt 静态文件:media/robots.txt上传: media/robots.txt

所有的海报都在他们的 app.yaml 定义中包含了一个 "upload:" 行无论有没有上传:应用程序似乎都可以正常工作,我没有看到任何提及它在官方文档中。

它在哪里使用,或者如果包含或不包含此行有什么不同?

【问题讨论】:

谢谢。我只是在浏览教程,但也在尝试互联网上的东西。起初我没有看到。 【参考方案1】:

我一遍又一遍地阅读docs,希望能更好地理解这一点。这是我从中推断出来的。

App Engine 表示它会将我们的静态文件和应用程序代码上传到不同的位置。为了做到这一点,它必须知道哪些文件是静态的——这是通过上传参数指定的。

然而,这引发了一些关于 app.yaml 中指定参数的设计的问题。

    App Engine 能否仅从 static_files 参数推断出哪些文件是静态的?

    在您的示例中,static_files 参数的值与上传参数的值相同(即 media/img/favicon.ico)。但是,一般情况下,static_files 参数的值与上传参数的值不同。 static_files 参数允许将来自 url 模式的匹配组替换到其中,以生成文件路径,例如- url: /item-(.*?)/category-(.*) static_files: archives/\2/items/\1 upload: archives/(.*?)/items/(.*)

    App Engine 能否仅从 url 参数推断出哪些文件是静态的?

    一般来说,不会,因为 url 隐含的资源层次结构可能与实际的文件夹结构不同。例如,我可能将 index.html 放入了一个子文件夹,但我可能希望使用根 url “hello.appspot.com/”而不是“hello.appspot.com/subfolder/”来访问它。

    App Engine 是否可以同时使用 url 参数和 static_files 参数来推断哪些文件是静态的?

    在给定 url 参数和 static_files 参数的情况下编写一个返回上传模式的函数似乎是可行的,从而不需要显式上传参数。我认为它适用于简单的情况,但是,文档编写“处理程序无法确定应用程序目录中的哪些文件与给定的 url 和 static_files 模式对应”可能是我不知道的原因。

url:URL 模式,作为正则表达式。表达式可以包含可以在脚本文件路径中通过正则表达式反向引用引用的分组。例如,/item-(.?)/category-(.) 将匹配 URL /item-127/category-fruit,并使用 127 和水果作为第一和第二组。 处理程序:- url: /item-(.*?)/category-(.*) static_files: archives/\2/items/\1

静态文件: 与 URL 模式匹配的静态文件的路径,来自应用程序根目录。路径可以引用在 URL 模式中分组匹配的文本。 与前面的示例一样,archives/\2/items/\1 插入第二个和第一个匹配的分组,分别代替 \2\1。使用上例中的模式,文件路径将为archives/fruit/items/127

上传: 与此处理程序将引用的所有文件的文件路径匹配的正则表达式。这是必要的,因为处理程序无法确定应用程序目录中的哪些文件与给定的 url 和 static_files 模式相对应。静态文件与应用程序文件分开上传和处理。上面的示例可能使用以下上传模式:archives/(.*?)/items/(.*)


另外说明,如果可以将整个目录标记为静态,则使用 static_files 的替代方法是使用 static_dir。在这种情况下,不需要上传参数,因为 static_dir 应该指向一个实际目录,因此 App Engine 只会将整个目录上传到它存储静态文件的位置。但是请注意,这种情况下 url 参数的使用会有所不同。

网址: URL 前缀。此值使用正则表达式语法(因此必须对正则表达式特殊字符进行转义),但不应包含分组。以该前缀开头的所有 URL 都由该处理程序处理,使用前缀之后的 URL 部分作为文件路径的一部分。

静态目录: 从应用程序根目录到包含静态文件的目录的路径。匹配的 url 模式结束后的所有内容都附加到 static_dir 以形成请求文件的完整路径。 此目录中的所有文件都作为静态文件随应用程序一起上传。

【讨论】:

【参考方案2】:

在此处记录:https://developers.google.com/appengine/docs/python/config/appconfig#Static_File_Pattern_Handlers。它基本上是一个正则表达式,用于标识映射器处理的文件。它是静态文件处理程序所必需的。

【讨论】:

实际上,static_files 处理程序始终需要它 - SDK 不会尝试确定您的正则表达式是否足够“简单”。 你是对的。我刚刚尝试了 appcfg 和开发服务器,如果没有提供,它们都不起作用。我确信简单路径不需要它,但我错了。

以上是关于Google AppEngine app.yaml 中的上传有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章

Google Appengine:app.yaml basic_scaling 奇怪的行为

AppEngine 文档推荐命令行标志而不是 app.yaml 文件元素

AppEngine文档建议使用命令行标志而不是app.yaml文件元素

AppEngine:从 app.yaml 读取值/设置

PHP Google App Engine YAML 找不到目录

app.yaml 与 appengine-web.xml 使用哪一个?