Django ajax 처리 하기 - select

2017. 1. 10. 20:43Dev/Django

반응형

JSP에서 ajax를 수도 없이 사용했때문에 쉽게 될줄 알았지만 장고의 모델 처리 부분이 본인이 주로 했던 방식과 상당히 다르기 때문에 애 먹었다.

구글링을 잘 못해서 인지 내가 원하는 답을 쉽사리 만날 수 없었다.


로직 : 사용자가 개체를 클릭하면 개체와 관련된 정보가 ajax 통신하여 json형태의 값을 받아 가공하여 보여준다.

아주아주 기본적인데도 하루종일 매달렸다.


결론에 도달하기까지 존재했던 방지턱들


1.  장고는 csrf token을 이용하여 통신하므로 별도의 처리가 필요

2. DB 질의의 데이터를 json 형태로 변환하여 response 해줘야함


1. csrf token


https://docs.djangoproject.com/en/1.10/ref/csrf/#ajax

장고 문서에서는 쿠키에서 csrf token을 가져오지만 직접 header에 설정할 수 있음

쿠키에서 설정과 직접 설정의 차이에 대해서는 더 알아봐야한다.


javascript


$.ajax({
  url: "{% url 'skill_relation' %}",
  data: "skill_name=" + $(thisObj).text(),
  type: "post",
  dataType: "json",
  headers: {'X-CSRFToken': '{{ csrf_token }}'}, // token 설정
  success: function(data){
    :
  }
});


위와 같은 코드로 통신해서 json 데이터를 뿌려주기만 하면 된다.


2. 질의값 json으로 반환


장고는 쿼리질의 기능을 별도로 제공한다. 장고 고수라면 잘 사용할 수 있겠지만 장고와 친하지 않은 개발자들은 직접 질의하는 방법에 익숙해 있으니 나와 같이 헤맬 것 같다. 참고


views.py


from django.http import HttpResponse
from django.db import connections

import json

   :
   :
  cursor = connections['mysql'].cursor() # 디비를 두개 이상 사용하는 환경일 때는 connections 하나일 경우 connection을 사용한다.
  cursor.execute(sql, sql_params) 
  #ex) cursor.execute("select name from test where name = %s", ["name"] )

return HttpResponse( json.dumps( dictfetchall(cursor)), content_type = "application/json")

# cursor.fetchall()을 사용하여 질의값을 가져올 경우 key:value 형태가 아닌 value list 형태로 넘어오기 때문에 별도로 처리해줌
# key:value 형태로 리턴함
def dictfetchall(cursor):
  columns = [col[0] for col in cursor.description]
  return [
    dict(zip(columns, row))
    for row in cursor.fetchall()
  ]
위의 코드는 cursor를 이용해서 질의한 후 json형태로 변환하는 방식이다. 다른 방식으로 질의를 할 경우에는 다른 방식을 사용해서 json 형태로 변환해주는 것을 고려해야 한다.


결론


csrf token은 헤더에 설정해준다.

장고의 모델 처리 방법이 다양해서 json 형태의 변환을 여러가지로 생각해봐야 한다.

raw() 이용한 직접 질의와 connection(s)객체의 cursor를 이용한 직접 질의 방법, 장고에서 제공하는 ORM 사용하여 질의 하는 방법 등을 고려해야 한다.


학원 보다는 직접 해보고 부딪히는 것이 더 좋다고 생각하지만 삽질 깊어질수록 학원이 그립기도하다...

반응형

'Dev > Django' 카테고리의 다른 글

Django 오늘 날짜  (0) 2017.01.11
Django 디버깅 툴  (0) 2017.01.10
기존 디비를 장고로 Migration 하기  (0) 2017.01.09
django mysql date_format 에러  (0) 2017.01.02
장고 개념 잡기  (0) 2017.01.01