Поймать статические ошибки "файл не найден"
У меня есть регулярное выражение 'catch-all' для обработчика ошибок, как это:
(r'/.*', errors.Error)
Который перечислен после всех остальных, чтобы соответствовать "всему остальному".
Это работает, как и предполагалось, чтобы изящно провалиться, когда страница не существует.
Однако у меня также есть статический каталог файлов, загруженный следующим образом:
handlers:
- url: /files
static_dir: files
Таким образом, если я попытаюсь загрузить URL-адрес в /files/
, который не соответствует существующему файлу в этом каталоге, я получу:
Ошибка: Нет Найдено
Запрошенный URL-адрес не был найден на этом сервере.
без необходимости перечислять каждый файл для загрузки отдельно , как я могу поймать эту ошибку; в идеале с тем же обработчиком errors.Error
выше?
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 параметр. Подробнее здесь .