알고리즘
직사각형 넓이 구하기
def solution(dots):
    answer = 0
    x_list = [dot[0] for dot in dots]
    y_list = [dot[1] for dot in dots]
    가로 = max(x_list) - min(x_list)
    세로 = max(y_list) - min(y_list)
    answer = 가로 * 세로
    return answer
알고리즘 300제 233
str을 list로 바꿀 때는 list(str)을 쓰는게 좋다. for을 사용하지 않아도 된다.
 
알고리즘 300제 227
def print_mxn(line, num):
    chunk_num = int(len(line) / num)
    for x in range(chunk_num + 1) :
        print(line[x * num: x * num + num])
 
알고리즘 300제 235
replace와 split
내가 많이 사용해 봤던 메소드가 먼저 떠오른다. 생각을 더 해보자.
 
파이썬 모듈 = 파이썬 파일을 의미.
 
GIT
깃 클론 = git clone [URL]
디렉토리 이동 = cd 디렉토리
현재경로 = pwd
디렉토리 내용 출력 = ls
 
클론 하고 클론 폴더로 이동 하고 브랜치 만들고(작업 브랜치와 머지 브랜치를 나눈다.)

 

몫 구하기
def solution(num1, num2):
    answer = 0
    answer = num1 // num2
    return answer
 
배열의 유사도
# 방법1: for문
def solution(s1, s2):
    answer = 0
    for i in s1:
        if i in s2:
            answer += 1
    return answer
# 방법2: set
def solution(s1, s2):
    return set(s1) & set(s2)
# 방법3: 함수
def solution(s1, s2):
    return len(set(s1).intersection(set(s2)))
숫자 찾기
def solution(num, k):
    answer = []
    for i in str(num):
        answer.append(i)
    if str(k) in answer:
        return (answer.index(str(k))+1)
    else:
        return -1
# 방법2: 추후 공개
def solution(num, k):
    if str(k) in str(num):
        return str(num).find(str(k))+1
    else:
        return -1
def solution(num, k):
    answer = str(num).find(str(k))+1
    return -1 if answer == 0 else answer
def solution(num, k):
    return str(num).find(str(k))+1 if str(num).find(str(k)) != -1 else -1
find 함수는 인덱싱 값을 리턴. 없으면 -1 리턴.

str.find(sub[,start[,end]])

 
개인과제 해설
pip 의존성 : pip에 의존성이라는 것이 있어, 필요한 것을 설치하게 된다.
 
작업 순서 : 모델링 , views 필요한 기능 함수와 주석을 적어놓는다. , urls, 포스트맨으로 기능 동작 확인. views 코딩하면서 sirializer 작성.
 
세션과 jwt의 로그아웃 :
콘서트장 입장 시 입장 권한은 티켓으로 확인.
세션 : 주문번호
세션은 서버 DB에서 관리하기 때문에 핸들링이 쉽다.
jwt : 구매자,구매일자, 만료기간, 티켓 서명(데이터의 유효성)
서버는 티켓서명과 만료기간을 확인
 
is_valid() 사용 시 두가지 방법이 있다.
is_valid(raise_exception=True)
에러시 에러만 띄워줄 때.
is_valid() 
에러시 특정 로직 추가 할 시 사용.
 
시리얼라이즈
extra_kwargs 로 각 필드에 속성을 줄 수 있다.
 
write_only 와 exclude 차이.
exclude는 필드를 제외시켜 필드를 사용 할 수 없게 된다.
 
patch 와 put의 차이
put은 모든 필드를 다 보내줘야 하지만, patch는 수정할 필드만 보내도 수정이 가능하다.
 
회원탈퇴 시 데이터를 지우면 안된다.
실예로 회원탈퇴된 아이디 입니다를 출력해준다.
즉 비활성화만 시켜준다는 뜻.
is_active가 있는 이유가 그것이다.
 
실제 서비스에선 회원탈퇴와 휴먼계정을 구분해줘야한다.
 
행은 가로
열은 세로
 
파이썬 300제 195
result = []
data = [
    [ 2000,  3050,  2050,  1980],
    [ 7500,  2050,  2050,  1980],
    [15450, 15050, 15550, 14900]
]
for i in data:
    sub=[]
    for v in i:
        sub.append(v * 1.00014)
    result.append(sub)
print(result)
 
파이썬 300 197
ohlc = [["open", "high", "low", "close"],
        [100, 110, 70, 100],
        [200, 210, 180, 190],
        [300, 310, 300, 310]]
for i in ohlc[1::]:
    if i[3] >= i[0]:
        print(i[3])
#문제를 잘보자. 이상인지 초과인

4월 24일 : 공부하는 방법을 다르게 하면서 조금은 나아졌다. 강의를 들으면서 에버노트에 각 줄을 하나씩 한글로 무슨 뜻인지 적었다. 그리고 파이썬으로 구현을 하는 식으로 공부를 했더니 좀 나아진 것 같다. 하지만 로직 자체를 아직 외우지는 못하고 있다. 그래서 뭔가를 구현할 때 원래 했던 것을 참고하지 않고는 힘들다. 여러 에러들을 만나고 무엇을 잘 못 했는지 적으면서 TIL을 적었다. 그래고 내일 무엇을 해야할지 정리를 해두었다. 잘했던 것 같지만 문제는 복습이었다!

 

4월 25일 : 에러를 만나고 어떻게 해결 했는지 적었지만 이해 할 수 가 없다. 사진도 첨부를 하도록 하자. 그리고 어떤 작업을 했는지 적었다. 개인과제 구현만 해놓음. 만족스럽지 않음.

 

4월 26일 : 알고리즘이 부족해서 개인과제 구현은 해놓고 계속 알고리즘 공부를 함. 몰랐던 메소드, 팁, 용어를 정리해서 놓았지만 뭔가 만족스럽지 않음. 정리를 잘해서 복습을 할 수 있도록 하는게 중요함.

 

4월 27일 : 알고리즘 공부하면서 퓨어 장고도 지금의 공부 방법처럼 다시 공부를 시작. 하지만 제대로 TIL 정리를 하지 않으면 복습을 할 수 없다는 것을 WIL을 쓰면서 깨닫게 됌.

 

4월 28일 : 역시나 같은 문제 발생. 정리를 잘하자. 방법을 찾아야한다.

 

최근에 알고리즘 위주로 공부를 하면서 계속 잊어먹고 있다는 것을 알고 복습이 필요하다는 것을 느꼈다.

기록을 하는 것 자체가 내가 몰랐던 것을 나중에 다시 보기 위해서, 즉 잊어먹지 않기 위해서 하는 행위인데 그 본질을 잊고 있었다. 항상 약했던 부분인 정리를 이번 기회에 고쳐보도록 하자.

 

 

'WIL' 카테고리의 다른 글

WIL 9주차 : 팀 프로젝트와 마음가짐  (0) 2023.05.15
WIL 8주차 : AWS, 알고리즘  (0) 2023.05.07
WIL 6주차 : DRF 시작함.  (0) 2023.04.23
[5주차] WIL : 불안하다...  (0) 2023.04.16
[4주차] WIL : 현실이 느껴진다..  (0) 2023.04.09

퓨어장고 2주차 까지 들었다. 알고리즘 열심히 풀고 있다.

map : 리스트의 요소를 지정된 함수로 처리해주는 함수. 원본 리스트를 변경하지 않고 새로운 리스트를 만든다. list(map(함수,리스트))
주민번호 = "950318-1163417"
a = 주민번호.split("-")
a = "".join(a)[:-1]
a = list(map(int,a))
b = 2,3,4,5,6,7,8,9,2,3,4,5
c = list(zip(a,b))
result = sum([x*y for x,y in c]) % 11
last = 11 - result
주민끝 = 주민번호[-1]
print(last)
if int(주민끝) == last:
    print('유효 주민번호')
else:
    print('유효하지 않는 주민번호')
슬라이싱의 오프셋을 잘 기억하자.
배수 구하기 : 나눴을 때 0 이라면 어떤 수의 배수다.
swapcase(): 대소문자를 바꿔주는 함수
range의 시작 디폴트 값은 0이다. 0에서 커진다.
비어 있는 리스트, 0인 변수 들을 잘 활용하자.
range의 번호를 인덱싱으로 활용 할 수 있다.

퓨어 장고 때 공부 방법이 잘 못되어서 머리에 남은게 없어서 다시 보기 시작. 알고리즘도 조금씩 나아지고 있는 듯 하다. 영어 공부 많이 해서 공식문서 잘 이해하면 좋을 것 같다.

  • 별 표현식 : 패킹과 언패킹을 할 수 있다.
  • 패킹 = 변수와 인자의 수가 달라도 패킹으로 리스트를 만들 수 있다.
  • 언패킹 = 리스트의 요소를 하나씩 꺼내어 준다.
  • 프린트를 잊지 말자.
  • 딕셔너리에 여러 원소를 추가할 때 꼭 하나씩 키 밸류를 다 적어줘야하는 방법 밖에 없나? 딕셔너리를 만들어서 update를 사용하면 된다.
  • 딕셔너리 안에  리스트나, 튜플을 만들 수 있다.
  • 딕셔너리 추가 : update로 할 수 있다.
  • zip :  두 리스트를 묶어준다. 0과 0, 1과 1 .... iterable로 출력이 가능하다.
  • >= : 순서를 기억하자. 자꾸 틀린다.
  • if True : if True는 디폴트다.
  • endswith 사용법 :  변수.endswith(접미사,시작 인덱스,끝인덱스)
fruit = {"봄" : "딸기", "여름" : "토마토", "가을" : "사과"}
a = input()
if a in fruit:
    print('정답')
else:
    print('오답')
#이런 상황에서 분기문에서 fruit의 디폴트 값은 키에서 찾는다.
  • islower() : 소문자인지 대문자인지 불리언으로 리턴 한다.
  • 딕셔너리[이름] : 이렇게 적으면 이름의 vlaue가 호출 된다.
  • 슬라이스의 범위 : 슬라이스는 [:3]이면 3 전까지 출력이 되는 걸 기억하자.
  • 알고리즘을 짤 때 편한 방법이 있는지 한번 더 생각을 하자.
  • 숫자 분기문 : 분기문을 사용할 때 숫자라도 문자인지 숫자인지 잘 파악하자.

알고리즘 풀면서 잘 안되었던 부분은 따로 정리를 하였다. 나는 왠지 개발자가 못 될 것 같다.

자신감이 뚝뚝.. 눈물도 뚝뚝.. 

 

개인과제 어느정도 해놓고 알고리즘 했는데 개인과제 더 보강할 수 있을 것 같아서 건드리고 있다.

완료가 true가 되면 완료 시간이 저장이 되도록 만들고 싶은데 전에는 true로 하면 시간이 저장 되지만 True로 하면 시간 저장이 안되는 에러가 발생했다. 일단 해보자.

  1. sep : print에서 콤마로 구분된 것들을 sep로 어떤 것으로 구분할지 고를 수 있다.
  2. ; : 한줄에 여러 명령어를 작성 할 수 있다.
  3. 바인딩 : 할당 하는 것을 의미.
  4. 매핑 : 메모리상 참조할 주소와 연결 되는 것을 의미.
  5. 슬라이싱 : 특정 부분과 특정 부분을 자를 수 있다.
  6. 문자열 오프셋 : 증가폭을 지정 할 수 있다.
  7. 문자열 수정 : 수정 할 수 없다.
  8. 문자열 포매팅 : %s %d %f 문자열 내 특정 값을 바꿔야 할 경우 사용.
  9. capitalize : 알파벳의 첫 글자를 대문자로 변경.
  10. endswith(접미사[, start [,end]]) : 접미사를 검색 할 수 있다. 튜플러 여러개를 검색 할 수 있다.
  11. startswith : 접두사를 검색. 옵션은 endswith과 같다.
  12. split의 디폴트 값 : 공백.
  13. insert(a,b) : 삽입. a위치에 b를 삽입. 리스트에 사용.
  14. del과 remove의 차이: del은 인덱싱을 이용해 삭제.
  15. 리스트와 리스트 더하기 : 리스트와 리스트를 더하면 새로운 리스트가 생김.
  16. print 하나에 여러개 출력하기: 콤마로 여러개 출력 할 수 있다
  17. count와 len의 차이 : count는 특정 원소를 세고, len은 길이를 센다. 모든 원소를 센다.
  18. 리스트의 평균을 구하는 함수는 따로 없고 직접 알고리즘을 만들어야한다.
  19. '구분자'.join(리스트):  리스트를 무엇으로 연결할지 정 할 수 있다. 문자열이 된다.
  20. split의 결과물 : 리스트로 나타나게 된다.
  21. 괄호 없는 정수는 튜플이다.
  22. range 함수 : 반복문에서만 쓰는게 아냐. 시작,끝,증가폭 을 정할 수 있다.
  23. 참조 : 외래키를 가지고 있고 그 외래키에 접근 한다면 참조.
  24. 역참조 : 외래키를 상대가 가지고 있고 그것에  접근 한다면 역참조.

AssertionError 발생

조건의 반대되는 상황이 계속 됌.
로그인 아이디와 새 글을 작성했을 때 user 가 같음.
delete 요청에 아이디를 안넣어줌... 쯧..
포스트맨 헤더에 토큰을 잘 넣어줬는지 확인하자.
 
오늘 할 일!
  • 내일부터 할 것은 완료시간을 현재 시간으로 넣을 수 있도록 바꿔줘야한다.
  • 지금의 생각은 is_complete가 true가 되었을때 같이 바꿔줘야하는데 어떻게 해야할지 모르겠다.
  • 그리고 updated_at도 수정을 하지 않는 이상 안나오도록 할 수 있을까?
  • 그리고 삭제를 구현하자.
  • 그리고 모델의 필드를 추가해야하고,
  • 추가기능은 하지말고 부족한 공부를 어여 끝내도록 하자.
투두리스트 완료하면 현재시간 추가는 구현이 되었다.
class UpdateTodo(APIView):
    def put(self,request,todo_id):
        todo = get_object_or_404(Todo, id=todo_id)
        serializer = UpdateTodoSerializer(todo, data=request.data)
        if serializer.is_valid():
            if request.data['is_complete'] == 'true':
                todo.completion_at = datetime.today()
                serializer.save()
                return Response(serializer.data, status=status.HTTP_201_CREATED)
            else:
                serializer.save()
                return Response(serializer.data, status=status.HTTP_201_CREATED)
 
User모델도 만들어서 회원가입과 업데이트에 적용을 시켰다. 후~
추가는 일단 패스하자.

'장고 심화' 카테고리의 다른 글

장고 심화: 3주차  (0) 2023.04.21
장고 심화: 2주차 6강~ 끝까지.  (0) 2023.04.20
장고 심화: 2주차 5강까지.  (0) 2023.04.20
장고 심화: 1주차  (0) 2023.04.18
normalize_email은 이메일의 도메인을 소문자로 바꿔주는 역할을 한다.
validated_data : 유효성 검증된 데이터만 받는다.
 
비번 수정하고 암호화 하고 저장하기
update 를 사용하는 방법을 알게 되었다.
def update(self, instance, validated_data):
        instance.password = validated_data.get('password', instance.password)
        password = instance.password
        instance.set_password(password)
        instance.save()
        return instance
 
삭제를 구현하고 있는데 자꾸 찾을 수 없다는 에러가 발생!
user = get_object_or_404(User, user_id) 라고적었다...
id = user_id라고 적어야하는데.. 으이그..
삭제도 구현 했다!
 
django.db.utils.IntegrityError: NOT NULL constraint failed:
blank=True, null=True 해줬는데도 에러남.
마이그레잇, 마이그레이션 안해서 에러남..
 
TypeError: UpdateTodo.put() got an unexpected keyword argument 'todo'
에러남.
url에서 게시글의 아이디를 지정할 때 todo라고 하고 view에서는 todo_id로 함..
 
django.core.exceptions.ImproperlyConfigured: Field name `title, is_complete` is not valid for model `Todo`.
에러남.. 필드를 `title, is_complete`이렇게 적음.
("title", "is_complete",) 로 고쳐줌.
 
내일부터 할 것은 완료시간을 현재 시간으로 넣을 수 있도록 바꿔줘야한다.
지금의 생각은 is_complete가 true가 되었을때 같이 바꿔줘야하는데 어떻게 해야할지 모르겠다.
그리고 updated_at도 수정을 하지 않는 이상 안나오도록 할 수 있을까?
그리고 삭제를 구현하자.
그리고 모델의 필드를 추가해야하고,
추가는 하지말고 부족한 공부를 어여 끝내도록 하자.

 

4월 17일 : 점프 투 장고 보면서 정리를 했다. 큰 도움이 되었지만 공부 하는 방법을 현재 처럼 했다면 좀 더 효율적으로 할 수 있지 않았을까 싶다.

4월 18일 : 장고 심화 공부시작. 이때는 1주차 공부를 했다. 이론 뿐이어서 지루하고 어려웠다. 따로 공부를 해줘야하는 부분이라 어떤 것들이 있다를 확인하고 다음 으로 넘어갔다.

4월 19일 : 장고 2주차 정리 했다. RDF를 다루게 되었는데 현재 강의에서 무엇을 구현하려고 하는지, 로직의 순서를 확인하고 그것을 적어놓고 코딩으로 혼자 구현을 해보는 식으로 공부를 했다. 훨씬 머리에 잘 들어왔지만 시간은 조금 오래걸렸다. 하지만 이렇게 공부를 하는게 더 처음 보다 옳은 방법이라 생각한다.

4월 20일 : 2주차 6강부터 끝까지 정리를 했다. 이제는 TIL을 적을 때 더 가독성 있게 "구현 할 것", "로직",  "스스로 해보기" 잘 정리해서 적어야 겠다.

4월 21일 : 3주차 했다. 강의를 보는 것도 좋지만 스스로 해보며 모르는 것은 공식문서 번역해 가며 공부를 하는 것이 훨씬 도움이 될 것이라고 생각이 든다.

 

사실 강의를 들으면서 로직을 적어놓고 그 로직을 보면서 강의의 내용을 떠올리며 공부를 했을 때는 "내가 구현을 할 수 있구나" 라고 생각이 들었다. 하지만 만약 지금 스스로 어떠한 서비스를 구현하라고 하면 과연 할 수 있을까 하는 생각이 든다. 이때 부터가 공식문서읽으면서 하는 진짜 공부라고 생각한다. 단어 하나씩 찾아가며 단어 외우며 공부를 하자. 어차피나오는 단어 또 나올거니까. 가보자.

 

세션 과 토큰
이 부분은 따로 공부를 하자.
 
쿠키와 로컬 스토리지의 차이
쿠키
쿠키는 만료가 있다.
매번 데이터를 보내줘야 할 때 유리.
용량 4096바이트
쿠키를 임의로 지정해서 보내줄 때는 복잡하다.
 
로컬 스토리지
로컬 스토리지는 만료가 없다.
용량 5메가바이트
임의로 지정할 때 간단하다.
 
토큰 방식 DRF에 적용하기
회원가입 기능 이용!
JWT 방식을 사용.
drf에 적용할 방식은 simple JWT 방식.
프로젝트 세팅
폴더 만들기 drf_project :  good
가상환경 : python -m venv venv
가상환경 실행 : venv/Scripts/activate
장고 설치, DRF 설치,  simple JWT : pip install django djangorestframework djangorestframework-simplejwt
freeze : pip freeze > requirements.txt
장고 프로젝트 만들기 drf_project :  django-admin startproject drf_project .
gitignore : .gitignore windows macos django python visualstudiocode
원격저장소 만들기 : good
깃 인잇 : git init
깃 리모트 추가 :git remote add origin ....
깃 애드 : git add .
깃 커밋 : git commit -m 'init project'
깃 푸시 : git push origin master
인스톨 앱에 DRF, simple JWT 추가 : 'rest_freamework', 'rest_framework_simplejwt',
레스트 프레임 워크에 siple JWT 추가 : REST_FRAMEWORK 에다 추가. 공식문서 참고
앱 만들기 users : python manage.py startapp drf_project
인스톨 앱 users : 'users',
url에 추가 users : path('users/', include('users.urls')
url 만들고 수정 : 이거는 복붙.
마이그레이션:python manage.py makemigrations
마이그래잇: python manage.py migrate
포스트맨 워크스페이스 만들기 drf_project : good
콜렉션 users : good
리퀘스트 login 포스트 방식으로 요청 : good
슈퍼유저 만들기 : python manage.py createsuperuser
슈퍼유저로 리퀘스트 보내기 : good
refresh랑 access가 뭔지 알아보자!
공식 jwt에 접속: good
access encode에 복붙 : good
invalid signatues, SECRET_KEY :
access 토큰은 로그인 하기 위한 토큰.
refresh는 access를 다시 만들어 주기 위한 토큰.
setting에서 기한을 정할 수 있다.
 
커스텀유저 먼저 작성
예시 모델 복붙, my 없애고 사용. : good
커스텀 유저모델을 사용하겠다고 설정 : AUTH_USER_MODEL = "user.User"
*db삭제. 처음부터 유저 모델을 잘 설정하는게 중요*
마이그레이션 : python manage.py makemigrations
마이그레잇 : python manage.py migrate
생년월일 제거 : good
*db, initial 삭제 후 다시 마이그레이션, 마이 그레잇*
테스트
admin에 유저모델 추가: from .models import User, admin.site.regester(User)
슈퍼유저 생성 : python manage.py createsuperuser
유저 만들고 비밀번호 확인 : 암호화가 안됌.
커스텀 유저 모델 관리자에 등록 하기
admin에 복붙 하기 : good
쓸 수 있도록 수정 : good
관리자 페이지에서 유저 생성 : good
암호화 : good
회원가입과 로그인 해보기
회원가입 api 만들기 signup UserView user_view : path('signup/', views.UserView.as_view, name = 'user_view'
시리얼라이저 클래스 작성 UserSerializer :
class UserSerializer(serializers.ModelSerializer):
메타 클래스, 모델, 필드 : class Meta: model = User fields = "__all__"
views 클래스형으로 회원가입 함수 작성 : class UserView(APIView):
포스트 방식으로 self,request : def post(self, request):
들어온 데이터 시리얼라이즈 : serializer = UserSerializer(data=request.data)
유효성 검사 : if serializer.is_valid():
저장 : serializer.save()
메세지 보내주기 가입 완료 , 201: return Response({"message":"회원가입완료"}, status=status.HTTP_201_CREATED)
에러메세지 보내주기 400 : elif : return Response({"message":"회원가입실패"}, status=stauts.HTTP_400_BAD_REQUEST)
포스트맨 signup 리퀘스트 만들기 : http://127.0.0.1:8000/users/signup/
!에러가 났다.!
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticated',
 
],
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_simplejwt.authentication.JWTAuthentication',
)
}
 
PERMISSION에 AUTHENTICATION의 내용을 넣었다. 위는 정상.
signup 테스트 : good
login 테스트 : 실패.
password 암호화하기
함수 만들고 create  자동완성 :  def create .....
유저 변수는 어떤건지 만들고 : user = super()... return user
유저의 비번 변수에 담기 :  password = user.password
비번 암호화 하기. : user.set_password(password)
저장하기 : user.save()
로그인 테스트 하기 : good
수정하기
암호화랑 똑같다.
토큰의 PAYLOAD를 커스터마이징 해보자!
simple JWT에 설명이 있다.
views에 클래스를 만든다. CustomTokenObtainPairView: class CustomTokenObtainPairView
상속을 해준다. :  TokenObtainPairView
시리얼라이저 복붙 : good
이메일로 변경 : good
urls 수정 : views.CustomTokenObtainPairView
 
simple jmt의 설정을 변경해보자
복붙해오기 :
액세스 토큰 5분으로 늘리기 : "ACCESS_TOKEN_LIFETIME" : timedelta(minute=5),
로그인 했을 때만 가능한 기능 테스트!
views에 클래스 만들기 mockView : class mockView(APIView)
퍼미션 클래시스 만들기  로그인 되었을 때만 : permissionclasses = [permissions.IsAuthenticated]
get 요청 함수 만들고, 요청자 출력, get요청 리턴 : def get(self, request): print(request.user) return Respone('get 요청')
url 만들기 mock/ mockView, mock_view :  path('mock/', views.mockView.as_view, name='mock_view')
포스트맨으로 mock에 요청 하기 헤더 수정하기 Authorization Bearer: 헤더에 키는 Authorization 밸류에는 Bearer랑 access token
액세스 토큰 720분으로 늘리기 : 'ACCESS_TOKEN_LIFETIME':timedelta(minute=720)
관리자 권한 주고 , 저장하고 db 확인하기 : user = request.user user.is_admin = True, user.save
 
리플래시 토큰 이용해서 액세스 토큰 재발급
포스트맨으로 리플래시 url로 포스트 요청 보내기 : api/token/refresh/
필드 양식에 맞춰 요청보내기 : good
액세스 토큰으로 로그인 하기 : good
Beare에서 beare로 적어서 계속 에러 났다.. 오타조심.
환경 만들어 주기 : good
api url 변경하기 : good
 
로그인 인증 과정을 프론트엔드로 해보기!
drf_project_front 폴더 만들기 :
index.html 만들기
제목 회원가입 페이지 : <H1>회원가입 페이지<H1>
폼 안에 만들기
input 이메일, 비밀번호 : <input type="email" name=""email" id="email" placeholder="email">
비번도 똑같음.
버튼 제출 : <button type="button">제출</button>
자바스크립트 만들기
api.js 만들기 :
html에서 api.js 불러오기 : <script src="api.js"></script>
로딩이 되었다면 함수를 실행해라. 함수 내용은 콘솔로그를 보여주는.:window.onload = () => {console.log('로딩 되었음.')}
백엔드로 이메일과 비번 보내주기
함수를 만들고 handleSignin :function handleSignin()
html에서 이메일을 가져온다.:{email = document.getElementByid("email")}.value
비밀번호를 가져온다 : {password= document.getElementByid("password")}.value
!에러!
password에 큰따옴표를 안붙여서 에러가 남.
제출 버튼을 눌렀을 때만 가져온다. : onclick="handleSignin()"
fetch를 사용한다. : async function handleSignin...
const response = await fetch(주소)
headers :{'content-type':'application/json',}, method:'POST'
body : {"email":email, "password":password}
cors에러 해결 : pip install django-cors-headers 인스톨앱에 추가하고 미들웨어에 추가하고 맨밑에 컴피큐레이션 추가하고.
!에러가났다.! 설치를 다른 가상환경에 한것 같다. pip list에 없었다.
다음엔 조심하자. 그리고 pip list를 확인하자.
404에러 해결 직렬화 : JSON.stringify
!에러가 남!
404에러가 추가를 해줬는데도 계속남.. 똑같은 아이디가 있어서 그랬음..
로그인하기!
로그인 html 만들기 : good
함수만들기, 버튼이 눌러지는 중인지 확인 : async function handleLogin() {console.log('눌러지는 중인가)'}
회원가입 복붙해서 수정하기 : good
제이슨으로 콘솔로그 찍어보기 : const response_json = await response.json()
로컬스토리지에 토큰 저장하기 :
localStorage.setItem("refresh", response_json.refresh);
localStorage.setItem("access", response_json.access);
payroad 로컬에 저장하기 :  복붙
siginup  으로 index 옮기기 : good
index 만들기 : good
index.js 만들기 : good
사용자 이름 띄우기
로딩 완료 후 띄우기 : window.onload = () => {}
로컬에서 아이템 가져오기 : const payload = localStorage.getItem("payload")
오브젝트로 바꾸기 parse : const payload_parse = JSON.parse(payload)
div 가져오기 : const intro = document.getElementByid(intro)
텍스트 가져오기 : intro.innerText = payload.email
포스트맨에서 했던 헤더에 토큰 실어서 보냈던거 html에서 해보기
버튼 만들기  : button type="button" onclick="handleMock()"
복붙해서 수정하기 : headers :{"Authorization":"Bearer" + localStorage.getItem("access"}, method:'GET'
!에러!
후... Authorization에서 Authorizaion이라고 적었다.. 계속 cors 어쩌구 오류나면서 찾아는데 오타였다.. 후...
로그아웃
버튼 만들기  : button handleLogout()
토큰 지우기 : function handleLogout() {
localStorage.removeItem("access")
localStorage.removeItem("refresh")
localStorage.removeItem("payload")
}
!에러!
err_content_length_mismatch
이메일을 보여주는데 꾸 언디파인이 나와서 찾아봤다.
내가 서버에서 보내줄 떄  email을 emial로 적었다... 에휴...
 

+ Recent posts