Flask를 사용하여 URL에서 명명 된 매개 변수를 얻으려면 어떻게해야합니까?


366

사용자가 플라스크 앱에서 실행되는이 URL에 액세스하면 웹 서비스가 물음표 뒤에 지정된 매개 변수를 처리 할 수 ​​있기를 원합니다.

http://10.1.1.1:5000/login?username=alex&password=pw1

#I just want to be able to manipulate the parameters
@app.route('/login', methods=['GET', 'POST'])
def login():
    username = request.form['username']
    print(username)
    password = request.form['password']
    print(password)

89
보안을위한 작은 힌트 : GET 요청에 비밀번호를 포함시키지 마십시오. security.stackexchange.com/questions/147188/…
palsch

6
보안에 대한 또 다른 작은 힌트 : 암호를 HTTP 끝점으로 보내지 마십시오 (HTTPS 만 해당)
DerMike

답변:


591

request.args쿼리 문자열의 구문 분석 된 컨텐츠를 가져 오는 데 사용하십시오 .

from flask import request

@app.route(...)
def login():
    username = request.args.get('username')
    password = request.args.get('password')

1
에서 매개 변수를 사용하는 것과 어떻게 비교 app.route('/username=<username>&password=<password>')됩니까? 그렇게하면 request.args.get 줄을 전혀 쓰지 않습니다.
multigoodverse

@multigoodverse는 URL에서 GET을 통해 비밀번호를 보내지 않아야하는 이유에 대한 질문에 대한 첫 번째 의견을 참조하십시오. 더 일반적으로, GET 요청은 ?매개 변수의 시작 부분에 있어야하므로 원할 것입니다 app.route('/?username=<username>&password=<password>'). 그러나 Flask는 물음표 뒤에있는 모든 것을 읽고 request.args경로의 변수를 해석하지 않습니다. HTML 양식을 사용하여 예제 경로로 이동하려면 작동하도록 추가 JavaScript가 필요합니다. 마지막으로 경로 변수는 필수이며 request.args선택 사항 일 수 있습니다.
데릭

144

URL 매개 변수는 기본값 ( ) 및 유형 ( )에 대한 선택적 매개 변수 가있는 메소드 request.args가있는 ImmutableMultiDict 에서 사용할 수 있습니다.이 매개 변수는 입력 값을 원하는 형식으로 변환하는 호출 가능입니다. (자세한 내용은 방법 설명서 를 참조하십시오.)getdefaulttype

from flask import request

@app.route('/my-route')
def my_route():
  page = request.args.get('page', default = 1, type = int)
  filter = request.args.get('filter', default = '*', type = str)

위 코드를 사용한 예 :

/my-route?page=34               -> page: 34  filter: '*'
/my-route                       -> page:  1  filter: '*'
/my-route?page=10&filter=test   -> page: 10  filter: 'test'
/my-route?page=10&filter=10     -> page: 10  filter: '10'
/my-route?page=*&filter=*       -> page:  1  filter: '*'

2
@qqbenq. 이것은 탁월한 답변입니다! 이 기능이나 코드에 플라스크를 좋아해야할지 모르겠지만 이것이 바로 URL 입력을 구문 분석하려는 것이 었습니다.
frakman1

2
filter– 예약하지 않은 단어입니다;)
Ivan Camilito Ramirez Verdes

88

뷰 정의의 URL에 대괄호 <>를 사용할 수도 있으며이 입력은 뷰 함수 인수로 이동합니다.

@app.route('/<name>')
def my_view_func(name):
    return name

1
나는 이것이 플라스크 문서의 내용이기 때문에 이것이 답이 될 것이라고 생각한다.
Nathan Gavenski

31

URL에 단일 인수가 전달 된 경우 다음과 같이 수행 할 수 있습니다.

from flask import request
#url
http://10.1.1.1:5000/login/alex

from flask import request
@app.route('/login/<username>', methods=['GET'])
def login(username):
    print(username)

여러 개의 매개 변수가있는 경우 :

#url
http://10.1.1.1:5000/login?username=alex&password=pw1

from flask import request
@app.route('/login', methods=['GET'])
    def login():
        username = request.args.get('username')
        print(username)
        password= request.args.get('password')
        print(password)

매개 변수가 양식 매개 변수로 전달되고 URL에 표시되지 않는 POST 요청의 경우 수행하려는 작업이 작동합니다. 실제로 로그인 API를 개발하는 경우 GET 대신 POST 요청을 사용하고 데이터를 사용자에게 노출시키는 것이 좋습니다.

사후 요청의 경우 다음과 같이 작동합니다.

#url
http://10.1.1.1:5000/login

HTML 스 니펫 :

<form action="http://10.1.1.1:5000/login" method="POST">
  Username : <input type="text" name="username"><br>
  Password : <input type="password" name="password"><br>
  <input type="submit" value="submit">
</form>

노선:

from flask import request
@app.route('/login', methods=['POST'])
    def login():
        username = request.form.get('username')
        print(username)
        password= request.form.get('password')
        print(password)

11

URL :

http://0.0.0.0:5000/user/name/

암호:

@app.route('/user/<string:name>/', methods=['GET', 'POST'])
def user_view(name):
    print(name)

(편집 : 형식 문자열에서 공백 제거)


-1

정말 간단합니다. 이 과정을 두 가지 간단한 단계로 나누겠습니다.

  1. html 템플릿에서 사용자 이름 및 비밀번호의 이름 태그를 다음과 같이 선언합니다.

    <form method="POST">
    <input type="text" name="user_name"></input>
    <input type="text" name="password"></input>
    </form>
  2. 그런 다음 코드를 다음과 같이 수정하십시오.

    from flask import request
    
    @app.route('/my-route', methods=['POST']) #you should always parse username and 
    # password in a POST method not GET
    def my_route():
      username = request.form.get("user_name")
      print(username)
      password = request.form.get("password")
      print(password)
    #now manipulate the username and password variables as you wish
    #Tip: define another method instead of methods=['GET','POST'], if you want to  
    # render the same template with a GET request too

-2

사용 request.args.get(param)예를 들어, :

http://10.1.1.1:5000/login?username=alex&password=pw1
@app.route('/login', methods=['GET', 'POST'])
def login():
    username = request.args.get('username')
    print(username)
    password = request.args.get('password')
    print(password)

다음은 코드에 대한 참조 링크입니다.


그런 사용자 이름과 비밀번호를 노출시키지 마십시오! TS의 palsh 및 DerMike 의견을 참조하십시오.
Bas van Ommen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.