Python - Django 웹 만들기 (3)

2 분 소요

파이썬 Django 웹 프로그래밍 (3) : 계좌 잔고 확인 페이지

기본적인 순서는 다음과 같다.

    1. balance 어플리케이션 생성
    1. settings.py에 앱 등록
    1. URLconf 설정
    1. views.py에 get_data, main_view 함수(잔고 확인 페이지에서 주식 정보를 조회하는 함수) 추가
    1. html : templates/balance.html 생성
    1. css : static/b_style.css 생성
    1. 접속해보기 : http://127.0.0.1:8000/balance/?035420=20&005930=100 (/balance/?주식 코드=주식 수량&주식 코드=주식 수량)

balance 앱 기본구조

balance
    ㄴ migrations : 데이터베이스 마이그레이션 파일이 저장되는 디렉터리
        ㄴ __init__.py
    ㄴ static : 정적 파일이 저장되는 디렉터리
        ㄴ balance
            ㄴ b_style.css
    ㄴ templates : html 템플릿 파일이 저장되는 디렉터리
        ㄴ balance
            ㄴ balance.html
    ㄴ __init__.py
    ㄴ admin.py   : 관리자 페이지에서 balance 앱을 관리하기 위한 설정 파일
    ㄴ apps.py    : balance 앱의 정보를 저장하는 설정 파일
    ㄴ models.py  : balance 앱에서 사용하는 모델을 정의하는 파일
    ㄴ tests.py   : balance 앱의 테스트를 작성하는 파일
    ㄴ views.py   : balance 앱의 뷰를 정의하는 파일

1. balance 어플리케이션 생성

cd \mySite\Investar

python manage.py startapp balance

2. settings.py에 앱 등록

INSTALLED_APPS = [...,'balance']

3. URLconf 설정

파일 : urls.py

import : balance/views.py를 import
urlpatterns = [..., path('balance/', views.main_view)]
from django.contrib import admin
from hello import views #hello 추가
from django.urls import path, re_path #re_path 추가
from index import views as index_views #index 추가
from balance import views as balance_views #balance 추가

urlpatterns = [
    path('admin/', admin.site.urls),
    re_path(r'^(?P<name>[A-Z][a-z]*)/$', views.sayHello), #규칙 : 대문자로 시작하고 소문자로 끝나는 문자열. # P: parameter <name>: name이라는 이름으로 파라미터를 받겠다.    
    path('index/', index_views.main_view), #index 추가
    path('balance/', balance_views.main_view), #balance 추가
]

views.py 추가

from urllib.request import urlopen
from bs4 import BeautifulSoup
from django.shortcuts import render


def get_data(symbol):
    """
        symbol에 해당하는 주식에 대한 현재 가격, 등락률을 반환한다.
        
        Args:
            symbol(str): 주식의 심볼
        Returns:
            cur_price(str): 주식의 현재가
            cur_rate(str): 주식의 등락률
            stock_name(str): 주식의 이름    
    """
    url = 'http://finance.naver.com/item/sise.nhn?code={}'.format(symbol)
    with urlopen(url) as doc:
        soup = BeautifulSoup(doc, "lxml", from_encoding="euc-kr")#BeautifulSoup : html을 파싱하는 라이브러리
        cur_price = soup.find('strong', id='_nowVal') #_nowVal : 현재가
        cur_rate = soup.find('strong', id='_rate') #_rate : 등락률
        stock = soup.find('title') #title : 주식 이름
        print(stock)
        stock_name = stock.text.split(':')[0].strip()
        print(stock_name)
        return cur_price.text, cur_rate.text.strip(), stock_name
    
def main_view(request):
    """
        사용자가 입력한 주식의 심볼과 수량에 대한 정보를 가져와서
        현재가, 등락률, 주식 이름을 조회한 후 이를 템플릿에 전달한다.
        Args:
            request(HttpRequest): HttpRequest 객체
        Returns:
            render : 템플릿(html : balance.html)에 조회한 주식 정보를 전달한다.            
    """
    #mylist = [['035420', '20'], ['005930','100']]
    querydict = request.GET.copy()
    mylist = querydict.lists()
    rows = []
    total = 0
    for x in mylist:
        cur_price, cur_rate, stock_name = get_data(x[0]) #get_data : 주식의 현재가, 등락률, 주식 이름을 조회
        price = cur_price.replace(',', '')
        stock_count = format(int(x[1][0]), ',')
        sum = int(price) * int(x[1][0])
        stock_sum = format(sum, ',')
        rows.append([stock_name, x[0], cur_price, stock_count, cur_rate, stock_sum])
        total = total + int(price) * int(x[1][0])
    total_amount = format(total, ',')
    values = {'rows' : rows, 'total' : total_amount}
    print(values)
    return render(request, 'balance.html', values)

html 코드

접속해보기

http://127.0.0.1:8000/balance/?035420=20&005930=100

댓글남기기