반응형

장고, Ajax 시간 출력 GET, POST 예제

 

글. 수알치 오상문

 

장고 프로젝트앱이 이미 존재한다고 가정합니다. 프로젝트앱에서 ajax_test 앱을 만듭니다.

 

py manage.py startapp ajax_test

 

다음처럼 각 파일을 설정하고(없는 파일은 생성 후 작성) 코드를 작성합니다.

 

[프로젝트앱/settings.py]

INSTALLED_APPS = [

# ...

'ajax_test',]

 

 

[프로젝트앱/urls.py]

from django.contrib import adminfrom django.urls import path, include

urlpatterns = [

  path('admin/', admin.site.urls),

  # ...

  path('ajax_test/', include('ajax_test.urls')),

]

 

 

[ajax_test/urls.py]

from django.urls import path

from .views import *

 

app_name = 'ajax_test'

 

urlpatterns = [

  path('', ajax_test1, name='ajax_test1'),                    # 테스트 시작 URL

  path('time/', ajax_now_time, name='ajax_now_time'), # 시간 출력 응답 URL

]

 

 

[ajax_test/views.py]

from django.http import HttpResponse

from django.shortcuts import render

from django.views.decorators.csrf import csrf_exempt

import time

 

def ajax_test1(request):

  return render(request, 'ajax_test/time.html')

 

# ajax 처리시 csrf token 처리는 뷰에서 해버림

@csrf_exempt

def ajax_now_time(request):

  if request.method == "GET":  # GET 응답

    t = time.localtime()

    now = "%04d/%02d/%02d %02d:%02d:%02d" %(t.tm_year, t.tm_mon, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec)

    return HttpResponse(now)

  elif request.method == "POST":  # POST 응답

    time_format = request.POST.get('format') # 요청한 format에 맞게 처리

    t = time.localtime()

    if time_format == "Time"# 요청 time_format이 'Time'이면 시간만 응답 

      now = "%02d:%02d:%02d" % (t.tm_hour, t.tm_min, t.tm_sec)

    else:

      now = "%04d/%02d/%02d %02d:%02d:%02d" %(t.tm_year, t.tm_mon, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec)

else:

  now = "None"

return HttpResponse(now)

 

 

[ajax_test/templates/ajax_test/time.html]

<!DOCTYPE html>

<html lang="ko">

<head>

<meta charset="UTF-8">

<meta http-equiv="X-UA-Compatible" content="IE=edge">

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>ajax time</title>

</head>

<body>

  <p>time : <span id="time"></span></p>

  <input type="button" id="GET_btn" value="Get 요청" /><br>

  <select id="format">

    <option value="DayTime" selected></option>

    <option value="Time"></option>

  </select>

  <input type="button" id="POST_btn" value="POST 요청" />

 

<script>

/* GET 요청 처리 */

document.querySelector('#GET_btn').addEventListener('click', function(event) {

  var xhr = new XMLHttpRequest();

  xhr.responseType = 'text';

  xhr.open('GET', '/ajax_test/time');

  xhr.onreadystatechange = function(){

    if(xhr.readyState === 4 && xhr.status === 200) {

      document.querySelector('#time').innerHTML = xhr.responseText;

    }

  }

  xhr.send();

});

 

/* POST 요청 처리  */

/* Ajax에서 폼 형식을 직접 전송한다. (장고 csrf 토큰 처리는 view에서 처리) */

document.querySelector('#POST_btn').addEventListener('click', function(event) {

  var xhr = new XMLHttpRequest();

  xhr.responseType = 'text';

  xhr.open('POST', '/ajax_test/time/');

  xhr.onreadystatechange = function(){

    document.querySelector('#time').innerHTML = xhr.responseText;

  }

  var data = "";

  data += 'format=' + document.getElementById('format').value; /* data += '&' */

  xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

  xhr.send(data);

});

</script>

</body>

</html>

 

 

[화면] 웹 초기 화면 (주소: 127.0.0.1/ajax_test/)

 

[화면] GET 요청 화면 (GET 버튼 클릭 후)

 

[화면] POST 요청 화면 (옵션에 따라 POST 응답이 달라짐)

 

<이상>

반응형

+ Recent posts