настройки app.yaml для загрузки статических файлов

У меня возникли проблемы с настройками app.yaml моего веб-приложения Python App Engine. Каким-то образом, кроме index.html, остальные статические файлы (javascript, CSS и HTML), которые есть в моем приложении, не развертываются в движке приложения. Я пробовал различные комбинации элементов static_files и upload в скрипте в app.yaml. Хотя некоторые из них работают на локальном сервере приложений для разработчиков, они не работают при развертывании на механизме приложения через gcloud app deploy. Журналы, созданные gcloud, не показывают никаких ошибок. Они показывают сообщения DEBUG, такие как «Пропуск загрузки [...]» для всех моих статических файлов.

Структура каталогов приложения (это приложение AngularJS) выглядит следующим образом:

<APP ROOT>
├── app.yaml
├── my_scripts
│   ├── foo.py
│   └── ...
├── index.html
├── mainapp.py
└── web
    ├── assets
    │   ├── css
    │   │   ├── bootstrap.min.css
    │   │   ├── bootstrap-theme.min.css
    │   │   ├── ....
    │   │   └── ....
    │   └── js
    │       ├── app
    │       │   ├── app.js
    │       │   └── ....
    │       └── lib
    │           └── ...
    └── partials
        ├── login.html
        └── ...

Ниже приведен файл app.yml для моего приложения.

runtime: python27
api_version: 1
threadsafe: true

handlers:

- url: /favicon\.ico
  static_files: favicon.ico
  upload: favicon\.ico

- url: /(user|tasks)/.*
  script: mainapp.app

- url: /
  static_files: index.html
  upload: index.html

- url: /web
  static_files: web\/[^\n]*
  upload: web\/[^\n]*

- url: /web
  static_dir: web

Любые указатели, которые помогут мне решить эту проблему, будут очень признательны.


person b.sodhi    schedule 17.03.2017    source источник
comment
Взгляните на stackoverflow.com/questions/33447890/ статические-файлы-отсутствуют/. Посмотрите, поможет ли решение этой проблемы пропустить статические файлы во время развертывания. Кстати, есть ли причина пропускать их отображение где-либо?   -  person Dan Cornilescu    schedule 17.03.2017


Ответы (2)


У вас есть изменение порядка маршрутизации. То есть /web должен прийти непосредственно перед обработчиком /, чтобы маршрутизация GAE сначала искала /web, а затем / (обратите внимание на порядок сверху вниз). Если вы определяете / перед /web, он всегда показывает файл index.html, так как / также будет соответствовать /web.

handlers:

- url: /favicon\.ico
  static_files: favicon.ico
  upload: favicon\.ico

- url: /(user|tasks)/.*
  script: mainapp.app

- url: /web
  static_dir: web

- url: /
  static_files: index.html
  upload: index.html

А также я надеюсь, что вы не добавили ^web в раздел skip_files в app.yaml

person Avinash Raj    schedule 17.03.2017
comment
На самом деле / не будет соответствовать /web, возможно, вы думаете о /.* или просто .*? - person Dan Cornilescu; 17.03.2017
comment
Regex / должен возвращать объект соответствия строке /web - person Avinash Raj; 17.03.2017
comment
Объект search да, но не объект match (в разговоре о python re). Попробуйте это на реальном проекте GAE. - person Dan Cornilescu; 17.03.2017

У меня сработала следующая конфигурация обработчика:

- url: /(user|tasks)/.*
  script: mainapp.app

- url: /
  static_files: index.html
  upload: index.html

- url: /web
  static_files: web/(.*)/(.*)/(.*)/(.*)
  upload: web/(.*)/(.*)/(.*)/(.*)

- url: /web
  static_dir: web
person b.sodhi    schedule 21.03.2017
comment
Так вы говорите, что и /web/assets/css/bootstrap.min.css, и /web/assets/js/app/app.js загружаются с этой конфигурацией? - person Dan Cornilescu; 21.03.2017