Security Engineer 2022. 12. 30. 21:00

6.4 Recap

 

지금까지 했던 Flask 를 이용해서 웹 페이지를 연결했던 작업을 간단히 정리해본다.

 

Flask 를 설치하였고, Flask 를 import 했다. ( Flask 설치는 cmd 창을 열고 pip install flask 입력하면 설치완료 )

Job Scrapper 라고 불리는 새로운 Flask application인 app 변수를 만들었다.

이 app 변수는 유용하게 쓸 수 있다.

 

< main.py >

from flask import Flask, render_template

app = Flask("JobScrapper")

app.run("0.0.0.0")

시작 부분에서 app.run() 함수를 호출하면 Flask application 을 그냥 만들어준다.

 

( ) 안에 0.0.0.0 이나 127.0.0.1 등 의 특정 IP 를 입력하면

웹 서버를 연결시켜 브라우저에 (크롬, 파이어폭스 엣지 등) 해당 IP 를 입력하게 되면 접속이 된다.

( 아직 제대로 response 데이터를 입력한게 없으니 Not Found 가 화면에 뜬다. )

 

그리고 사용자가 웹 페이지를 방문했을 때 응답하는 코드도 작성해보았다.

( 사용자의 request 와 그에 상응하는 response )

 

< main.py >

from flask import Flask, render_template

app = Flask("JobScrapper")

@app.route("/")
def home():
    return "hi"

app.run("0.0.0.0")

콘솔창:

 

@app.route ( ) 를 사용하여 응답할 페이지를 지정해주기만 하면 된다.

( @app.route 는 decorator 라고 한다. )

@app.route ( "/" ) 괄호 안의 내용 →  /  를 url 에 입력 시 아래 함수로 응답하겠다는 의미이다.

( / 는 사실 아무것도 입력하지 않아도 연결된다, url directory를 구분해주는 slash 일뿐이다. )

@app.route ( "/" )  같은 decorator 를 쓰고 바로 아래 함수를 만들어서 응답한다.

( @app.route( "/" ) → URL 에 127.0.0.1:5000 입력 시 hi 를  return 하겠다. )

( 숫자, 문자열 등등 return 할수 있다. )

 

127.0.0.1:5000 접속 시 hi 가 return 됨

위와 같이 hi 라는 문자열을 return 할수 있지만,  많은 HTML 을 보내고 싶은 경우 위와 같은 방법은 한계가 있다.

좀 더 복잡한 문자열이나 UI 를 만들고 싶으면 이를 위해 render_template 이라는 함수를 import 했다.

( 더 많은 HTML, CSS 를 사용한 UI )

render_template은 Flask 가  templates 폴더를 들여다 보게 한다.

그리고 내가 정한 이름의 template을 찾아준다.

templates 폴더 생성
main.py 와 같은 위치 생성

vs code 에서 새로운 폴더를 만들고 templates 라고 이름을 짓는다.

Flask 가 templates 라는 이름의 폴더를 찾아보기 때문에 소문자 그대로 폴더이름을 짓는다.

또한 폴더 위치도 main.py 와 같은 선상에 있어야한다. ( 다른 폴더 안에 있거나 하면 안된다. )

templates 폴더 안에 home.html 이라는 새로운 파일을 만든다.

 

< main.py >

from flask import Flask, render_template

app = Flask("JobScrapper")

@app.route("/")
def home():
    return render_template("home.html", name="james", age=20)

app.run("0.0.0.0")

위 코드에서는 Flask 에게 home.html 이라는 template 을 render 요청을 하고있다.

rendering 은 단순히 사용자에게 HTML 을 전달할 뿐만 아니라 HTML 에 변수도 전달할 수 있다.

( name 과 age 라는 변수 전달 ) -  {{ }} 중괄호를 사용해서 변수 작동

그리고 사용자가 응답을 받기 전에 Flask 가 하는 일은 HTML 안의 변수를 실제 data 로 바꿔준다.

( 웹 페이지에 접속하면 Flask 가 변수 값을 그 자리에 넣어주는것을 확인할 수 있다. )

 

< home.html >

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Job Scrapper</title>
</head>
<body>
    <h1>Hello to you! My name is {{name}}, I'm {{age}} years old</h1>
</body>
</html>

위 main.py 와 home.html 코드는 서로 연결되어 main.py 코드 실행 시

크롬창 새로 열고 주소창에 127.0.0.1:5000 입력 후 접속하면 아래처럼 페이지가 뜬다.

따라서 rendering은 사용자에게 HTML 을 전달하는 것 뿐만 아니라, 실제로 HTML 파일에 데이터를 보낸다.

그러면 Flask 는 변수를 data로 변경하고 사용자가 보는 진짜 HTML 을 만든다.

그래서 render_template 을 사용한다. ( 단순 문자열 뿐만 아니라, HTML 파일에 데이터를 보내기 때문 )

 

 

home.html 에 간단한 form 을 만들어보았다.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Job Scrapper</title>
</head>
<body>
    <h1>Job Scrapper</h1>
    <h4>What job do you want?</h4>
    <form action="/search">
        <input type="text" name="keyword" placeholder="Write keyword please" />
        <button>Search</button>
    </form>
</body>
</html>

웹 페이지 출력값:

action은 form 이 어디로 가는지를 알려준다.

→ <form action="/search"> 코드 추가  form 입력 시 /search 로 이동.

<input type="text" name="keyword" placeholder="Write keyword please" />

→ input 타입은 text, name 은 keyword, placeholder (안내문구) 는 Write keyword please 로 정의

 

form 에는 1개의 input 과 1개의 button 이 있다.

input 의 name 을 keyword 로 설정하고,

브라우저에게 form 이 submit 될 때,

즉 사용자가 enter 나 search 버튼을 누를 때 /search 페이지로 이동하게 했다.

이게 의미하는거는 /search 페이지로 가서 URL 에 있는 input 값들에 접근할 수 있다는 것이다.

왜냐하면 GET method 를 사용하기 있기 때문이다.

 <form action="/search"> 와 <form action="/search" method="get"> 은 서로 동일하다.

모든 form 은 기본으로 GET method 가 설정되어 있다.

GET method 는 사용자가 action 으로 넣은 page 로 이동하게 되면

사용자가 input 에 입력했던 모든 value 를 URL 에 보여준다.

GET 메서드를 통해 input value 값 확인

 

< search.html > - input 에 아무 값 입력하면 출력되는 HTML

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Job Scrapper</title>
</head>
<body>
    <h1>Search Results:</h1>
</body>
</html>

 

전체적인 흐름은 main.py 에서 Flask 를 import 하고 @app.route 를 사용해서

각 template 을 render 하여 웹 페이지 접속 시 사용자에게 보여준다.

home.html 에는 초기 검색화면을, search.html 에는 값 입력하면 검색 결과 화면을 보여준다.

폴더 및 파일은 아래와 같이 생성

 

 

코드는 아래와 같이 작성

 

< main.py >

from flask import Flask, render_template

app = Flask("JobScrapper")

@app.route("/")
def home():
    return render_template("home.html", name="james", age=20)

@app.route("/search")
def search():
    return render_template("search.html")

app.run("0.0.0.0")

 

< home.html >

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Job Scrapper</title>
</head>
<body>
    <h1>Job Scrapper</h1>
    <h4>What job do you want?</h4>
    <form action="/search">
        <input type="text" name="keyword" placeholder="Write keyword please" />
        <button>Search</button>
    </form>
</body>
</html>

 

< search.html >

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Job Scrapper</title>
</head>
<body>
    <h1>Search Results:</h1>
</body>
</html>

 

 

 

 


python 참고 강의

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