특정 필드의 값이 존재하는지 확인 이메일이 존재하는지를 확인하는 코드 수정안 1에서 flat=True를 해줘야 queryset에 객체가 아닌 리스트가 들어가서 판별을 할 수 있다. flat을 하지 않으면 queryset안에 객체가 있어서 중복된 이메일이 있든 없든 False가 남 수정안 2가 대체로 깔끔하다 #기존 코드 email_list = [] for user in user_group: email_list.append(user.email) if new_email in email_list: return JsonResponse({"message":"ALREADY_EXISTED_EMAIL"},status=409) #수정안1 email_list = User.objects.value_list('email',f..
API서버란? 앱/웹 서비스를 만드는 개발자들이 자주 이용하는 데이터 위주로만 응답을 하는 서버 즉 페이지 랜더링을 위한 HTML파일이 아니라 오로지 데이터만을 요구하는 경우, 그 데이터를 처리해서 응답해주는 서버를 의미함 주로 json형태의 응답형식을 사용하지만 필요에 따라 excel이나 html응답등이 필요함 시간이 지나도 호환성을 유지해야 한다는 부담감이 있을 수 있음 유저층이 사용하는 앱의 버전이 다양함 > API서버도 버전에 따라 모두 응답이 가능하도록 버전의 개념이 필요 참고)웹 서비스를 이용하는 유저는 항상 최신버전을 사용함. 응답으로써 html파일을 매번 받기 때문 REST(RESTful API) REST(Representational State Transfer) : 상태(state)를 나..
django 인스타그램 api 시리즈 json통신을 상정한 인스타그램의 백엔드적 기능을 구현 게시물과 관련된 기능 구현 게시물 등록 및 확인 게시물 태그(M:M관계) 댓글(1:M관계) Like(M:M관계) 1. 게시물 등록 및 조회 게시물을 등록하고, (특정 게시물이 아닌)게시물 전체를 조회함 태그가 달릴 수 잇음 modeling 하나의 포스팅에 여러개의 image가 존재할 수 있음 따라서 포스팅과 image의 관계를 1:M으로 묶음 또한 image는 image파일 그 자체를 저장하는 게 아니라 image 파일이 저장된 경로를 저장하는 것임 태그는 게시물과 M:M의 관계임. Many to Many관계의 경우 through속성을 사용해 중간 테이블(여기선 Posting_Tag)를 설정해줄 수 있음 또한 p..
django 인스타그램 api 시리즈 json통신을 상정한 인스타그램의 백엔드적 기능을 구현 follow기능 구현 자신을 참조하는 many to many field가 사용됨 Modeling 기존에 만들었던(바로 그전 포스팅에서) 만들었던 User모델에 Follow를 위한 manytomanyfield 추가 유저들은 서로서로에게 follow할 수 있으며, 한 유저가 다른 유저를 follow한다고 해서, follow된 유저가 follow한 유저를 following하게 되지는 않는다. 따라서 user모델인 자기자신을 참조하며, 관계가 비대칭적이므로 대칭성(symetrical)=Flase 설정 또한 M to M 필드는 원래 자동적으로 MtoM관계를 설명하기 위한 중간table이 자동 생성된다. 그러나 throu..
django 인스타그램 api 시리즈 json통신을 상정한 인스타그램의 백엔드적 기능을 구현 SignUp, SignIn Jwt 토큰 확인을 위한 decorator 1. User : signup 유저 모델링 유저와 관련된, signup 기능을 구현 Coreapp : TimeStampModel 실제로 기능을 구현하기에 앞서서 프로젝트 전반에서 자주 사용될 부분을 따로 모아두기 위한 coreapp을 만듬 생성시각 및 업데이트 시각을 기록하기 위한 TimeStampModel을 생성(이 모델을 다른 앱에서 상속받아 사용) meta속성에 abstract = True를 줌으로써 해당 모델이 상속받을 수 있게 함 #core:models.py from django.db import models class TimeStam..
Model & DB Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails (`vanilla`.`#sql-1c10_73`, CONSTRAINT `document_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `_user` (`id`)) FK로 사용되는 필드가 바뀌거나 추가된 경우 새로 추가된 필드에 값을 채워줘야 함(안 그러면 참조 무결성을 위반) table자체를 삭제하고 새로 만드는 것을 추천 모델필드를 migrate까지해서 테이블을 만듬 >> db에서 테이블을 삭제하고, 장고에서도 makemigrations를 삭제하고 나서 다시 migrate를 해도 db에서 테이블이 생성되지 않..
인프런 이진석 강사님의 장고 강의를 참고 Usercreationform modelform 유저모델과 연동되어, 유저이름을 필드명으로 가져옴 그외에 추가적으로 패스워드 등의 추가필드 등을 설정하여 가지고 있으며, 추가필드들에 대하여 다양한 로직을 가지고 있다. 두 번의 패스워드를 입력받아, 두 패스워드가 서로 일치하는지 확인 입력받은 패스워드에 암호화를 적용하여 DB에 저장. 즉 usercreationform을 사용하여 회원가입을 하면 비밀번호는 자동으로 암호화가 된다. (참고로 set_password 로직을 사용해 암호화를 진행하며, 일반적으로 DB에 저장되는 패스워드는 반드시 암호화가 되어야만 한다) 회원가입 View 구현 model과 form만 설정해주면 알아서 모델 instance를 생성하고 저장해..
인프런의 이진석 강사님의 강의를 참고 로그인처리를 위한 LoginView 장고는 로그인 기능을 위한 LoginView를 제공함. 아래는 사용예시 #urls.py from django.contrib. auth.views import LoginView from django.urls import path urlpatterns =[ path('login/',LoginView.as_view(template_name='accounts/login_form.html'),name='login'), ] Loginview는 기본적으로 장고에서 제공하는 Authentication Form을 사용한다 링크 : https://github.com/django/django/blob/main/django/contrib/auth/vie..
인증 유저를 식별하고, 해당 유저에 적합한 정보를 제공하기 위해서 해당 유저를 인증하는 과정은 반드시 필요하다. 인증을 위한 도구로써 패스워드와 같은 개인정보들이 사용되며, 이러한 개인정보를 보호하기 위한 수단이 필요 HTTPS : 통신시 주고받는 개인정보에 SSL을 적용하여 개인정보를 보호. 통신측면의 보안요소 암호화 : 비밀번호와 같은 중요한 개인정보가 탈취되어도 정보가 유출되지 않도록 암호화하여 저장하는 것. 특히 드러나지 않은 개인정보(이메일 말고 비밀번호 같은 것들)은 법규상 암호화를 통해 저장하도록 요구됨 암호화의 방법 단방향 해쉬함수를 사용 본래 해쉬함수는 자료구조에서의 빠른 탐색, 데이터의 위변조 체크 등을 위하여 사용됨 그러나 해쉬함수 중 단방향 해쉬함수는 '만들어진 값에서 원본값을 절대..
인프런 이진석 강사님의 장고강의를 참고 장고의 form에 관한 기능을 처리할 수 있는 CBV인 Generic editing views들에 대하여 다룸 Generic editing views 장고의 form기능을 다룰 수 있는 CBV들 FormView, CreateView, UpdateView, DeleteView가 있으며(심지어 CRUD중에서도 많은 기능을 차지), 만약 FBV형태로 동일한 기능을 구현할 경우 Form을 사용하게 된다.(그래서 View임에도 Form과 관련된 주제에서 다룸) Generic editing views의 부모클래스들 Generic editing view들도 앞서 다루었던 CBV들처럼 이런저런 부모 클래스들을 상속받아 완성된다 Form Mixin get요청시 빈Form을 만들어서..
인프런 이진석 강사님의 장고강의를 참고 Form의 유효성검사가 실행되는 시점 form의 객체가 만들어지면서 요청으로 들어온 데이터가 해당 form에 들어간 후 form.is_valid()에서 유효성검사가 실행. 모든 필드에 대한 유효성 검사가 통과되면 True를 반환 유효성검사 내부 로직(Form이 자동으로 실행해주는 것임) form.is_valid() 실행 : 유효성 검사 실행 form.is_valid()가 내부적으로 form.full_claen()호출. 호출된 full_clean()은 모든 필드에 대하여 필드객체.clean()를 호출해서 각 필드의 type에 대한 (장고 내부적으로 설정된 기본)유효성 검사를 실행함 ex)emailfield > 이메일 형식인지 검사함(@가 있는지 등등)\ 해당 필드에 ..
인프런 이진석 강사님의 장고 강의를 참고 CSRF Cross Site Request Forgery 사이트간 위조 공격으로 특정 웹브라우저가 유저의 웹브라우저를 신용하는 상태를 노린 것임 Form의 특성상 get요청을 받을 때 빈 Form을 보내주고 해당 빈 Form을 받은 사용자가 정보를 채워서 Post메서드로 다시 요청을 보내는 경우가 많은데, get요청과 post요청을보낸 유저가 일치하는지를 확인할 필요가 있음(CSRF 공격, 즉 위조해서 다른 사용자가 요청을 보낸 것일 수도 있음 ㅇㅇ) CSRF Token 장고는 공격을 받는 서버 입장에서 공격을 막기 위해 Token을 통한 체크를 함 Post요청에 한해, setting에서도 확인할 수 있는 CsrfViewMiddleware를 통한 Token체크를 ..
인프런의 이진석 강사님의 장고강의를 참고 ModelForm 장고 Form을 상속받음 지정된 Model로부터 필드정보를 읽어들여, Form Fields를 세팅할 수 있다. 내부적으로 Model instance 생성하여 저장(create)하거나 업데이트(update)함 유효성 검증에 통과한 값들로, 지정된(연결되어 있는) Model instance로의 저장(save)이 가능. 저장된 객체가 이미 존재한다면(pk가 이미 있다면) update되고, 그렇지 않으면 create됨 일반 Form과 Model Form의 차이 일반 Form은 만들 field를 일일이 설정하고(title,content..), 그 field들의 속성도 설정해줘야 함(Charfield같은 것) 모델 Form은 어떤 모델과 연결할지, 그리고 ..
인프런 이진석 강사님의 장고 강의를 참고 1. HttpRequest HttpRequest 객체 현재 요청에 대해, 클라이언트로부터의 모든 요청 내용을 담고 있음. 즉 요청 메세지 전체를 parsing해서 가지고 있다고 보면 됨 FBV와 CBV둘 모두 당연히 접근가능하며, 접근 방식은 다르다 FBV : 매 요청 시마다 뷰 함수의 첫번째 인자 request로 전달됨 CBV : 매 요청 시마다 self.request를 통해 접근 Form 처리 관련 속성들 . request.method : 요청의 종류에 대한 정보. "GET","POST","PUT" 등으로 모두 대문자형태임 request.GET : GET 인자 목록 (QueryDict타입) . request.POST : POST 인자 목록 (QueryDict타..
인프런 이진석 강사님의 장고 강의를 참고 django Form의 SERIALIZER와의 유사점 결국 현업에서는 웹 api생성을 위해 drf를 만드는데, 그때 serializer를 사용하게 된다. 그 serializer와 지금 포스팅의 주제인 Form의 전체적인 메커니즘이 굉장히 유사하다! 따라서 장고 form을 잘 이해한다면 drf도 쉽게 배울 수 있다! 1. HTML Form 그냥 진짜 일반적인 HTML Form 클라이언트에서 사용자에게 입력폼을 제공하고, 이를 서버로 전송하고자 할 때 사용함 HTML Form 필수 속성 action : 요청을 보낼 주소. 빈값("")으로 두면 현재 페이지 url로 요청을 보낸다 method : 전송 방식으로 Get(데이터 조회)과 Post(생성,수정,삭제)에 주로 사..