Триггеры косой черты 404 в правиле маршрута колбы
Я хочу перенаправить любой путь в /users
к статическому приложению. Следующее представление должно захватывать эти пути и обслуживать соответствующий файл (он просто печатает путь для этого примера). Это работает для /users
, /users/604511
и /users/604511/action
. Почему путь /users/
вызывает ошибку 404?
@bp.route('/users')
@bp.route('/users/<path:path>')
def serve_client_app(path=None):
return path
Ответы
Ответ 1
В вашем маршруте /users
отсутствует конечная косая черта, которую Werkzeug интерпретирует как явное правило, чтобы не соответствовать завершающей косой чертой. Или добавьте конечную косую черту, и Werkzeug перенаправит, если URL не имеет ее, или установите strict_slashes=False
на маршруте, и Werkzeug будет соответствовать правилу с или без слэш.
@app.route('/users/')
@app.route('/users/<path:path>')
def users(path=None):
return str(path)
c = app.test_client()
print(c.get('/users')) # 302 MOVED PERMANENTLY (to /users/)
print(c.get('/users/')) # 200 OK
print(c.get('/users/test')) # 200 OK
@app.route('/users', strict_slashes=False)
@app.route('/users/<path:path>')
def users(path=None):
return str(path)
c = app.test_client()
print(c.get('/users')) # 200 OK
print(c.get('/users/')) # 200 OK
print(c.get('/users/test')) # 200 OK
Ответ 2
Чтобы отключить строгие косые черты GLOBALY; установите url_map.strict_slashes = False
следующим образом:
app = Flask(__name__)
app.url_map.strict_slashes = False
Таким образом, вам не нужно использовать strict_slashes=False
для каждого вида.
Затем вы просто определяете маршрут без конечной косой черты:
bp = Blueprint('api', __name__, url_prefix='/api')
@bp.route('/my-route', methods=['POST'])
Затем /my-route
и /my-route/
тогда оба работают одинаково.
Ответ 3
Это из-за согласованности Werkzeugs с другими HTTP-серверами. Посмотрите флажок Документация по быстрому запуску. Соответствующий пункт:
Уникальные URL-адреса/поведение перенаправления
Правила URL флагов основаны на модуле маршрутизации Werkzeugs. Идея за этим модулем необходимо обеспечить красивые и уникальные URL-адреса на основе прецеденты, установленные Apache и более ранними HTTP-серверами.
Возьмите эти два правила:
@app.route('/projects/')
def projects():
return 'The project page'
@app.route('/about')
def about():
return 'The about page'
Хотя они выглядят довольно схожими, они отличаются тем, что используют конечная косая черта в определении URL. В первом случае канонический URL для конечной точки проекта имеет завершающую косую черту. В этом смысле это похожа на папку в файловой системе. Доступ к нему без trailing slash вызовет перенаправление Flask на канонический URL с конечная косая черта.
Во втором случае, однако, URL-адрес определяется без конечного slash, скорее как путь к файлу в UNIX-подобных системах. Доступ к URL-адресу с завершающей косой чертой приведет к созданию 404 "Not Found" ошибка.
Такое поведение позволяет относительным URL-адресам продолжать работать, даже если конечная косая черта опущена, в соответствии с тем, как Apache и другие серверы работают. Кроме того, URL-адреса останутся уникальными, что поможет найти двигатели избегают индексации одной и той же страницы дважды.
Поэтому просто добавьте /users/
к маршрутизации.