The message
argument can be
What we define as an "error" can be either a simple string
or an instance of ValidationError with its message attribute set
,
and what we define as list or dictionary can be an actual list
or dict
or an instance of ValidationError with its error_list
or error_dict
attribute set.
########################################################
#1번#####validate_field이름
class UserCreateSerializer(serializers.Serializer):
username=serializers.CharField()
password=serializers.CharField()
password2=serializers.CharField()
#시리얼라이져 안에서 이렇게 유효성검사가 가능하다
def validate_username(self,username:str):
# validate_{field name}
if len(username)>10:
raise ValidationError("아이디는 10자이내여야합니다.")
return username
#########################################################
#2번#######ㄸ#3번이상 반복되었을 때 재사용성을 고려해서 아래처럼 변경
def below_ten_character(value:str):
if len(value) >10:
raise ValidationError("10자 이내여야 합니다.")
class UserCreateSerializer(serializers.Serializer):
username=serializers.CharField(validators=[below_ten_character])
password=serializers.CharField()
password2=serializers.CharField()
#########################################################
#3번#######################여러개의 필드를 가져와 값을 검증하기
class UserCreateSerializer(serializers.Serializer):
username = serializers.CharField() # ID
password = serializers.CharField() # 비밀번호
password2 = serializers.CharField() # 비밀번호 확인
def validate(self, attrs):
password = attrs['password']
password2 = attrs['password2']
if password != password2:
raise ValidationError("비밀번호를 확인해 주세요")
return username
############################################################
#4번######################views.py
def user_create(request):
serializer = UserCreateSerializer(data=request.data)
if serializer.is_valid():
user = serializer.create()
return Response({"message": "User Create Successfully"}, status=status.HTTP_200_OK)
else:
return Response(serializer.errors, status = status.HTTP_400_BAD_REQUEST)
#### serializer.errors에 담겨있는 값은
#### ValidationError가 여러 필드를 확인하는 validate 함수에서 발생했다면(특정필드에 대해서가 아니라면) ↓
#### {"non_field_error" : "This is Error Message"}
#### 필드관련된 에러라면 ↓
#### {'username' : "10 words"}
#####################################################################
#5번#################raise_exception=True: validation에 실패했을 때 자동으로 400에러 반환
def user_create(request):
serializer = UserCreateSerializer(data=request.data)
if serializer.is_valid(raise_exception=True):
user = serializer.create()
return Response({"message": "User Create Successfully"}, status=status.HTTP_200_OK)
#####################################################################
#6번##########validators.py에서 정의한 밸리데이터를 모델 필드에서 사용하기
#validators.py
from django.core.exceptions import ValidationError
def space_validator(value):
if len(value.split()):
raise ValidationError("이름에 공백이 있습니다. 공백 제거 후 다시 저장해주세요")
#models.py
#model에 선언했다고 해서 이 validator가 데이터 베이스 수준에서 이 값의 유효성을 검증하는 것은 아니다.
class Person(models.Model):
name = models.CharField("이름",max_length=100, validator=[space_validator,])
#admin페이지에서는 작동하는데 모델에서 모델.objects.create(name='공백있는 이름')해도 오류가 나지 않음
#데이터베이스 레벨에서 이러한 값의 유효성을 제한하고 싶을 떄 CheckOutConstraint
#해당 규칙을 어겼을 경우 IntegrityError
class ModelName(models.Model):
class Meta:
constraints =[
CheckOutConstraint(
check=Q()
)
]
jwt ( JSON Web Token )
Uhwa_Frontend/static/js/createpage.js
let hide_option = false
window.onload = async function ViewCreate() {
$("#headers").load("../templates/navigation.html");
//페이로드 가져오기
const payload = localStorage.getItem("payload")
const parsed_payload = JSON.parse(payload)
//페이로드 없으면=로그인 안된 비회원인 경우!!
//이거 페이로드가 아니라 header? 이런걸로 해도 되나? 어차피 로그인 안되어있으면 없ㅇ..지않나??
if(!parsed_payload){
alert("권한이 없습니다. 로그인 해주세요")
location.replace("../templates/main.html")
}
var check = $("input[type='checkbox']");
check.click(function(){
$("p").toggle();
if(hide_option == false) {
hide_option=true
} else {
hide_option=false
}
});
}
payload = localStorage.getItem("payload")
parsed_payload = JSON.parse(payload)
const loginoutUl = document.getElementById("loginout")
adminCheck = false
//로그인이 되어있으면
//버튼 글씨가 logout, 클릭시 실행되는 로그아웃함수
if(parsed_payload){
loginoutUl.innerText="logout"
loginoutUl.setAttribute("onclick", "handleLogout()")
adminCheck = parsed_payload["is_admin"]
}
//로그인이 안되어있으면
//버튼 글씨가 login, 클릭시 실행되는 로그인함수
else{
loginoutUl.innerText="login"
loginoutUl.setAttribute("href", "login.html")
}
//로그아웃 함수
//로그아웃은 백이 아니라 프론트에서 처리해줌
function handleLogout(){
if (confirm("정말 로그아웃 하시겠습니까?") == true){
localStorage.removeItem("access")
localStorage.removeItem("refresh")
localStorage.removeItem("payload")
console.log("로그아웃 되었습니다.");
}else{
// false는 취소버튼을 눌렀을 때, 취소됨
location.replace("../templates/main.html")
}
}
//관리자인지 체크
//관리자면 1일텐데 그게 True랑 같은 값이고
//아니면 0인데 그게 False랑 같은 값이라고 치는건가??
//무튼 그런 로직으로 admin탭을 안보여줌!
if(adminCheck == false){
const adminpage = document.getElementById("adminbutton")
adminpage.style.display="none"
}