簡體   English   中英

Google App Engine靜態文件服務與應用程序沖突

[英]Google App Engine static file serving conflicts with application

我有一個單頁應用程序(SPA),我正在使用Google App Engine(GAE)。 GAE做三件事:

  1. 服務index.html文件
  2. 服務靜態文件(JS,CSS等)
  3. 通過REST服務動態文件(圖像,文本等)

我使用以下app.yaml配置。

handlers:
- url: /app
  static_dir: app

- url: /.*
  script: main.app

我的理解是,這應該匹配到/ app文件夾的所有請求,該請求將為我的靜態文件提供服務。 然后,所有的REST服務和主索引頁面將被/.*捕獲並由main.py處理

但是,我看到以下行為:

  1. 如果刪除/ app處理程序,則可以成功提供index.html(通過Jinja模板)和REST服務(例如localhost / subjects /)。 但是 ,我看不到靜態文件(按預期)。
  2. 如果添加/ app處理程序,則index.html文件將提供服務,並給出“內部服務器錯誤” IOError(errno.EACCES,“文件不可訪問”,文件名)。 但是 ,當我請求諸如“ localhost / app / app.js”之類的靜態文件時,此操作成功。

我在這里缺少什么嗎? 我不明白為什么兩者會發生沖突。

謝謝!

注意: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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM