Триггери косої риски 404 у правилі шляху колби


81

Я хочу перенаправити будь-який шлях /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

Відповіді:


140

У вашому /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

Ви також можете встановити strict_slashesдля всіх URL-адрес.

app.url_map.strict_slashes = False

Однак у більшості випадків слід уникати відключення строгих скісних рисок. У документах пояснюється, чому:

Така поведінка дозволяє відносним URL-адресам продовжувати працювати, навіть якщо кінцева коса риса опущена, відповідно до того, як працюють Apache та інші сервери. Крім того, URL-адреси залишаться унікальними, що допомагає пошуковим системам уникати індексування однієї сторінки двічі.


45

Щоб відключити строгі скісні риски ГЛОБАЛЬНО; встановити 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/обидва працюють однаково.


Як би ми робили строгі косі риси для креслень, не визначаючи їх для кожного перегляду?
jchi2241

@ jchi2241 Пропустив ваш коментар протягом року - вибачте. Приклад - використання креслень, які ви налаштовуєте на рівні програми.
Нік Вудхемс,

16

Це через узгодженість Werkzeug з іншими HTTP-серверами. Погляньте на документацію Quickstart Flask . Відповідний параграф:

Унікальні URL-адреси / поведінка перенаправлення

Правила URL-адреси Flask базуються на модулі маршрутизації Werkzeug. Ідея цього модуля полягає у забезпеченні красивих та унікальних URL-адрес на основі прецедентів, викладених Apache та попередніми HTTP-серверами.

Візьміть ці два правила:

@app.route('/projects/') 
def projects():
    return 'The project page'

@app.route('/about') 
def about():
    return 'The about page'

Хоча вони виглядають досить схожими, вони відрізняються між собою використанням кінцевої риски у визначенні URL-адреси. У першому випадку канонічна URL-адреса кінцевої точки проектів має кінцеву скісну риску. У цьому сенсі це схоже на папку у файловій системі. Доступ до неї без кінцевої косої риски призведе до перенаправлення Flask на канонічну URL-адресу із кінцевою рисою.

Однак у другому випадку URL-адреса визначається без похилої риски, а не як шлях до файлу в UNIX-подібних системах. Доступ до URL-адреси з кінцевою косою рисою призведе до помилки 404 "Не знайдено".

Така поведінка дозволяє відносним URL-адресам продовжувати працювати, навіть якщо кінцева коса риса опущена, відповідно до того, як працюють Apache та інші сервери. Крім того, URL-адреси залишаться унікальними, що допомагає пошуковим системам уникати індексування однієї сторінки двічі.

Тож просто додайте /users/також до маршрутизації.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.