Поймать статические ошибки "файл не найден"


У меня есть регулярное выражение 'catch-all' для обработчика ошибок, как это:

(r'/.*', errors.Error)

Который перечислен после всех остальных, чтобы соответствовать "всему остальному".

Это работает, как и предполагалось, чтобы изящно провалиться, когда страница не существует.

Однако у меня также есть статический каталог файлов, загруженный следующим образом:

handlers:
- url: /files
  static_dir: files

Таким образом, если я попытаюсь загрузить URL-адрес в /files/, который не соответствует существующему файлу в этом каталоге, я получу:

Ошибка: Нет Найдено

Запрошенный URL-адрес не был найден на этом сервере.

без необходимости перечислять каждый файл для загрузки отдельно , как я могу поймать эту ошибку; в идеале с тем же обработчиком errors.Error выше?

2 2

2 ответа:

К сожалению, хорошего способа сделать это нет. Запрос функции находится здесь: https://code.google.com/p/googleappengine/issues/detail?id=8380&q=type%3DFeature%20error%20404&colspec=ID%20Type%20Component%20Status%20Stars%20Summary%20Language%20Priority%20Owner%20Log

Нет способа настроить пользовательский обработчик или страницу статической ошибки для 404-х из-за отсутствия файлов в static_dir. То же самое верно для static_files, если URL-адрес соответствует чему-либо под подпуть, которая эквивалентна static_dir:

handlers:
- url: /files/(.*)
  static_files: files/\1
  upload: files/.*

Url-путь соответствует url-шаблону специального статического обработчика. Затем статический обработчик понимает, что запрошенный файл не существует. Управление не возвращается к логике маршрутизации, и нет возможности настроить ответ статического обработчика. Статический обработчик возвращает только универсальный 404.

Если шаблон URL для static_files точно соответствует существующим именам файлов, то пути URL, которые не совпадают, будут попадать в последующие обработчики, включая, возможно, улов-все на дне. Но это фактически перечисление всех статических файлов в файле конфигурации по отдельности:

handlers:
- url: /files/(foo.png|bar.js|baz.css)
  static_files: files/\1
  upload: files/.*
- url: .*
  script: errorhandler.app

# Or for a static error page:
- url: .*
  static_files: error.html
  upload: error.html

Также, к сожалению, error_handlers: не помогает, потому что он еще не поддерживает настройку 404. Примечательно, что 404, возвращаемый App Engine, если ни один из handlers: не соответствует URL-адресу, также является универсальным и пока не может быть настроен.

Единственный способ удовлетворить это требование полностью без перечисления статических имен файлов в a шаблон URL-адреса обработчика должен не использовать статические файлы, а вместо этого использовать обработчик приложения для обслуживания статических данных из файлов приложения (и обслуживать пользовательское сообщение 404, если оно не найдено).

handlers:
- url: .*
  script: filehandler.app

Поймать 404 так же просто, как следующую строку кода

app.error_handlers[404] = handle_404

Где handle_404 - это метод def, который обрабатывает исключение + вам больше не понадобится регулярное выражение "catch-all".

Смотрите это руководство для получения более подробной информации в Разделе " исключения в приложении WSGI ": https://webapp-improved.appspot.com/guide/exceptions.html

Также взгляните на app.yaml error_handlers параметр. Подробнее здесь .