티스토리 뷰

반응형

> python 으로 서버를 만드는 방법은 여러가지가 있다. 장고보다 쉬운 플라스크를 사용해서 서버를 만들어 보자.

 

 

 

0. Flask 개발환경 구축

기본적으로 Flask의 개발 환경은 python 3.7 이상부터 지원가능하다. 기본적으로 파이썬은 설치되었다고 생각하고 진행하겠다. 아래의 명령어로 가상환경을 만들자.

 

// 파이썬 가상환경 만들기
$ mkdir myproject
$ cd myproject
$ python -m venv venv

// 가상환경 접속하기
[window] $ source venv/scripts/activate
[mac/ubuntu] $ source venv/bin/activate

// 가상환경 나오기
$ deactivate

 

 

1. Flask 설치하기 / 시작하기

가상환경 내부에서 아래의 명령어를 치면된다.

$ pip install Flask

 

 

app.py를 만들고 아래를 적자.

 

from flask import Flask   # flask 클래스를 가져온다.
app = Flask(__name__)     # 플라스크 객체를 생성한다. __name__은 현재 실행 중인 모듈 이름을 전달하는 것이다.

@app.route('/')           # 기본서버 127.0.0.1:5000 뒤에 붙는 주소를 적어준다.
def index():              # 위의 주소를 호출 시 보여 줄 것을 함수로 작성해 준다. 중복되지 않도록만 적어주면된다.
    return 'Hello world'  # 문자열이 출력된다.
    
if __name__ == '__main__':# 다른데서 부르면 실행하지 마라는 뜻이다.
    app.run()

 

 

  • app.run(debug=True)   # debug=True를 하면 고칠 때마다 자동으로 실행한다.
  • app.run(port = 80)    # 포트 번호를 바꿔준다.
    • ex_ app.run(debug=True, port=80) 

 

정리하면 아래와 같다.

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run(debug=True, port=80)

 

위의 코드가 플라스크의 기본 구조라고 할 수 있다. python파일을 실행시키면 flask를 실행 가능하다.  이때 주의할 점은 파일이름을 flask.py라고 하면 충돌이 나니 주의해야한다.

 

 

 

2. FLASK에서 Template, Static파일

  • template는 html파일을 저장한다.
  • static 파일은 css, js, Image 파일을 만든다. 
  • html 파일은 render_template() 함수를 이용하셔 연동이 가능하다. 예시는 아래와 같다.
@app.route("/")
def hello():
    return render_template('index.html')

 

그리고 template와 staic의 파일 기본 구조는 아래와 같다.

- app.py

- template(폴더)

- static(폴더)

 

 

 

라우팅을 사용법(Variable rules)

  • <>는 데이터를 나타낸다.   ex <username>
  • <>는 데이터 타입을 정할 수 있다. <int:age>
  • 함수의 인자값으로 사용된다.
@app.route('/user/<username>')
def show_user_profile(username):  # <>내용은 함수의 인자로 꼭 적어줘야한다.
    return 'user %s' %username

@app.route('/user/<username>/<int:age>')
def show_usr_profile_age(username, age):
    return 'user %s 나이 %d' %(username, age)

 

 

 

REQUEST 객체

데이터는 request 객체 안에 들어가 있고 클라이언트는 request를 서버로 전달한다.

request를 사용하려면 import해줘야한다.

 

request객체의 속성

  • Form - form은 매개변수가 key고 값을 value로 하는 딕셔너리다.   : POST 방식
  • args - URL 부분 중 물음표 뒤에 있는 쿼리 문자열(query string)을 parse한다.    : GET 방식
  • Cookies - 쿠키 이름과 그 값을 가지는 딕셔너리 객체이다.
  • files - 업로드 파일과 관련된 데이터이다.
  • method - 현재 request method를 의미한다.

우선 예시를 보고 설명을 하겠다.

 

# get, POST는 html의 form에서 GET POST를 method로 지정해 준다.
@app.route('/login', methods=['GET'])
def login():
    return 'get 이름은 %s' % request.args.get('username')

@app.route('/login', methods=['POST'])
def loginp():
    result = request.form
    return render_template('form_result.html', result=result)
    # return 'post 이름은 %s' % request.form['username']     # 딕셔너리에 접근하기 때문에 대괄호이다.

 

 

 

Method 사용법

  • 라우팅 주소에 methods 변수에 GET, POST를 설정한다.
  • reqeust.method == 'POST'와 같이 request.method는 문자열을 반환 받아 사용한다.

 

 

데이터를 보낼 때는 보통은 html의 form tag를 사용한다. form은 아래와 같다.

# index.html
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Practice</title>
</head>
<body>
    첫번째 연습 파일.
    <form action="/login" method="POST">
        <input type="text" name="username">
        <input type="submit" value="확인">
    </form>
</body>
</html>
<!-- # name을 반드시 적어줘야한다. -->
<!-- # name을 안적으면 서버에서 값을 찾을 수가 없다 -->

 

위의 form 태그를 사용하여 method부분에 POST나 GET을 적어서 활용해 준다.

 

 

request.args

  • get 방식으로 들어온 데이터를 받을 수 있다.
  • request.args.get('username') 으로 데이터를 받을 수 가 있다.
@app.route('/login', methods=['GET'])
def login():
    return 'get 이름은 %s' % request.args.get('username')

 

 

request.form

  • post 방식으로 들어온 데이터를 받을 수 있다.
  • request.form으로 데이터를 받는다.
@app.route('/login', methods=['POST'])
def loginp():
    result = request.form
    return render_template('form_result.html', result=result)

 

request.form으로 데이터를 받아서 result 변수에 넣는다. 그리고 result=result에서 오른쪽 result가 받은 데이터 변수를 넣은 것이고 왼쪽 result가 html에서 사용가능 한 string이다.

 

{% key, value in result.items() %}
  <p>{{ key }}</p>
  <p>{{ Value }}</p>
{% endfor %}

 

위와 같은 형식으로 사용가능하다

 

 

 

 

request.files

form형식으로 아래와 같이 HTML에서 적는 것이 가능하다

 

<html>
  <body>
    <form action = "/fileUpload" method = "POST" enctype = "multipart/form-data">
      <input type = "file" name ="file" />
      <input type = "submit"/>
    </form>
  </body>
</html>

 

  • form의 actiom은 url을 적는 부분이다.
  • 부트스트랩을 사용하더라도 form 부분에 action, method, enctype를 추가해 줘야한다.
  • input의 type이 file 부분에 name을 추가해 줘야 값을 그 파일을 통해 값을 찾을 수 있다.
  • python의 저장 로딕은 아래와 같다.
@app.route('/fileupload', methods=['POST'])
def filleupload():
    f = request.files['file']
    dirname = os.path.dirname(__file__) + '/uploads/' + f.filename    # __file__ : 현재파일인 경로를 알려준다.
    f.save(dirname)
    return 'uploads 성공'
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함