Подтвердить что ты не робот

Триггеры косой черты 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
4b9b3361

Ответ 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/ к маршрутизации.