2017. 10. 10.

[Python] Flask 변수 규칙(Variable rules)

Flask 변수 규칙

변수 부분을 rule 매개변수에 추가하면 동적으로 URL을 만들 수 있습니다. 이 변수 부분은 <variable-name>으로 표시합니다. 즉, <>안에 변수 이름을 설정해서 사용할 수 있습니다. 변수 부분은 키워드 인자로 rule에 관련된 함수에 전달됩니다.


다음 예제에서 route() 데코레이터의 rule 매개변수는 URL ‘/hello’에 붙어있는 <name> 변수 부분을 포함하고 있습니다. 그러므로 만약 브라우저에 URL을 http://localhost:5000/hello/my_name으로 입력하면 ‘my_name’는 hello_name(name)의 인자로 전달됩니다.


from flask import Flask
app = Flask(__name__)

@app.route('/hello/<name>')
def hello_name(name):
 return 'Hello %s!' % name

if __name__ == '__main__':
 app.run(debug = True)


이 코드를 저장하고 실행한 후에 브라우저 주소창에 http://localhost:5000/hello/my_name를 입력합니다.


그러면 브라우저에 다음과 같은 결과가 나타납니다.


Hello my_name!
변수 부분의 기본 자료형은 string입니다. rule은 변환자(converter)에 따라서 자료형을 설정할 수 있습니다. 변환자는 다음과 같습니다.


  • int: 정수(integer)로 사용합니다.
  • float: 부동소수 값(float)
  • path: 디렉토리에 사용된 ‘/’를 독립된 character로 사용합니다.


다음 코드는 이 변환자를 어떻게 사용하는지 보여줍니다.


from flask import Flask
app = Flask(__name__)

@app.route('/blog/<int:postID>')
def show_blog(postID):
 return 'Post Number %d' % postID

@app.route('/rev/<float:revNo>')
def revision(revNo):
 return 'Revision Number %f' % revNo

if __name__ == '__main__':
 app.run(debug = True)


이 코드를 실행시키고, 브라우저 주소창에 http://localhost:5000/blog/11를 입력합니다. 결과를 예상해봅시다. Flask 애플리케이션, 우리가 작성한 코드는 http://localhost:5000/blog/11를 라우팅합니다. http://localhost:5000가 메인 페이지가 되고, 그 다음에 나오는 /blog/11가 @app.route(‘/blog/<int:postID>’)에 의해서 라우팅됩니다. 그리고 이것과 연결된 show_blog(postID)가 호출됩니다. 이 때 변환자에 의해서 postID가 int 자료형으로 변환되어 반환됩니다. 결과는 다음과 같습니다.


Post Number 11


http://localhost:5000/rev/10.1을 브라우저 주소창에 입력하면 어떻게 될까요? 한번 예상해보고 실행해보길 바랍니다. 여기서 주의할 점은 http://localhost:5000/rev/10을 입력하면 404 Not Found 에러가 발생합니다. 라우팅할 주소의 자료형을 맞춰주어야 하기 때문입니다.


이런 Flask의 URL rule은 Werkzeug의 라우팅 모듈을 기본으로 합니다. Flask의 URL rule은 URL이 고유한지, Apache의 선례를 따르는지 확인합니다.


다음 스크립트에서 정의된 rule을 고려해봅시다.


from flask import Flask
app = Flask(__name__)

@app.route('/flask')
def hello_flask():
 return 'Hello Flask'

@app.route('/python/')
def hello_python():
 return 'Hello Python'

@app.route('/')
def hello_home():
  return 'Hello Home'

if __name__ == '__main__':
 app.run(debug = True)


‘/flask’와 ‘/python/’이 비슷하게 보일 것입니다. 차이점은 ‘/python/’의 끝에 (/)가 사용되었다는 점입니다. 결과적으로 표준의 URL이 됩니다. 그래서 /python 혹은 /python/을 입력하면 동일한 결과를 확인할 수 있습니다. 하지만 /flask/를 입력하면 404 Not Found 에러가 발생합니다.

다음에 다룰 내용은 무엇인가요?


Flask의 리다이렉트(redirect)에 대해서 알아볼 예정입니다. 리다이렉트에 유용하게 사용할 수 있는 url_for() API도 함께 다룰 것입니다.

댓글 없음:

댓글 쓰기