flask

flask 기본적인 문법과 사용법1(라우팅, url변수, url 얻어오기, render_template, get,post통신)

코딩하는logcat 2023. 1. 3. 20:03

가상환경 여는법 : # source pywork/bin/activate

# cd pywork

flask 서버 실행하는 법 : #python 플라스크 파일.py

가상환경 나오는법 : #deactivate

 

flask 설치밑 실행법을 모른다면 아래 글을 보고 오시면 좋습니다.

https://logcat-programin.tistory.com/6

 

flask 설치및 기본적인 실행

우분투 리눅스에서 flask설치 밑 실행방법 1. pip 설치 (pip는 파이썬으로 작성된 패키지 라이브러리를 관리해주는 시스템우분투 리눅스의 apt-get느낌) # sudo apt-get install python-pip 2 Virtualenv 설치 (Virtua

logcat-programin.tistory.com

 

 

1.접근 권한

 


from flask import Flask
from flask import request

app = Flask(__name__)

@app.route('/')

def index_page():
    return "Hellow world!"

 

if __name__ == '__main__':
    app.run(host='자신의 아이피', port = 5550)

 

만약 app.run(host='자신의 아이피', port = 5550)을

 

app.run()으로 바꾸면

 

나의 아이피 이외에는 접근을 할 수 없다.

 

app.run(host = '')으로 모든 기기의 접근을 허용하는 것이다.

 

 

 

 

2.라우팅

 

 

 



@app.route('/')
def index_page():
    return "Hellow world!"

@app.route('/main')
def main_page():
    return "This is main page!!"


다음과 같이 여려개의 링크를 생성할 수 있다.

 

"자신의 아이피:post/"   에서는 

 

Hellow world! 가 출력되고

 

 

"자신의 아이피:post/main"   에서는

 

This is main page!! 가 출력된다.

 

 

3.변수

 

 

flask 공식 페이지에서는

 

변수 규칙

URL의 변수 부분을 추가하기위해 여러분은 <variable_name>``으로 URL에 특별한 영역으로 표시해야된다.  부분은 함수의 키워드 인수로써 넘어간다.  선택적으로, ``<converter:variable_name> 으로 규칙을 표시하여 변환기를 추가할 수 있다. 

라고 한다

 

@app.route('/user/<username>')

def show_username(username):
    return "user name = %s" % username

 

위처럼  URL부분에서 <변수명>으로 변수를 생상하면

해당 URL에 걸린 함수에서 <변수>를 사용할 수 있다. 

 

@app.route('/post/<int:post_id>')
def show_post(post_id):
    # show the post with the given id, the id is an integer
    return 'Post %d' % post_id

 

변수를 문자형이 아닌 정수형으로 쓸 수도 있다.

flask에서는

다음과 같은 변환기를 제공한다.

int accepts integers
float like int but for floating point values
path like the default but also accepts slashes

 

 

4.URL얻어오기

 

라우팅이 설정된 함수에 대한 URL을 얻어내기위해서  url_for() 함수를 사용할 수 있다. 이 함수는 첫번째 인자로 함수의 이름과 URL 룰의 변수 부분에 대한 다수의 키워드를 인자로 받는다. 알수없는 인자는 쿼리 인자로 URL에 덧붙여진다.

 

쉽게 말해 내가 만든 함수가 어느 URL에서 작동하는지 받을 수 있는 url_for()함수에 대한 설명이다.

 

예제로 이해해보자

 

@app.route('/')
def index_page():
return "wow"
    

@app.route('/user/<username>')
def show_username(username):
    return "user name = %s" % username

@app.route('/test/url')
def testurl():
return url_for('index_page') + url_for('index_page', kk = '?') + url_for( 'show_username', username = 'logcat')

 

/test/url 로 접속하면

 

//?kk=?/user/logcat   이 출력된다.

 

index_page의 url + index_page의 url +알수없는 인자 + username변수에 logcat이 들어간 함수 show_username의 url

 

이 출력된 것이다. 

 

url_for( 'show_username', kk = 'logcat')

이렇게 적으면 터진다.show_username에는 kk라는 변수명이 없기 때문이다.

 

index_page에 매계변수가 없기 때문에 뒤에 ,kk= 을 붙이면 그대로 출력되는 것이다.

 

 

 

 

 

 

 

 

5.render_template

브라우저 에서는 웹 페이지를 html언어로 웹페이지를 보여준다.

flask에서도 html을 사용할 수 있다

return ''

<html>

<head>

<body>

...

 

이렇게 불편한 방식으로 사용하는 것을 막기 위해 flask에서는 

html 파일을 불러올 수 있는 render_template 메소드를 제공한다.

 

이 함수는 프로젝트 폴더 내의 'templates'라는 이름의 폴더를 기본 경로로 설정한다.

templates 폴더를 만들고 그 안에 html 파일들을 저장해 놓는것이 좋다.

 

from flask import render_template

 


@app.route('/')

def index_page():
    return render_template('index.html')

 

flask 제공 메소드 이기 때문에 import를 해준 후

return render_template("html 파일 이름")

으로 사용할 수 있다.

 

폴더 경로는 앞서 말했다시피 templates 폴더 기준이다

templates 폴더 에 있는 ex1폴더 에 있는 파일을 라우팅 하고 싶다면

render_templates("ex1/test1.html")

이런식으로 사용하면 된다.

 

 

6.GET, POST 통신

http 메서드 종류

GET
리소스 취득
DELETE
파일 삭제
POST
엔티티 바디 전송
TRACE
경로 조사
PUT
파일 전송
CONNECT
프록시에서의 터널링 요구
HEAD
메시지 헤더 취득
OPTIONS
응답 가능 메소드 요청

 

(1).get

 

get은 url 꼬리에 정보를 붙에서 보낸다.

 

플라스크에서 요청에 대한 정보는 request에 담겨있고 객체는 안전을 보장한다. 파이썬에 존재하는 requests 모듈이 아니라 플라스크 프레임워크에 존재하는 request를 불러와 사용해야 하겠다.

이 request 모듈에는 HTTP 메서드에 대한 정보를 얻을 수 있는 method와 GET 방식으로 URL에 인자를 'key=value' 형태로 전달했을 때 그 인자를 참조할 수 있는 args, POST나 PUT 방식의 HTML 폼 데이터를 얻을 수 있는 form 속성이 있다.


@app.route('/test', methods = ['GET'])
def login():

temp = request.args.get('id', '')
temp2 = request.args.get('pass', '')

return "id : " + temp + ", " + "pass : " +temp2

 

ip:포트/test 로 접속했을때

 

 , 

가 출력되고

 

ip:포트/test?id = logcat&pass = 1234 로 접속했을때

 

logcat, 1234

가 출력된다.

 

request의 인자인 args가 url을 읽고 해당 key값에 담겨있는 value를 가져와 주는것 같다.

 

(2).post

 

POST 요청은 눈에 파라미터가 보이는 GET 요청과 달리 전달하려는 정보가 HTTP body에 포함되어 전달된다.

많은 양의 정보를 보내거나 중요한 정보를 보낼떄 url에 정보를 주렁주렁 달고 가는 get보다는 post가 선호된다.

전달하려는 정보는 Form Data, Json strings 등이 있다. 이에 따라 사용하는 경우가 다르다

 

웹페이지에서 아이디와 비번을 입력하면 post 방식으로 전달하여 전송받은 웹 페이지서 출력되는 프로젝트를 예제를 만들어 봤다

 

<html>
     <head>
          <meta charset="UTF-8">
          <title>HTML for python flask</title>
     </head>

     <body>
           <form action="/login" method="post">
​                <p>id : <input type="text" id="id" name="id"></p>
                <p>pass : <input type="text" id="pass" name="pass"></p>
                <p>.<input type="submit" value="" onclick="alert('제출 완료!')" /></p>
           </form>
     </body>
</html>

 

정보 입력 화면에서 render_template를 사용하서 실행할 html 파일

form 안의 submit을 누르면 form안의 모든 정보를  지정된 메소드로 전송한다.

 

from flask import Flask
from flask import render_template
from flask import request


app = Flask(__name__)

@app.route('/')

def index_page():
     return render_template('flask_form.html')

@app.route('/login', methods = ['POST'])
def login():

     id = request.form['id']
     pas = request.form['pass']

     return "id : " + id + ", " + "pass : " + pas

if __name__ == '__main__':
    app.run(host='ip주소', port = 포트번호)

 

 

/에 접속하면 render_template를 통해 앞의 html을 보여준다.

 

/login이 실행되면(접속하면)

 

정보를 입력하고 submit버튼을 누르면 

onclick="alert('제출 완료!')"  가 실행되고 /login 페이지로 넘어간다

 

 

/login 페이지에서 전달받은 값이 잘 출력된다.

 

(3).get, post 능동처리

 

같은 링크에 접속했을데 get요청인지, post요청인지에 따라 다른 동작을 할 수 있다.

 

post방식으로 값을 받는데 직접 url을 입력해서 링크에 접속한다면

전달받은 post값이 없는데 페이지가 열려서 에러가 뜬다.

 

이런 상황에서 쓰기 유용하다.

 

if(request.method == 'GET'):

     GET으로 접속시 실행할 명령

elif(request.method == 'POST'):

     POST로 접속시 실행할 명령

 

request.method 를 이용한다.

 

 

https://flask-docs-kr.readthedocs.io/ko/latest/quickstart.html

 

빠르게 시작하기 — Flask 0.11-dev documentation

웹 어플리케이션에 있어서 클라이언트에서 서버로 보내는 데이타를 처리하는 것은 중요한 일이다. Flask에서 이 정보는 글로벌한 request 객체에 의해 제공된다. 여러분이 파이썬 경험이 있다면,

flask-docs-kr.readthedocs.io

그 밖의 더 자세한 플라스크 기본 문법과 작동법은 위의 공식 홈페이지 참고