Security Engineer 2022. 12. 27. 21:00

6.0 Introduction

 

Flask 는 Python 을 이용해서 웹사이트를 구축할 수 있는 초소형 micro framework 이다.

micro framework 라고 불리는 이유는 크기가 매우 작고, 매우 사용하기 쉬워서이다.

웹사이트를 만들고, 사용자 입력을 처리하고, 파일을 전달하고, HTML 파일을 사용자 에게 보여주는 등

이런 작업들을 매우 적은 줄의 코드로 수행할 수 있다.

 

input 이 있는 form 을 갖는 웹사이트 코드를 위한 UI ( User Interface ) 를 만든다.

사용자가 'Python'을 입력하고, Enter 를 누르면 웹사이트에서 작업을 확인하게 만든다.

또는 사용자가 export 할 파일을 정하고 csv로 다운로드 할 수 있게 한다.

 

이전에 만들었던 webscrapper 코드를 사용한다. ( main.py )

Flask를 main.py 파일에 넣기위해,

파일을 생성하는 function을 따로 만들어 file.py 에 넣는다.

 

 

6.1 Hello Flask

 

file.py 안에 save_to_file 이라는 함수를 만든다.

file_name으로 file 을 하나 생성하고, file의 header를 쓰고

jobs의 각 jobs들에 대해서 동일한 작업을 하고 나서, file을 닫는다.

( 아래의 코드들을 file.py 에서 함수로 만들어서 진행한다는 의미이다. - main.py 의 일부코드 )

file = open(f'{keyword}.csv','w',encoding='utf-8-sig')
file.write('Postition,Company,Location,URL\n')


for job in jobs:
    file.write(f"{job['position']},{job['company']},{job['location']},{job['link']}\n")

file.close()

 

위 코드를 복사해서 file.py 에 아래와 같이 붙여넣는다.

def save_to_file(file_name, jobs):
    file = open(f'{file_name}.csv','w',encoding='utf-8-sig')
    file.write('Postition,Company,Location,URL\n')


    for job in jobs:
        file.write(f"{job['position']},{job['company']},{job['location']},{job['link']}\n")

    file.close()

 

main.py 코드들은 아래와 같이 수정해준다.

from extractors.indeed import extract_indeed_jobs
from extractors.wwr import extract_wwr_jobs
from file import save_to_file

keyword = input('What do you want to search for?')

indeed = extract_indeed_jobs(keyword)
wwr = extract_wwr_jobs(keyword)

jobs = indeed + wwr

save_to_file(keyword, jobs)

 

만약 main.py 코드 실행 시 아래와 같은 오류가 발생한다면

file.py 코드를 한번 실행 시켜준 후 다시 main.py 코드를 실행 시키면 해결된다.

( 아마 file.py 코드 내의 save_to_file 함수가 정의되지 않았다고 인식한거 같다. )

 

이전과 마찬가지로 python 입력시 채용공고 정보들을 스크랩 하여 pyhon.csv 파일로 저장된다.

파일을 저장하는 코드를 함수 save_to_file 로 옮겼다.

save_to_file 함수 = CSV 파일 이름이 될 file_name 과 job의 리스트가 될 jobs를 받는 함수이다.

main.py 를 실행해서 호출한다. ( save_to_file )

 

 

이제 main.py 에 있는 모든 코드를 삭제한다.

그리고 cmd ( 명령프롬프트 ) 창을 열고 pip install flask 를 입력해서 flask 를 설치한다.

 

이제 새로운 flask application 을 만든다.

 

main.py 에 아래 코드 작성

from flask import Flask

app = Flask("JobScrapper")

app.run("0.0.0.0")

app 라는 변수를 만들고, 그 app 를 초기화 한다.

이름은 아무거나 해도 상관없다. ( JobScrapper )

app.run 을 사용해서 이 application 을 실행한다.

( 웹 서버를 실행 )

 

코드를 실행하면 아래 화면 뜬다.

새로운 크롬창을 열고 127.0.0.1:5000   혹은   115.23.142.175:5000 에 접속해본다.

127.0.0.1:5000
115.23.142.175:5000

이전까지는 코드를 실행하면 python 스크립트를 실행한 결과를 vs code 콘솔창에서 보는게 전부였지만,

이제 웹 서버와 연결되어 브라우저 창에서 볼수 있다.

 

위 코드는 Flask application 을 간단히 만들어서 실행해본 코드이다.

브라우저에서 Not Found 가 발생하는 이유는 브라우저, 사용자가 웹사이트에 방문하려 하지만,

아직 위 코드에서는 방문자들을 처리해주는 어떤 코드도 없기 때문에

( 응답할 코드를 작성하지 않았기 때문에 )

GET 뒤에 " / " 가 있는데 여기에서 " / " 는 홈페이지를 의미한다.

브라우저는 GET 으로 홈페이지를 가져오려 했지만 코드에 아무것도 작성하지 않았기 때문에

Not Found 가 브라우저에 뜬다.

 

일반적으로 사용자가 브라우저로 웹사이트에 접속하면 브라우저에서 request 요청을 하기 때문에

웹 서버에서는 그에 관한 reply 를 해준다. ( 이미지, 동영상, 댓글 등등 )

위 코드에서는 아무것도 작성하지 않았기 때문에 Not Found 가 뜬다.

( Flask 는 위 3줄의 코드로 서버를 만들었고 사용자의 request 까지 받을 수 있게 만들었다. )

 

이제 사용자가 홈페이지로 접속하면 reply 해줄 코드를 작성한다. ( 사용자가 브라우저에서 보는 화면 )

from flask import Flask

app = Flask("JobScrapper")

@app.route("/")
def home():
    return 'Welcome our website'

app.run("0.0.0.0")

사용자가 이 route로 이동하면 함수를 실행하도록 한다.

home , potato, apple 원하는 어떤 이름으로도 만들수 있다.

여기서 핵심은 @가 있는 코드를 함수의 바로 위에 위치시켜야한다.

( @app.route("/") →  decorator 라고 한다. )

이건 sysntactic sugar 라고 하는데, 문법은 간단하지만, 여기서 일어나는 일은 사실 좀 더 복잡하다는 의미이다.

정상 작동

만약 decorator를 함수 (  def home(): ) 위에 두면 Flask는 사용자가 이 주소의 페이지를 방문했을 때 

이 함수 ( def home(): ) 를 호출해야하는 것을 알게 된다.

하지만 이 decorator 가 이 함수를 decorating 하고 있을 때만 이렇게 동작한다.

작동 X

만약 이렇게 다른코드가 있으면 동작하지 않는다.

decorator 와 함수는 항상 같이 있어야한다.

@app.route("/") 와 deh home(): 은 붙어있어야 함

위 코드를 실행하고 크롬창에 127.0.0.1:5000  또는 115.23.142.175:5000 에 접속하면

내가 입력했던 home 함수의 return 값 ' Welcome our website ' 가 보인다.

vs code 콘솔 창

Flask 는 내가 만든 함수에서 return 한 값을 웹 페이지로 보여준다.

 

 

 


python 참고 강의

https://nomadcoders.co/python-for-beginners/lobby