레이블이 튜토리얼인 게시물을 표시합니다. 모든 게시물 표시
레이블이 튜토리얼인 게시물을 표시합니다. 모든 게시물 표시

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도 함께 다룰 것입니다.

2017. 10. 9.

[Python] Flask 라우팅(Routing)


Flask Routing


현대 웹 프레임워크는 사용자가 애플리케이션의 URL을 기억할 수 있도록 도와주는 라우팅 기술을 사용합니다. 이 기술을 사용하여 홈페이지에서 탐색을 하지 않고도 원하는 페이지에 직접 접근할 수 있기 때문에 유용합니다.
Flask의 route() 데코레이터는 URL을 함수와 연결하는데 사용합니다. 예를 들면 다음과 같습니다.


@app.route('/hello')
def hello_world():
  return 'hello world'

URL ‘/hello’는 hello_world() 함수와 연결됩니다. 결국, 만약 사용자가  http://localhost:5000/hello URL을 방문하면, 이 URL과 연결된 hello_world() 함수의 반환값이 브라우저에 그려질 것입니다.

애플리케이션의 객체의 add_url_rule() 함수는 바로 위의 route()처럼 URL과 함수를 연결할 수 있습니다.

def hello_world():
  return 'hello world'
app.add_url_rule('/hello', 'hello_world', hello_world)

app.add_url_rule() 함수로 앞의 app.route()와 동일한 기능을 하도록 만들었습니다. Flask 문서에 따르면 route() 함수는 add_url_rule() 함수를 호출합니다.

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

URL의 일부를 변수로 사용하는 방법에 대해서 알아볼 것입니다. 그리고 이 변수를 함수의 인자로 전달하는 것도 다룰 것입니다.

[Python] Flask 테스트 - Hello World

Flask 테스트하기

설치한 Flask를 테스트하기 위해서, 사용하는 에디터에서 Hello.py 파일을 생성하고 다음 코드를 입력합니다. Hello.py는 처음 생성한 디렉토리의 루트 경로에 만들어야 합니다. 예를 들어, 저는 newproj/Hello.py를 생성하였습니다.

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
  return 'Hello World'

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

반드시 프로젝트에 Flask를 모듈을 import해야 합니다. Flask 클래스의 객체는 WSGI 애플리케이션 애플리케이션입니다.


Flask 생성자는 current module(__name__)을 인자로 받습니다.


Flask 클래스의 route() 함수는 데코레이터(decorator)입니다. 이 데코레이터는 애플리케이션에 어떤 URL가 호출해야 하는 연관된 함수를 요청합니다.


app.route(rule, options)

  • rule: 이 함수와 연결된 URL를 나타냅니다.
  • options: rule 객체에 전달될 인자 목록입니다.

위 예시 코드의 ‘/’는 URL은 hello_world() 함수와 연결되어 있습니다.그러므로 브라우저에서 웹 서버의 홈 페이지가 열리면, 이 함수의 반환값이 화면에 그려질 것입니다.


마지막으로 Flask 클래스의 run() 메소드는 로컬 개발 서버에 애플리케이션을 실행합니다.


app.run(host, port, debug, options)


모든 인자는 선택적입니다.

  • host: 응답을 받는 hostname. 127.0.0.1(localhost)가 기본값. 외부에 사용가능한 서버는 ‘0.0.0.0’을 설정합니다.
  • port: 기본값은 5000
  • debug: 기본값은 false. 만약 true로 설정하면, debug 정보를 제공합니다.
  • options: Werkzeug 서버에 전달할 내용

이제 Hello.py를 실행합니다.


참고로 정상적으로 실행하기 위해서 준비되어야 하는 사항

  • virtualenv가 설치되어야 합니다.
  • virtualenv가 활성화되어야 합니다.
  • Flask가 설치되어야 합니다.
  • Hello.py가 디렉토리 루트에 위치해야 합니다.

위 사항은 이전 포스팅에 설명되어 있으므로 참고하시길 바랍니다.


Hello.py가 정상적으로 실행되면 다음과 같은 정보를 확인할 수 있을 것입니다.

* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

이제 127.0.0.1:5000(localhost)에서 웹 애플리케이션 서버가 동작합니다. 웹 브라우저의 주소창에 이 주소(hostname)를 입력하면 Hello.py 코드가 실행되어 응답을 줄 것입니다. 바로 ‘Hello World’를 브라우저에서 확인할 수 있습니다.

Debug Mode

Flask 애플리케이션은 run() 메소드가 호출하여 실행됩니다. 하지만 애플리케이션을 개발 중이라면 코드가 수정될 때마다 수동으로 재시작해주어야 합니다. 이런 불편함을 피하기 위해서 debug mode를 활성화해야 합니다. 서버는 코드가 수정되면 스스로 재시작됩니다. 그리고 debug mode는 애플리케이션에서 발생할 수 있는 에러를 편리하게 추적할 수 있습니다.


debug mode는 애플리케이션의 debug를 True도 설정하여 활성화할 수 있습니다.


app.debug = True
app.run()


혹은


app.run(debug = True)
실제로 Hello.py가 실행 중에 코드를 수정하면 다음을 확인할 수 있습니다.

* Detected change in '/mnt/d/Projects/newproj/Hello.py', reloading
* Restarting with stat
* Debugger is active!
* Debugger PIN: 334-372-594

코드가 수정되면 위와 같이 애플리케이션 즉시 재시작됩니다.

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

Flask의 라우팅에 대해서 살펴볼 예정입니다. Flask를 사용하여 만든 웹 애플리케이션의 URL과 함수를 연결하는 방법을 다룰 예정입니다.