[SSAC X 코딩온] (2021.09.09) Django 프로젝트 질문 정리_02

RyuSW·2021년 10월 7일
0
post-thumbnail

📡 세션으로 했는 데 DB가 안넘어가요 ㅠㅠ


  • 마이페이지를 진입햇을때는 이미 세션이 넘겨진것으로 판단된다. 따라서 로그인 되잇냐 안되잇냐 판단하는 것이 세션이 잇냐 없냐 체크하는 것이 좋다고 판단된다.

  • form 데이터를 넘길 상황은 아닐 것으로 판단된다. 오브젝트 필터를 걸 때 100번 양보해서 마이페이지 함수로 솔직히 폼데이터가 넘어오게 된다면 저렇게 필터문을 건다면 똥개훈련을 시키는 것이다. 테이블의 아이디에 고윳값을 걸어놓았을 것이다. 아이디가 홍길동으로 걸어놧으면 없으면 없지 한명밖에 없을텐데 굳이 검색할 필요가 없을 것이다!

  • DB에 검색을 때릴 때 조건을 걸려면 필요한 조건만을 걸어야한다.

  • infoUser = FlowerUser.objects.filter(userid=req.session.get(id)) 로 수정해주면 훨씬 효율적인 코드가 된다.

  • 세션을 최소화해서 아이디만 갖고 있는 것이 좋고 똑같은 정보를 검색하는 한이 있더라도 코드 상에서 디비를 한번 더 검색한다.

  • DB를 노가다해야 햇으나 요샌 노가다도 안뛰어도 된다.

  • filter쓰면 query문이 되서 for문을 돌려야해서 get을 쓰면 for문을 안써도 된다.

  • 유효성을 검사해야된다고 하면 if문을 필요로 한다.

  • 세션을 기반으로한 objects.get은 검증된 유효값일 것이다!

  • 세션은 등록할 때 최대한 빡쎄게 검사하고 횟수는 최소화 해야한다.



🎧 SPA (Single Page Application)


  • 현대 홈페이지에서 가장 각광받는 방식 SPA

  • 페이지 변환 없이 하나의 페이지에서 다 쇼부받는 방법. Reload없이

  • 변경되는 부분만 바꿀 수 있게 하는 것이 좋다.



  • Javascript 등 외부 라이브러리에 대한 의존도가 높아졌기 때문에 필요성이 높아짐!

  • ex) Bootstrap, JQuery, CKEditor 등의 라이브러리

  • 내가 작성한 코드가 10이고 내가 불러온 코드가 0.5 정도 되었음. 근데 지금은 외부 코드가 100으로 높아짐.




🍆 Ajax

  • Django와 별도로 쓸 수 있는 스크립트, JQuery에 포함되어 있는 메소드다.

  • JQuery 불러올 때 slim 버전은 ajax가 포함되어 있지 않기 때문에 slim 을 빼야한다!

  • 폼전송을 백그라운드에서 한다!!

  • 전체 페이지 변환 없이 부분적으로 Reload, 현대 홈페이지는 무조건 양방향

  • 클라이언트가 서버한테 정보를 보내야함

  • 양방향 모두 왓다갓다 하면 SPA를 구현 못할 수 있다. 그걸 해결해줄 수 있는 게 Ajax!


  1. Form 요소들을 만든다. (Form 안에 속해있지 않아도 된다!!)

    <input type="text" id="userid">
    <input type="text" id="username">

  1. ajax를 통해서 액션값과 파라미터를 지정하고 서버로 보낸다!!
function a() {
	$.post("naver.com/a.html", { id: $("#userid").val() })
}
  1. 내가 소리소문 없이 보낸 데이터를 바탕으로 서버가 무언가를 처리한 후 반응한다!! 그러면 그 반응을 "콜백함수로" 받아 하고 싶은 처리를 한다!
  • 콜백 함수 : 특정 동작이 수행된 '이후'에 실행되는 함수
  1. 승민님 홍콩에 가서 제니쿠키 하나만 사오세요.
    → 명령수행 + 콜백함수는 2번 함수이다! 1번 수행되는 즉시 바로 2번으로 fired된다!

  2. 승민님 그거를 제 사무실 책상 위에 두세요.
    → 웹브라우저가 기다리고 잇는데 인터넷 특성상 안기다려줌 자바스크립트는 기다리지 않고 바로 실행함.

1번이 안되면 2번이 실행이 안됨. 따라서 자바스크립트는 순차적 특성상 바로 에러가 뜸. 따라서 콜백함수를 써서 2번으로 바로 fired시킨다.



📓 오늘 질문 내용


  • form을 줬고 버튼에 타입을 지정하지 않으면 submit으로 연결됫는데 저거 15번 누르는 순간 form안에 있기 때문에 버튼을 누르면 발동이 되서 ajax도 발동이 되서 form도 submit이 되니깐 새로고침이 되는 것으로 파악된다. 따라서, button 안에 submit말고 button을 준다.

  • 한 페이지에 회원가입과 로그인 기능을 넣은 뒤 회원가입버튼을 누르면 디비에 저장이 되고 login.html값이 div1에 전송되고 // 로그인버튼을 누르면 디비에서 아이디를 검색한다음에 존재하면 donelogin.html를 div2에 반환하고싶은데. TypeError: User() got an unexpected keyword argument 'userid' 이런 에러가 뜨는건 어느 부분이 잘못 된걸까요?



  • messages 기능에 대한 것

    • 홈페이지한테 특정 데이터 말고 특정 문구를 넘기고 싶은 경우가 대다수다. 물론, 어떤 인자를 넘길 때 데이터베이스에 있는 쿼리셋을 넘기는 경우도 있다.

    • 뷰와 템플릿에서 공통으로 사용할 수 있는 기능을 생각했는데 그게 바로 message기능이다.

    • message 기능 중에 level은 심각도 기준이고 숫자가 높을수로 심각하다.

 if message == '성공':
 	<span class = "text-success">성공</span>
 else:
 	<span class = "text-danger">실패</span>
  • settings.py 안에서 static_url = '/static/' 를 통해 app별로 수집을 해서 static 폴더 안에 있는 파일들을 수집해준다.



  • 로그인 창으로 가기 전의 페이지를 로그인 한후 다시 이동하는 방법은 어떻게 해야 하나요?

    • A화면 - 로그인 버튼 - 로그인 화면

    • 로그인 하기 전의 A화면으로 돌아가려면?

    • 일반적으로 세션은 안되요! 세션은 고윳값이기 때문!

        1. 페이지 이동할 때마다 현재 페이지 세션에 삽입

          • views.py에 로그인 함수를 만든다.
        1. 현업에서는 GET방식으로 이전 페이지를 날린다.



  • Django에서 File 업로드를 하는 방법:

    • 정보를 보내는 것이기 때문에 form을 통해서 한다!!
<input type="file" id ="input_file"></input>

<input type="text" id ="input_text"></input>

<script>
	document.getElementById("input_file").value = "하하하";
	document.getElementById("input_text").value = "하하하";
</script>
  • 순서가 중요하다! 순서가 바뀌어서 input_text가 위로 올라가면 입력할 때 에러가 생김.

  • Uncaught DOMException: Failed to set the 'value' property on 'HTMLInputElement': This input element accepts a filename, which may only be programmatically set to the empty string.

<input type="file" id ="input_file"></input>

<input type="text" id ="input_text"></input>

<button type="button" onclick="check_file();">첨부파일확인</button>

<script>
	function check_file() {
    	alert(document.getElementById("input_file").value);
    }
    
    document.getElementById("input_text").value = "하하하";
    document.getElementById("input_file").value = "C:\fakepath\ssac질문.txt";
    
    form.submit();
</script>
  • 파일을 보내는 것도 Form을 만들어준다.

  • forms.py 에 작성할 코드

from django import forms

class UploadFileForm(forms.Form):
    title = forms.CharField(max_length=50)
    file = forms.FileField()
from django.http import HttpResponseRedirect # http를 response시킨다!
from django.shortcuts import render
from .forms import UploadFileForm # .forms = 

# Imaginary function to handle an uploaded file.
from somewhere import handle_uploaded_file

def upload_file(req): # 
    if req.method == 'POST': # POST값이 없을 땐 form이라는 변수를 만듦
        form = UploadFileForm(req.POST, req.FILES)
        if form.is_valid():
            handle_uploaded_file(req.FILES['file'])
            return HttpResponseRedirect('/success/url/')
    else:
        form = UploadFileForm()
        return render(req, 'upload.html', {'form': form}) # upload파일에 form을 보냄


profile
배운 것은 항상 그 때 문서화하자!

0개의 댓글