[Django] 검색 기능 구현
Django를 이용하여 검색 기능을 두 가지 방법으로 구현해보았다.
방법은 아래와 같다.
1. http GET 요청을 보내서 queryParameter로 검색한 내용이 URL에 노출되게끔 구현
2. http POST 요청을 보내서 url 상에 검색한 내용이 URL에 노출되지 않게끔 구현
< 1. GET 요청을 이용한 검색 기능 구현 >
## views.py에 만들어 놓은 검색 핸들링 함수
def search(request):
## 검색창에 입력한 텍스트를 search라는 key로 받아온다.
inputText = request.GET['search']
## 입력 텍스트를 포함한 결과들을 qs에 모두 담아준다.
qs = Shopping.objects.filter(name__contains=inputText)
## search.html을 렌더링할때 qs를 함께 보내준다.
return render(request,'search.html', {'item_list': qs})
이런 코드를 사용하면 아래와 같은 결과를 얻을 수 있다.
결과 화면의 url을 살펴보면
http://127.0.0.1:8000/shopping/search/?csrfmiddlewaretoken=A3CrRT3RwmFTC3W7wicMNkoWotEpusVZHrYcMrkZnbl1sLIrcVaNURCuIskolgg8&search=신
이다.
queryParameter로 csrfmiddlewaretoken 값과 search값이 들어있게 된다.
search값만 들어있는 url이면 좋을텐데 csrfmiddlewaretoken 값이 같이 들어가 있게 되어서 보안상에는 문제가 있어 보인다.
그러나 해당 화면을 띄우는 유일한 url이기때문에 새로고침해도 같은 화면이 브라우저에 출력된다.
< 2. POST 요청을 이용한 검색 기능 구현 >
## views.py에 만들어 놓은 검색 핸들링 함수
def search(request):
## 검색창에 입력한 텍스트를 search라는 key로 받아온다.
inputText = request.POST['search'] ## GET을 POST로 바꿈!
## 입력 텍스트를 포함한 결과들을 qs에 모두 담아준다.
qs = Shopping.objects.filter(name__contains=inputText)
## search.html을 렌더링할때 qs를 함께 보내준다.
return render(request,'search.html', {'item_list': qs})
위의 코드를 사용하면 GET 요청했을 때와 같은 결과를 얻을 수 있다.
하지만 url상에서 차이가 발생한다.
결과 화면의 url을 살펴보면
http://127.0.0.1:8000/shopping/search/ 이다.
즉, 어떤 검색어가 입력되어도 해당 url에 POST 요청을 보내서 처리를 하게 되는 것이다.
따라서 csrfmiddlewaretoken과 같은 정보에 url에는 담겨서 가지 않게 되는 장점이 있다.
하지만 새로고침을 하게되면 해당 url로 GET 요청을 보냈을 때 렌더링할 화면을 만들어놓지 않아서 404 ERROR가 뜨게 된다.