Tech Trail

[Django 주식 검색 웹 만들기 05] 파이썬 Django를 활용한 주식 검색 웹 애플리케이션 만들기: 데이터 수집과 검색 기능 구현 본문

Project/[Django] 주식 검색 웹 만들기 [완]

[Django 주식 검색 웹 만들기 05] 파이썬 Django를 활용한 주식 검색 웹 애플리케이션 만들기: 데이터 수집과 검색 기능 구현

_밍지_ 2024. 4. 4. 19:10
728x90
반응형
SMALL

1. 서버 설정 및 Django 프로젝트 폴더로 이동

 

서버를 실행한 채로 새로운 터미널 창을 열고 Django 프로젝트 폴더로 이동합니다.

터미널에서 다음 명령어를 실행하여 Django 프로젝트 폴더로 이동합니다.

 

cd djangostock

 

 

2. 부트스트랩에서 Navbar 구현하기

 

우리는 주식을 검색할 때 데이터를 보여주는 웹을 만들려고 하는데

현재는 애플 주식 데이터만 표시되므로, 부트스트랩 사이트에서 Components 섹션으로 이동하여 Navbar로 이동합니다. Navbar에 Search 있는 부분을 가져와서 사용하면 됩니다.

 

 

저는 이걸 copy 해주겠습니다.

 

이 내용을 base.html 파일에 해당 위치에 붙여 넣어주세요.

 

  <body>

    <nav class="navbar navbar-light bg-light">
      <form class="form-inline" method="GET" action="{% url 'home' %}">
        {% csrf_token %}
        <input class="form-control mr-sm-2" type="search" placeholder="Search" aria-label="Search" name="ticker">
        <button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button>
      </form>
    </nav>
    {% block content %}
    {% endblock %}

 

 

그리고 기존에 있던 "hello, world" 등의 내용은 지워주시면 됩니다.

 

3. CSRF 공격 방지를 위한 {% csrf_token %} 사용

 

{% csrf_token %}은 Cross-Site Request Forgery (CSRF) 공격을 방지하기 위한 장고의 보안 기능입니다.

CSRF 공격은 사용자가 의도하지 않은 요청을 악의적인 웹사이트에서 실행할 때 발생할 수 있는 공격입니다. 이를 방지하기 위해 장고는 모든 데이터를 전송하는 form에 {% csrf_token %}을 추가하여 요청의 유효성을 검사합니다. 이를 통해 장고는 요청이 실제로 해당 사용자로부터 발생되었는지 확인하고, 악의적인 요청으로부터 애플리케이션을 보호합니다.

 

form 요소에는 GET 방식을 사용하고, action 속성에는 {% url 'home' %}을 써줍니다.

이렇게 하면 검색 버튼을 클릭할 때 앱의 urls.py 파일에서 name이 'home'인 부분을 실행시킵니다.

또한 input 태그의 name 속성을 'ticker'로 설정하여 검색 버튼을 누를 때 해당 데이터를 ticker라는 이름으로 views.py 파일에서 사용할 수 있습니다.

 

정리하면, 검색 버튼을 클릭하면 base.html에서는 {% url 'home' %}가 실행되고, 이는 urls.py 파일에서 name이 'home'으로 지정된 부분을 호출합니다. 그러면 views.py 파일에서 해당하는 뷰 함수가 실행됩니다.

 

이제 views.py에 아래 코드를 작성해 줍니다.

 

ticker = request.GET['ticker']

 

이제 home 함수에 매개변수 request를 사용하여 요청 데이터를 받아왔습니다. 이 요청 데이터에는 여러 가지 정보가 포함되어 있습니다. 그중에서도 GET 방식으로 전달된 데이터 중에 ticker라는 이름을 가진 것을 받아와서 ticker 변수에 저장했습니다. 그러나 이런 상태로는 검색창에 값을 입력하지 않고 URL을 직접 입력한 경우에는 ticker가 존재하지 않아서 서버가 실행되지 않습니다.

 

 

검색 창에 값을 입력한 경우에는 ticker가 존재하여 잘 작동하지만, URL에 직접 검색어를 입력하는 경우에는 ticker 값이 없어서 서버 실행이 안 되는 문제가 발생합니다.

이는 우리가 이런 상황을 처리할 수 있는 설정을 하지 않았기 때문입니다.

따라서 요청을 시도하였으나 ticker 값이 존재하지 않아서 에러가 발생합니다.

이럴 때는 파이썬의 예외 처리를 사용하여 문제를 해결할 수 있습니다.

 

def home(request):

    try:
        ticker = request.GET['ticker']
    except Exception as e:
        ticker = ""

 

위와 같이 처리하면 실행됩니다.

 

 

 

4. URL 요청을 통한 주식 검색 기능 구현

 

stock_api = requests.get("https://cloud.iexapis.com/stable/stock/aapl/quote?token=pk_***********aac64179")

 

사용자가 검색한 주식을 요청할 때, URL 요청을 보내는 부분은 다음과 같이 수정할 수 있습니다.

 

 

stock_api = requests.get("https://cloud.iexapis.com/stable/stock/"+ticker+"/quote?token=pk_***********aac64179")

 

이렇게 바꿔주면 사용자가 입력한 ticker 값에 따라 요청되는 주식 데이터가 변경됩니다.

 

 

5. 예외 처리를 통한 검색어 누락 시 빈 데이터 반환

 

아래 코드 블록은 사용자가 검색한 주식을 요청하고 해당 데이터를 가져오는 부분입니다.

 

try:
    ticker = request.GET['ticker']
    stock_api = requests.get(
        "https://cloud.iexapis.com/stable/stock/" + ticker + "/quote?token=pk_***********aac64179")
    stock = json.loads(stock_api.content)
except Exception as e:
    ticker = ""

 

 

만약 검색을 하지 않고 직접 http://127.0.0.1:8000/로 접근한 경우, 빈 데이터를 반환하면 되겠죠?

 

그렇다면, ticker 값을 활용하지 않고,

 

    except Exception as e:
        stock = ""

 

except 블록에서 stock 변수를 빈 문자열로 설정하여 전송합니다.

 

 

6. 웹 페이지 렌더링 및 검색 기능 동작 확인

 

 

이제 웹 페이지에는 http://127.0.0.1:8000/에 접근할 때 아무런 데이터도 표시되지 않습니다.

 

 

또한, 검색을 통해 데이터를 입력하면 해당 데이터가 출력되는 것을 확인할 수 있습니다.

728x90
반응형
LIST