ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Python Ajax 예제(db 연동)
    Python Django 2022. 10. 23. 15:55

     

    cmd에서 명령어 입력 후, 원래 있던 테이블을 가져와서 models.py에 붙여놓기 한다.

     

     

    models.py

    from django.db import models
    
    # Create your models here.
    class Sangdata(models.Model):
        code = models.IntegerField(primary_key=True)
        sang = models.CharField(max_length=20, blank=True, null=True)
        su = models.IntegerField(blank=True, null=True)
        dan = models.IntegerField(blank=True, null=True)
    
        class Meta:
            managed = False
            db_table = 'sangdata'

     

    urls.py

    from django.contrib import admin
    from django.urls import path
    from myajax import views
    
    urlpatterns = [
        path("admin/", admin.site.urls),
        
        path("", views.MainFunc),
        path("list", views.ListFunc), 
        path("calldb1", views.ListDbFunc),
        path("calldb2", views.ListDbFunc),
    ]

     

     

    views.py

    from django.shortcuts import render
    from myajax.models import Sangdata
    from django.http.response import HttpResponse
    import json
    
    # Create your views here.
    def MainFunc(request):
        return render(request, 'main.html')
    
    
    def ListFunc(request):
        return render(request, 'list.html')
    
    
    def ListDbFunc(request):
        sdata = Sangdata.objects.all()
    
        datas = []
        for s in sdata:
            dic = {'code':s.code, 'sang':s.sang, 'su':s.su, 'dan':s.dan}
            datas.append(dic)
        print(datas)
        return HttpResponse(json.dumps(datas), content_type="application/json")

    처음 list.html 페이지로 이동하면 DB 데이터 값은 호출되지 않는 상황이므로 data를 return할 필요가 없다.

    LIstDbFunc함수에서 DB 데이터 값을 불러와서 반복문을 돌려서 각각의 값들을 datas라는 list 타입에 넣는다.

    그리고 이것을 json.dumps(datas) 함수로 string 타입으로 바꿔서 정보를 가지고 간다.

    HttpResponse를 import해서 return HttpResponse(json.dumps(datas), content_type="application/json")시킨다.

     

     

    main.html

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    메인<p/>
    부서 직원 고객 <a href="/list">상품</a>
    </body>
    </html>

     

    list.html

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    <script type="text/javascript">
    let xhr;
    
    window.onload = function(){
    	
    	// 자바스크립트 객체(XMLHttpRequest)를 사용한 ajax 기본 방식
    	document.querySelector("#btnOk1").onclick = function(){
    		xhr = new XMLHttpRequest();
    		xhr.onreadystatechange = function(){
    			if (xhr.readyState === XMLHttpRequest.DONE){
    				if(xhr.status === 200){
    					process1();
    				}
    			}
    		}
    		url = "calldb1"
    		xhr.open("GET", url, true); 
    		xhr.send();
    	}
    	
    	// fetch 방식
    	document.querySelector("#btnOk2").onclick = function(){
    		const url = "calldb2";
    		
    		fetch(url).then(res => {
    			if(res.status === 200){
    				return res.json()
    			}else{
    				console.error(`HTTP 에러! status:$(res.status)`);
    			}
    		})
    		.then(jsonData => {
    			process2(jsonData);
    		})
    		.catch(err =>{
    			console.error(err);
    		});
    	}
    }
    
    function process1(){
    	let parseData = JSON.parse(xhr.responseText);
    	// alert(parseData);
    	let str = "<table border='1'>"
    	str += "<tr><th>코드</th><th>품명</th><th>수량</th><th>단가</th></tr>";
    	let count = 0;
    	for(let i = 0; i < parseData.length; i++){
    		str += "<tr>";
    		str += "<td>" + parseData[i].code + "</td>";
    		str += "<td>" + parseData[i].sang + "</td>";
    		str += "<td>" + parseData[i].su + "</td>";
    		str += "<td>" + parseData[i].dan + "</td>";
    		str += "</tr>";
    		count++;
    	}
    	str += "</table>";
    	
    	document.querySelector("#showData1").innerHTML = str;
    	
    }
    
    function process2(jsonData){
        let str = "<table border='1'>"
        str += "<tr><th>코드</th><th>품명</th><th>수량</th><th>단가</th></tr>";
        let count = 0;
        
        for(let i = 0; i < jsonData.length; i++){
           str += "<tr>";
           str += "<td>" + jsonData[i].code + "</td>";
           str += "<td>" + jsonData[i].sang + "</td>";
           str += "<td>" + jsonData[i].su + "</td>";
           str += "<td>" + jsonData[i].dan + "</td>";
           str += "</tr>";
           count++;
        }
        str += "</table>";
        
        document.querySelector("#showData2").innerHTML = str;
        
     }
    </script>
    </head>
    <body>
    Ajax 연습 : 원격 DB 자료 보기<p/>
    <button id="btnOk1">상품자료 출력 1</button>
    <br>
    <div id="showData1"></div>
    <hr>
    <button id="btnOk2">상품자료 출력 2</button>
    <br>
    <div id="showData2"></div>
    </body>
    </html>

    XMLHttpRequest 객체를 사용한 기존 방식이 있고, 새로 나온 방식으로 fetch 방식이 있다.

    XMLHttpRequest 객체의 경우 querySelector의 id값과 url 정도만 수정하고 실제로 호출하는 함수를 바꾸는 정도로 사용 가능하다.

     

     

    처음 list.html 페이지

     

    버튼을 클릭하면 DB에 저장된 데이터들을 불러올 수 있다.

     

     

     

    댓글

Designed by Tistory.