Flask를 사용한 Python Routes 문제

Oct 22 2020

여러 경로가 가능한 다음 기능이 있습니다.

@bp.route('/list/', defaults={'status': None, 'time': None, 'search': None})
@bp.route('/list/lot/', defaults={'status': None, 'search': None, 'time': None})
@bp.route('/list/lot/<string:time>/', defaults={'status': None, 'search': None})
@bp.route('/list/lot/<string:time>/<string:status>', defaults={'search': None})
@bp.route('/list/lot/<string:time>/<string:status>?search=<path:search>')
@login_required
def index(status, time, search):
    print(search)

마지막 경로를 제외하고 모든 경로가 잘 작동합니다. 다음과 같은 URL이 있습니다.

http://192.168.10.88:5000/list/lot/OLDER/NEW?search=test

그리고 그 이유를 이해하지 못합니다 None. 인쇄물은 항상 .

어떤 아이디어?

감사

답변

1 Tobin Oct 22 2020 at 20:26

request또는 request.query_string쿼리 문자열을 얻으려면 다음을 사용할 수 있습니다 .

from flask import request

@bp.route('/list/', defaults={'status': None, 'time': None, 'search': None})
@bp.route('/list/lot/', defaults={'status': None, 'search': None, 'time': None})
@bp.route('/list/lot/<string:time>/', defaults={'status': None, 'search': None})
@bp.route('/list/lot/<string:time>/<string:status>', defaults={'search': None})
@bp.route('/list/lot/<string:time>/<string:status>?search=<path:search>')
@login_required
def index(status, time, search):
    print(request.query_string, request.args.get('search'), time, status)
    #  b'search=test' test OLDER NEW
    return 'OK'

내가 request검색의 가치를 얻는 데 사용한 방법에 대해 언급합니다 request.args.get('search').

더 간단하고 깔끔한 또 다른 접근 방식은 다음과 같습니다.

@bp.route('/list/lot/parameters')
@login_required
def index():
    print(request.args.get('time'), request.args.get('status'), request.args.get('search'))
    return 'OK'

URL은 다음과 같습니다.

http://192.168.10.88:5000/list/lot/parameters?time=OLDER&status=NEW&search=test
1 noslenkwah Oct 22 2020 at 16:15

다음 부분 ?은 쿼리 문자열입니다. Flask가 경로를 일치시킬 때 쿼리 문자열을 제거한다고 99 % 확신합니다 (문서에서 이것을 확인할 수 없으므로 1 %). 이는 경로를 일치시킬 때 다음 URL이 동일 함을 의미합니다.

http://192.168.10.88:5000/list/lot/OLDER/NEW?search=test
http://192.168.10.88:5000/list/lot/OLDER/NEW

하려는 작업을 수행하는 또 다른 방법은 모든 변수에 대해 쿼리 문자열을 사용하는 것입니다.

@bp.route('/list/')
@bp.route('/list/lot/')
@login_required
def index():
    status = request.args.get('status', default=None)
    time = request.args.get('time', default=None)
    search = request.args.get('search', default=None)

    print(search)