Модуль Appengine: как перенаправить error_handlers на модуль не по умолчанию?

Я имею в виду настройку пользовательских ответов на ошибки для Google Appengine, как описано в документации для Настройка с помощью app.yaml, в частности, для следующего кода:

error_handlers  
- error_code: default  
  file: default_error.html   

- error_code: over_quota   
  file: over_quota.html  

В настоящее время я запускаю приложение, помещая код в отдельные модули, где python запускается как модуль по умолчанию, настроенный в app.yaml. Среда выполнения другого модуля находится в php и java, которые запускаются одновременно через dispatch.yaml как показано ниже:

application: app-id
dispatch:
# Send favicon to default module - python
- url: "*/favicon.ico"
  module: default

# Send script to java module
- url: "*/scripts/*"
  module: javamodule

# Send others to php module
- url: "*/*"
  module: phpmodule

Кажется, все работает так, как ожидалось, но мне нужно знать, чего мне здесь не хватает, так как я поместил вышеуказанные обработчики ошибок в app.yaml, но не смог показать ни default_error.html на странице, которая не найдена (код ошибки: 404), ни over_quota. html при превышении квоты (код ошибки: 503).

Я поместил их и в другие модули, но ответа тоже нет. Я также должен убедиться, что путь к файлу ответа об ошибке не пересекается с путями обработчика статических файлов и что оба html-файла имеют размер менее 10 килобайт.


person Chetabahana    schedule 26.10.2014    source источник
comment
404 не является одной из поддерживаемых ошибок. Для этого вы можете использовать простой обработчик для создания пользовательской страницы ошибки. Для 503 вы видите соответствующую запись в своем журнале?   -  person Mars    schedule 31.10.2014
comment
Я помню, что в журнале сообщений говорилось о проблеме из-за превышения лимита обслуживания. Я пытался искать в своем журнале, но не знаю, как его найти.   -  person Chetabahana    schedule 06.11.2014
comment
Вот лог при превышении квоты (Код ошибки 503): 11:39:06.899 503 970 B 17ms / 208.122.6.102 - - [18/Nov/2014:20:39:06 -0800] GET / HTTP/1.1 503 970 - FreeWebMonitoring SiteChecker/0.2 (+freewebmonitoring.com/bot.html) tophyips.info ms=17 cpu_ms=0 cpm_usd=0,000108 app_engine_release=1.9.16   -  person Chetabahana    schedule 19.11.2014


Ответы (1)


Случайно я нашел способ решить эту проблему маршрутизации ошибок в моем приложении в Google AppEngine.

По требованию я сделал и развернул свой модуль с новым именем, а также переупорядочил и обновил имя модуля и поток документов в disptach.yaml, чтобы получилось вот так:

dispatch:
# Send styles to python module (default module)
- url: "*/styles/*"
  module: default

# Send script to java module
- url: "*/scripts/*"
  module: javamodule

# Send images to go module
- url: "*/images/*"
  module: gomodule

# Send others to php module
- url: "*/*"
  module: newphpmodule

Я пришел к выводу, что произошло после изменения имени моего модуля, что привело к работе маршрутизации ошибок, где приложение теперь показывает over_quota.html при превышении квоты (код ошибки 503).

Для кода ошибки 404 я согласен с комментарием Марса выше, что я буду использовать простой обработчик для создания пользовательской страницы ошибки.

Он также должен убедиться, что путь к файлу ответа об ошибке не перекрывается с путями обработчика статических файлов в файле yaml модуля. Итак, если ваша страница с ошибкой html, то каждый обработчик, указывающий на страницу с ошибкой, должен быть раскомментирован, как показано ниже:

#- url: /(.*\.(htm|html))$
#  mime_type: text/html
#  static_files: \1
#  upload: (.*\.(htm|html))$

Кроме того, если мы решили сделать так, чтобы over_quota.html отображался в случае превышения квоты, является ли это удобным способом сообщить пользователю или посетителю, когда сайт снова будет в сети.

Я установил ежедневный тип выставления счетов за приложения, чтобы он обнулялся в полночь, а также моя дневная квота. У меня есть код для подсчета времени от локального времени пользователя в любой точке мира до этого особенного полуночного времени сервера с использованием javascript (не нужно jquery), как показано ниже:

<span id="timer"></span>
<script>
var t=document.getElementById("timer"), wd=window||document, d=new Date(), md=new Date(); 
var tzone=md.getTimezoneOffset()/60; //get visitor timezone, (server timezone is -7,0)
md.setHours(24-(tzone-7)); md.setMinutes(0); md.setSeconds(0); md.setMilliseconds(0);
var dif=((md.getTime()-d.getTime())/1000);
var timer=setInterval(counter, 1000);
function counter(){
    dif=dif-1; var h=Math.floor(dif/3600%24), m=Math.floor((dif%3600)/60), s=Math.floor(dif%60);
    if(h>10){clearInterval(timer); t.innerHTML="0:00:00"; wd.location.reload(true);}
    else{t.innerHTML=h+":"+(m<10?'0'+m:m)+":"+(s<10?'0'+s:s);}
}
</script>

Смотрите в действии здесь

person Chetabahana    schedule 22.11.2014