[英]Google App Engine static file serving conflicts with application
我有一個單頁應用程序(SPA),我正在使用Google App Engine(GAE)。 GAE做三件事:
我使用以下app.yaml配置。
handlers:
- url: /app
static_dir: app
- url: /.*
script: main.app
我的理解是,這應該匹配到/ app文件夾的所有請求,該請求將為我的靜態文件提供服務。 然后,所有的REST服務和主索引頁面將被/.*捕獲並由main.py處理
但是,我看到以下行為:
我在這里缺少什么嗎? 我不明白為什么兩者會發生沖突。
謝謝!
注意:Google App Engine 1.8.9,Python 2.7,本地開發
編輯:
這是我用來提供頁面的Python代碼
path = os.path.join(os.path.dirname(__file__), 'app')
jinja_environment = jinja2.Environment(loader=jinja2.FileSystemLoader(path))
class MainHandler(webapp2.RequestHandler):
def get(self):
self.response.headers['Content-Type'] = 'text/html'
template_values = {}
template = jinja_environment.get_template('index.html')
self.response.out.write(template.render(template_values))
我的目錄結構如下:
/
main.py
app.yaml等
應用
的index.html
app.js
模塊A
moduleA.tpl.html
moduleA.js
編輯2:
我將index.html移到根目錄(/),然后使用以下python代碼:
path = os.path.dirname(__file__)
jinja_environment = jinja2.Environment(loader=jinja2.FileSystemLoader(path))
(非常有趣)似乎是index.html到Jinja模板以及靜態目錄文件的“雙重映射”引起了問題。 我想知道什么是最佳做法。 我使用Jinja的原因是:將(GAE生成的)登錄/注銷鏈接添加到index.html文件。 除此之外,沒有理由使用它。
默認情況下,Python無法訪問App Engine中標記為靜態的文件或目錄。 您可以在處理程序映射中添加application_readable: true
以啟用此功能。
另一個解決方案是將index.html
從靜態文件夾中移開,因為它實際上不是靜態文件,而是Python的Jinja模板。
application_readable
可選的。 默認情況下,在靜態文件處理程序中聲明的文件將作為靜態數據上傳,並且僅提供給最終用戶,應用程序無法讀取它們。 如果此字段設置為true,則文件也將作為代碼數據上傳,因此您的應用程序可以讀取它們。 兩次上載均按您的代碼和靜態數據存儲資源配額收費。
好的,它可以解釋方案#2,如何訪問index.html? 如果將/ app添加到處理程序中,並且您的請求網址類似於/app/index.html,則它將從靜態目錄中提供。
在您的情況下,您的網址似乎不包含/ app,因此轉到第二個處理程序規則,該規則將進入main.app。
但是,由於您將html放在/ app內,因此appengine將其視為靜態文件。 如果要通過jinja模板提供文件,則不應將其放在static_dir中
Jinja模板(或Django,Mako等)無需位於公共可訪問的文件夾中。 它們始終通過應用程序中的處理程序進行調用,並在服務給用戶之前在應用程序中進行編譯。
通常將它們放在/ templates目錄中。 app.yaml中沒有對該目錄的引用,它僅在內部用於提供模板。 在github中查看一些樣板應用程序(搜索“ gae樣板”)。 這是最小的並且使用Jinja,所以可能是您的一個很好的例子https://github.com/SoulAuctioneer/notvanillae
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.