장고 - Ajax 기초 학습
1. Ajax 정의
Ajax(Asynchronous JavaScript and XML)
- JavaScript를 사용한 비동기 통신, 클라이언트와 서버 간에 XML 데이터를 주고받는 기술
- JavaScript 라이브러리
- 빠르게 동작하는 동적인 웹 페이지를 만들기 위한 개발 기법
장점
- 웹 페이지 전체를 다시 로딩하지 않고도, 웹 페이지의 일부분만을 갱신(웹 페이지 속도 향상)
- 웹 페이지가 로드된 후에 서버로 데이터 요청
- 웹 페이지가 로드된 후에 서버로부터 데이터 전송
- 백그라운드 영역에서 서버로 데이터 전송
- 기존 웹에서는 불가능했던 다양한 UI 가능
단점
- 클라이언트가 서버에 데이터를 요청하는 클라이언트 풀링 방식 사용
–> 서버 푸시 방식의 서비스 제작 불가 - binary 데이터를 보내거나 받을 수 없다.
- Ajax 스크립트가 포함된 서버가 아닌 다른 서버로 Ajax 요청을 보낼 수 없다.
- 클라이언트 PC로 Ajax 요청을 보낼 수 없다.
2. Ajax project 생성
Ajax 사용법에 대해 예제를 통해서 간단히 알아보자.
1. 디렉토리 생성 (디렉토리명: ajax_project)
1
$ mkdir ajax_project
2. 해당 디렉토리에서 가상환경 생성
- 가상환경에서 python을 원하는 버젼으로 설정하여 생성한다. (여기서는 python3.6으로 설정)
1
$ virtualenv --python=python3.6 venv
3. django 설치
- pip install을 사용하여 django를 설치한다. (여기서는 버젼 2.1로 설치)
1
$ pip install django==2.1
4. 프로젝트 생성 (프로젝트명: config)
- 현재 디렉토리에 config 프로젝트 생성
1
$ django-admin startproject config .
5. 프로젝트 뷰 생성 및 간략 작성
데이터를 입력받는 뷰와 데이터를 받아주는 뷰를 작성한다.
경로: config > views.py
1
2
3
4
5
6
7
8
9from django.shortcuts import render
# 데이터를 입력받는 뷰, 사용자의 입력을 받는 뷰
def index(request):
pass
# 데이터를 받아주는 뷰, 처리후 응답을 하는 뷰
def get_data(request):
pass
6. 뷰를 연결할 url 생성
경로: config > urls.py
1
2
3
from django.contrib import admin
from django.urls import path
from .views import index, get_data
7. 프로젝트 하위 폴더에 데이터를 요청하는 템플릿 엔진 생성
해당 HTML에서 데이터를 요청한다.
경로: config > layout(생성) > index.html(생성)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
<html lang="en">
<head>
<meta charset="UTF-8">
<title>AJAX 연습</title>
</head>
<body>
test
<a href="#">링크 버튼</a>
<form action="" method="post">
{% csrf_token %}
Username : <input type="text" name="username"><br>
Email : <input type="text" name="email"><br>
Content : <textarea name="content"></textarea><br>
<input type="submit" id="send_form" value="Send">
</form>
<script src="http://code.jquery.com/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
csrf_token = "{{csrf_token}}"
/*
HTML : 레이아웃, 컨텐츠
CSS : 꾸미기
JavaScript : 동작
1. 언제 : 페이지가 로드가 끝났을 떄? 사용자가 어떤 액션을 취했을 때냐?
event - 마우스 클릭 or 키보드 입력 or 스크롤
2. 무엇을 : 어떤 요소를? 브라우저 객체를?
3. 어떻게 : 삭제? 추가? 변경? 숨기기? 보이기?
*/
$(function() {
// 페이지 로드가 끝났을 때 추가하는 부분(대부분 이 안에 추가된다.)
$('a').click(function() {
alert('a 태그를 클릭하셨습니다.');
});
$('a').mouseover(function() {
console.log('마우스 오버');
});
$('#send_form').submit(function(e) {
// 원래의 동작 금지(ex. 링크 클릭하면 주소 이동 금지)
e.preventDefault();
data = $(this).serialize
// $(this) : 해당 이벤트 발생된 주체
// serialize : 데이트 전송 편하도록 직렬화
// ajax로 데이터 전송
$.ajax({
url: "{% url 'get_data' %}", // ajax로 데이터 교환할 페이지 주소
method: "POST",
data: data
}).done(function() {
alert(data.message);
});
return false;
});
});
/*
데이터를 전송하는 페이지(HTML), 데이터를 전송받는 페이지(django view)
HTML - 회원가입, 좋아요 데이터 전송
-> 장고측 뷰가 데이터를 받아 모델 처리, 로직 처리
-> 모델처리가 완료되면 메시지, 혹은 처리 결과 데이터를 다시 HTML로 전송
-> HTML은 응답받은 데이터를 가지고 화면에 정보 출력
$.ajax({
url: "클라이언트가 요청 보낼 서버의 URL 주소",
method:"POST", // HTTP 요청 방식(GET, POST)
type: "json", // 서버에서 보내줄 데이터의 타입(default값으로 json으로 되어있다.)
data: {name: "홍길동"} // HTTP 요청과 함께 서버로 보낼 데이터
}).done(function(data) { // HTTP 요청 성공 시, 요청한 데이터가 done() 메소드로 전달
}).fail(function(xhr, data) { // HTTP 요청 실패 시, 오류와 상태에 관한 정보가 fail() 메소드로 전달
}).always(function(xhr, data) { // HTTP 요청의 성공여부와는 상관없이 언제나 always()메소드 실행
});
*/
</script>
</body>
</html>
8. 프로젝트 뷰 상세 작성
프로젝트(config)의 뷰에서 데이터를 전송 받는다.
경로: config > views.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24from django.shortcuts import render
from django.http import JsonResponse
# 데이터를 입력받는 뷰, 사용자의 입력을 받는 뷰
def index(request):
return render(request, 'index.html')
# 데이터를 받아주는 뷰, 처리후 응답을 하는 뷰
def get_data(request):
print(request.POST)
"""
class A:
type = 'b'
weight = 180
a = A()
a를 Json으로 보내려면, JsonResponse를 이용해 텍스트형식으로 변환
a -> {'type':'b', 'weight':180}
"""
# 처리부
username = request.POST.get('username')
email = request.POST.get('email')
content = request.POST.get('content')
return JsonResponse({'message':"email sent to"+email}
Posted