➜ 비밀번호 해싱 후 유저를 저장해야하는데( user.save() ) 비밀번호 변수를( password.save() ) 저장하려고 함
➜ 그런데도 db에 저장이 돼서 같은 email로 회원가입은 불가능함 단 패스워드는 해싱 후 저장하지 않았으므로 입력한 그대로 저장됨
➜ 저장이 되는 이유는 보내는 순간 super().create(validated_data)에서 db에 저장하기 때문
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields ='__all__'
def create(self, validated_data):
print(validated_data)
user = super().create(validated_data)
print(user)
password = user.password
user.set_password(password)
user.save() #정답
# password.save() #오류1
# return user #오류2
➜ create 함수에 return값을 주지 않음
➜ 유저를 리턴하지 않더라도 save()에서 db에 (해싱된 패스워드까지)저장했기 때문에 같은 email로 가입을 시도하면 회원가입은 실패하게 됨
https://django-environ.readthedocs.io/en/latest/quickstart.html
import environ
import os
env = environ.Env(
# set casting, default value
DEBUG=(bool, True)
)
# Set the project base directory
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# Take environment variables from .env file
environ.Env.read_env(os.path.join(BASE_DIR, '.env'))
DEBUG = env('DEBUG')
SECRET_KEY = env('SECRET_KEY')
DATABASES = {
'default': env.db(),
'extra': env.db_url(
'SQLITE_URL',
default='sqlite:////tmp/my-tmp-sqlite.db'
)
}
DEBUG=True
SECRET_KEY='django-insecure-6)4as^*^uu=^4n!^hlg=jblm0w22fblm4@$k*k!7gvw&y-8_c4'
DATABASE_URL="sqlite://../db.sqlite3"
# DATABASES={'default':{'ENGINE':'django.db.backends.sqlite3','NAME':BASE_DIR /'db.sqlite3'}}
➜ 처음엔 그냥 시크릿키나 디버그처럼 세팅파일에 있는 걸 그대로 긁어오면 되는 줄 알았는데
➜ 이런 오류가 계속 났다. 그래서
# DATABASES = {
# 'default': dj_database_url.config(
# default=env('DATABASE_URL')
# )
# }
# DATABASE_URL="sqlite://../db.sqlite3"
➜ 이걸 시도해봤는데 DATABASES부분이 invalid line이라고 나오면서 작동이 됐다. 유효하지 않은 부분이라서 지워줌
근데 사실 공식문서에 보면 .env파일에 환경변수를 DATABASES가 아니라 DATABASE_URL이 예시로 나와있긴 한데 구글링한거랑 막 섞어서 생각하다보니까 혼선이 생긴 게 아닌가 싶다.. 구글링을 어느만큼 하는 게 좋은 걸까흠
SQLite URL contains host component '..', it will be ignored 라고 뜨는 부분이 있는데 이 부분이
https://pypi.org/project/dj-database-url/
➜ 여기에 나오는 것처럼 sqlite:///Path
라면 ..을 지워버려도 될 것 같아서 지우고 완성! 참고로 sqlite경로(Path)는 그냥 sqlite3였다(db.sqlite3 우클릭해서 copy Path)
배포할 때는 env파일을 이렇게 두가지 만들어서 테스트하기도 하는구나.. 하면서 이만..
https://mugon-devlog.tistory.com/41
def solution(a, b):
return sum([x*y for x, y in zip(a,b)])
➜ zip : 2개 이상의 iterable 객체를 인자로 받고 데이터를 튜플 형식으로 짝지어줌
길이가 달라도 가능하지만 짧은 iterable객체를 기준으로 짝지어지고 남는 건 버려짐
dict() 함수에 zip을 이용해서 key, value를 짝지어 묶은 튜플을 넣으면 쉽게 딕셔너리를 생성하는 것도 가능
version: '3.8' # docker-compose.yml에 사용될 문법 버전을 정의합니다.
# 버전이 다르면 아래 작성해야하는 형식도 달라짐
services: # 어떤 컨테이너를 만들지 정의하는 구간
example: # 서비스 이름을 지정합니다. 서비스 이름은 컨테이너끼리 통신할 때 사용됩니다.
container_name: example # 컨테이너 이름을 지정합니다.
image: 'httpd:latest' # 컨테이너를 생성할 때 사용될 이미지를 지정합니다.
restart: always # 컨테이너가 종료됐을 때(도커 재시작시) 다시 실행시켜 줍니다. 항상 실행하도록~
ports:
- 80:80
컨테이너가 종료될 때 변경된 데이터가 모두 초기화됨
특정 경로의 데이터들이 컨테이너 내부가 아닌 host에 저장이 됨
version: '3.8' # docker-compose.yml에 사용될 문법 버전을 정의합니다.
services:
example:
container_name: example
image: 'httpd:latest'
ports:
- 80:80
volumes:
- ./example_http_code/:/usr/local/apache2/htdocs/
restart: always
➜ ./ : 현재 경로 = docker-compose파일 경로
➜ host 경로 : 컨테이너 경로(볼륨이 될 경로 = index.html있던 경로와 동일)
docker 엔진이 관리하는 경로에 데이터가 저장됨
version: '3.8'
volumes: # 볼륨 정의(생성) {설정사항}
example_http_code: {}
services:
example:
container_name: example
image: 'httpd:latest'
ports:
- 80:80
volumes:
- example_http_code:/usr/local/apache2/htdocs/
# 위에서 정의한 볼륨 : 컨테이너 내부 디렉토리
restart: always