Posts
Q&A
์ธ๊ธฐ๊ธ ์ค๊ณ์ ๋ํ์ฌ ์ง๋ฌธ๋๋ฆฝ๋๋ค.
๋ต๋ณ ๊ฐ์ฌํฉ๋๋ค~! ์บ์๊ฐ์ ์ง์ง ๊ธฐ๋์ค์ ๋๋ค ใ ใ
- 0
- 2
- 65
Q&A
cas ์ฐ์ฐ3 incrementAndGet ์ง๋ฌธ
์๋ฌธ์๋ต ํด๋ด ๋๋ค.์ข ์ฐพ์๋ณด๋ CAS์ฐ์ฐ์ ๊ฒฐ๊ตญ CPU๊ฐ ์ ๊ณตํ๋ ์์์ ์ธ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ถ๊ณผํ๋ค์ ์๋ฅผ ๋ค์ด x86์ํคํ ์ฒ์์๋ [๋น๊ต โ ๋น๊ตํด์ ๊ตํ์ด ์ฐธ์ผ ๊ฒฝ์ฐ ๊ฐ์ ๊ตํํด์ฃผ๋]๋์์ ์์์ ์ผ๋ก ์ํํ๋ CMPXCHG ๋ผ๋ ๋ช ๋ น์ด๊ฐ ์กด์ฌํ๊ณ ์ด๊ฑธ ์ฌ์ฉํ ๋ฟ์ธ๊ฑฐ๋ค์.๊ฒฐ๊ณผ์ ์ผ๋ก CAS ๊ธฐ๋ฐ์ ๋์์ฑ์ ์ด๋, CPU๊ฐ ์ ๊ณตํ๋ ์์์ ์ฐ์ฐ์ด ๊ฐ๋ฅํ ๋ช ๋ น์ด๋ค์ ์ต๋ํ ํ์ฉํด์ ๋๊ด์ ๋ฝ ํํ๋ก ๋ง๋๋ ๊ฒ์ด๊ตฐ์..
- 1
- 1
- 187
Q&A
๋ ๋์ค์ ๋ํด์ ์ง๋ฌธ๋๋ฆฝ๋๋ค.
ํ์ธ์ด ๋ง์ด ๋ฆ์๋ค์. ์๊ฐํด๋ณด์ง ๋ชปํ ๋ถ๋ถ์ธ๋ฐ ์ข์ ๋ต๋ณ ๋๋ฌด ๊ฐ์ฌํฉ๋๋ค~ ๋ ๋์ค์ ๋์ ์ ๋๊ฐ๋ด๋ ๋น์ฐํ ๊ฒฝ์ฐ๋ ์๊ฒ ์ง๋ง ๋ฐ๋๋ก ์ด๊ฒ์ ๊ฒ ํ ์คํธํด๋ณด๊ณ ๊ณ ๋ฏผํ ๋์ ๋์ ์ ํด์ผํ๋ ๊ฒฝ์ฐ๋ ์ถฉ๋ถํ ์๊ฒ ๊ตฐ์. ์์ผ๋ก๋ ์ข์ ๊ฐ์ ๋ง์ด ๊ธฐ๋ํ๊ฒ ์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค~
- 1
- 3
- 217
Q&A
์๋๋ฆฌ์ค๊ฐ ์ฌ๋ฌ๊ฐ๋ฉด ์์ฒญ์ด ๋ถ๋ฆฌ๋๋ ๊ฒ ์๋๊ฐ์?
๋ต๋ณ ๊ฐ์ฌํฉ๋๋ค~
- 1
- 4
- 212
Q&A
ํ๋ก์ ํธ ์ฝ๋๋ ์ ๊ณตํด์ฃผ์์ง ์๋๊ฑด๊ฐ์?
์ฐพ์์ต๋๋ค~
- 0
- 2
- 332
Q&A
is_valid()๊ณผ์ ์์ validated_data์ ๋ฐ์ดํฐ๊ฐ ์ ์ค๋ฉ๋๋ค
์ฐพ์๋ค์.. nested_serializer์ ์๋ id field๊ฐ read_only๋ก ์ค์ ๋์ด ์์ด์ , ์ ํจ์ฑ๊ฒ์ฌ ๊ณผ์ ์์ ํด๋น ํ๋๊ฐ ์ ๊ฑฐ๋ผ์ validated_data์์ ์ญ์ ๋๋ ๋ด ๋๋ค. ๋น์ฐํ๊ฑด๋ฐ ์ ์๊ฐ์ ๋ชปํ๋ ์ถ๋ค์ ใ ใ ๋ค์๊ณผ ๊ฐ์ด OrderedProductSerializer๋ฅผ ์์ ํด์ฃผ์์ต๋๋ค #serializers.py class OrderedProductSerializer(serializers.ModelSerializer): product_id = serializers.IntegerField(read_only=False) product_name = serializers.CharField(source='product.product_name',read_only=True) class Meta: model = OrderedProduct fields = [ "product_id","count","product_name" ] ์ง๋ฌธ์ ์ง์ธ๊น๋ง๊น ๊ณ ๋ฏผํ๋ค๊ฐ, ์ ์๋๊ป์ ๋ด์ฃผ์ ๋ถ๋ถ๋ ์๊ณ ํน์๋ ๋ค๋ฅธ๋ถ๋ค์ด ๋ณด์ค ์ ์์ง ์์๊น ์ถ์ด์ ์ญ์ ํ์ง ์๊ณ ์ง๋ฌธ์ ๊ทธ๋๋ก ๋จ๊ฒจ๋๊ฒ ์ต๋๋ค. ์ฐธ๊ณ ํ ์ฌ์ดํธ) https://stackoverflow.com/questions/28247839/django-rest-framework-deserializing-and-get-the-primary-key-from-validated-data ๊ณต์ ๊นํ issue) https://github.com/encode/django-rest-framework/issues/2320
- 0
- 2
- 740
Q&A
๋ฉ์ผ๋ฐ์ก์ด ๋์ง ์์ต๋๋ค ใ ใ // form.save()์ ๋ํ์ฌ ์ง๋ฌธ์ ๋๋ค.
๋ ๋น ๋ฅธ ๋ต์ฅ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค... ์ง์ฌ์ผ๋ก ๊ฐ์ฌ๋๋ฆฝ๋๋ค! form๋ถ๋ถ์ ๋ง์ํด์ฃผ์ ๋ถ๋ถ์ ๋ณด๊ณ ์ ์ดํดํ์ต๋๋ค! ๋ค๋ง ๋ฉ์ผ์ ๊ฒฝ์ฐ ์คํธ๋ฉ์ผํจ์ ์ฒดํฌํด๋ณด๊ณ , ๋ค๋ฅธ ๋ฉ์ผ์ ๋์์ผ๋ก ๋ฉ์ผ์ ๋ณด๋ด๋ณด์๋๋ฐ๋ ๋ต์ฅ์ด ์ค์ง๋ฅผ ์๋๋ผ๊ตฌ์ใ ใ env.batํ์ผ์ ๋ค์๊ณผ ๊ฐ์ด ๋ง๋ค์ด ๋์๊ณ (๋ค์๋ ์ข ๊ฐ๋ ธ์ต๋๋ค.) set SENDGRID_API_KEY=SG.SxTpT-0QTo20ExE9S8ffGw.pm4-3L4VFg... runserver๋ฅผ ๋๋ฆฌ๊ธฐ์ ์ ๋จผ์ env.bat๋ฅผ ์คํ์์ผ์ ๋๋ ธ์ต๋๋ค common.py์์ ๋ถ์ฌํ ์ค์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค ์ฒซ์ค์ด ์ ์๋๊ป์ ๋ง์ํด์ฃผ์ ๋ถ๋ถ๊ณผ ๊ณต์ ํํ์ด์ง์ ์ฝ๋๊ฐ ๋ฌ๋ผ์, ๋๋ค ํด๋ณด์๋๋ฐ ๋๋ค ์ค์ง ์์์ต๋๋ค ใ # SENDGRID_API_KEY = os.getenv('SENDGRID_API_KEY') #๊ณต์ํํ์ด์ง SENDGRID_API_KEY = os.environ.get('SENDGRID_API_KEY') EMAIL_HOST = 'smtp.sendgrid.net' EMAIL_HOST_USER = 'apikey' # this is exactly the value 'apikey' EMAIL_HOST_PASSWORD = SENDGRID_API_KEY EMAIL_PORT = 587 EMAIL_USE_TLS = True WELCOME_EMAIL_SENDER = "colock12@naver.com" ๋ง์ง๋ง์ผ๋ก models.py๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค ๊ทธ์ ๊ฐ์ข์์ ์ ๊ฐ ๊ณต๋ถํ๋ค๊ณ ์ถ๊ฐ๋ก phone_number๋ผ๋ ํ๋๋ฅผ ์ถ๊ฐํ๊ธดํ๋๋ฐ, ์ํฅ์ ๋ผ์น ๊ฒ ๊ฐ์ง๋ ์์์... ํด๋ต์ ์ ๋ชจ๋ฅด๊ฒ ๋ค์ ใ ใ ๋ญ๊ฐ ๋คํธ์ํฌ์ ๋ฌธ์ ์ธ ๊ฑด์ง class User(AbstractUser): website_url = models.URLField(blank=True, max_length=200) bio = models.TextField(blank=True) phone_number = models.CharField(blank=True,max_length=17) #default = True๋ก ํด๋๋ฉด, superusercreater๋ฅผ ํ ๋ , ๊ฐ์ด ์๋์ ์ผ๋ก ์ฑ์์ง. ์์ผ๋ฉด ์๋ฌ๊ฐ ๋๋๋ผ def send_welcome_email(self): #render_to_sting ๋๋ฒ์จฐ ์ธ์์ ๊ฐ๋ค์ ๋๊ฒจ์ค ๊ฐ์ ๋ฐ์ํ, ์ฒซ๋ฒ์จฐ ์ธ์์ ๊ฒฝ๋ก์ ์๋ ํ์ผ์ ๋ด์ฉ์ str๋ก ๋ฐํ Subject = render_to_string('accounts/welcome_email_subject.txt',{ 'user' : self, }) content = render_to_string('accounts/welcome_email_content.txt',{ 'user' : self, }) sender_email = settings.WELCOME_EMAIL_SENDER send_mail(Subject, content, sender_email, [self.email], fail_silently=False) ๋ ์ข์ ๊ฐ์์ ๋ต๋ณ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
- 0
- 3
- 465
Q&A
User๋ชจ๋ธ์ ๋ํ์ฌ ์ง๋ฌธ์ ๋๋ค.
ํ.. ๋ ๋น ๋ฅธ ๋ต๋ณ์ ์ ๋ง๋ก์ ๋ง๋ก ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ์ค๋ก์ง๋ง ํ๋๋ง ๋ ์ฌ์ญ๊ณ ์ถ์๋ฐ์ใ ใ ์ต๊ทผ์ ํ์ด์ฌ์ ๊ณต๋ถํ๋ฉด์ abc(abstract base class)๋ผ๋ ๊ฐ๋ ์ ๋ฐฐ์์ต๋๋ค. ์๋ฃ๊ตฌ์กฐ์ ๋ผ๋๊ฐ ๋๋ iterable์ด๋ collections๊ฐ์ ํด๋์ค๋ฅผ ๊ด๋ฆฌํ๋ฉด์ ์ค๋ก์ง ์๋ฃ๊ตฌ์กฐ๊ฐ์ '์๊ณ'๋ฅผ ์ธ์ฐ๊ธฐ ์ํ์ฌ ์ฌ์ฉํ๋ ์ถ์์ ์ธ ํด๋์ค๋ผ๊ณ ๋ฐฐ์ ๋๋ฐ์ user๋ชจ๋ธ์ญ์ models.Model > AbstractBaseUser > AbstractUser > User๋ผ๋์์ผ๋ก ํด๋์ค๋ค๊ฐ์ ์๊ณ๊ฐ ์ธ์์ง๋๊ตฐ์. ์ฌ๊ธฐ์ abstact๋ผ๋ ๋ถ๋ถ์ด ํ์ด์ฌ์ abc, ๊ทธ๋ฌ๋๊น User๋ชจ๋ธ๋ค์ ์ํ(?)์ด๋ผ๋ ๋๋์ ์ฃผ๊ธฐ ์ํด์ ์ฌ์ฉํ๋ ๊ฒ ๊ฐ์๋ฐ ๋ง์๊น์?(ํน์ ํ์ด์ฌ์ด๋ ๊ฐ๋ฐ์ ์ฒด์์ ํต์ฉ๋๋ abstact์ ๊ฐ๋ ์ ๊ทธ๋ฅ django๊ฐ ์ฐจ์ฉํ ๊ฒ์ผ๊น์?) ๋ AbstractBaseUser๊ฐ์ ๊ฒฝ์ฐ๋ password๋ฅผ ๊ด๋ฆฌํ๋๋ฐ, AbstractUser์ ๋นํด ๊ด๋ฆฌ๋๋ ์ ๋ณด๊ฐ ์กฐ๊ธ ๋ ์ค์ํด์ Base๋ผ๋ ๊ฐ๋ ์ผ๋ก ๋๋์ด์ ๊ด๋ฆฌํ๋ ๊ฒ์ผ๊น์?(ํน์ password์ ์ํธํ์ ๊ฐ์ ๋ณต์กํ ๋ด๋ถ๋ก์ง์ด ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ๋ถ๋ฆฌํด์ ๋ค๋ฃจ๋ ๊ฑธ๊น์?) ๊ฐ๋์ abstact์ Base๋ผ๋ ๋จ์ด๊ฐ ์ฅ๊ณ ์์ ๋ณด์ด๋ ๊ฒ ๊ฐ์๋ฐ, ๋จ์ด๋ค์ ๋ณผ๋๋ง๋ค ๋น์ทํ ๋์์ค๋ก ๋ฐ์๋ค์ผ ์ ์๋ค๋ฉด ํจ์ฌ ํ์ตํ๊ธฐ๊ฐ ์ฌ์ธ ๊ฒ ๊ฐ์์ ์ฌ์ญค๋ด ๋๋ค.. ์ด๋ฐ๋ถ๋ถ์ ์ ๋ง ์ฐพ์๋ด๋ ๋์ค์ง๊ฐ ์๋๋ผ๊ตฌ์.. ์ด์ฉ๋ฉด ์ ๋ต์ด ์์ ์๋ ์๋ ์ง๋ฌธ๊ฐ์๋ฐ, ๊ฐ์ฌ๋์ ์๊ฒฌ์ด ๊ถ๊ธํฉ๋๋ค! ์๊ฐ ๋ด์ฃผ์ ์ ์ ๋ง ๊ฐ์ฌํฉ๋๋ค!
- 0
- 2
- 272
Q&A
rest_framework_jwt๋ฅผ ์ํฌํธํ ์ ์๋ค๋ ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค
ํ.. ํ์ธํ์ต๋๋ค ใ ใ print๋ฌธ์ ๋ฃ์ด๋ ์ถ๋ ฅ๋๋ ๋ถ๋ถ์ด ์์๊ณ cmd์์ python test_token.py๋ฅผ ์ ๋ ฅํ๋๊น ์ผ๋จ 401์ ๋ฐ์์ต๋๋ค.. ํํ.. ์ง์ง ์ฝ์ง์ด์๋ค์ ใ ใ ๊ฐ์ฌํฉ๋๋ค.. 401์ ๋ฐ์ ์ด์ ๋ ํ๋ฒ ๋ ์ฐพ์๋ด์ผ๊ฒ ๋ค์.. ํน์ ์ฐพ๊ฒ๋๋ฉด ์ด ๋๊ธ์ ์์ ํด์ ๋ฌ์๋๊ฒ ์ต๋๋ค.
- 0
- 5
- 1.8K
Q&A
rest_framework_jwt๋ฅผ ์ํฌํธํ ์ ์๋ค๋ ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค
๊ฐ์ธ์ ์ผ๋ก ์ผ์ด ์์ด์ ๋ต๋ณ์ ๋ฆ๊ฒ ํ์ธํ๋ค์ ์ฐ์ ๋ต๋ณ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ํด๋น ๊ฐ์ 15:06์ด ์ฆ์์ ์ ์๋๊ป์ test_token.py๋ฅผ ์คํ์์ผ์ , ์๋ต์ ๋ฐ์ผ์๋ ๋ถ๋ถ์ด ์์ต๋๋ค. simple_jwt๋ฅผ ์ ์ฉํด์ ๊ทธ๋ถ๋ถ์ ๋์ผํ๊ฒ ์ํํ๊ณ , ๋ ๊ฐ์์์ ์ฒ๋ผ ๋์ผํ ๋์ ๋๋ฆฌ ํํ์ ์๋ต์ ๋ฐ๊ธฐ๋ฅผ ๊ธฐ๋ํ๋๋ฐ (์ฌ์ง) ์ด๋ฐ์์ผ๋ก ์ํ์ ํด๋ด๋ ์๋ฌด๋ฐ ์๋ต์ด ๋๋์ ์ค์ง ์์์ต๋๋ค. ์ฐ์ ์๋ฒ๋ ์ผ์ ธ์๋ ๊ฒ์ ํ์ธํ๊ณ , settings.py์ญ์ ๋ฐฉ๊ธ ํ๋ฒ ๋ ํ์ธํ๋๋ฐ, ์ ์๋๊ป์ ๋ฐ๋ก ์์ ์ฌ๋ ค์ฃผ์ ๋ถ๋ถ๊ณผ ๋์ผํ๊ฒ ์ฒ๋ฆฌ๋์ด ์์ต๋๋ค. ํน์๋ชฐ๋ผ ํ ํฐ์ ์ ํจ๊ธฐ๊ฐ๊ณผ ๊ด๋ จ๋ ๋ถ๋ถ๋ ํจ์ฌ ๋ ๊ธด ์๊ฐ์ ๊ฐ์ ์ฃผ์์ต๋๋ค. token์ ์ผ๋จ access token๊ณผ refresh token์ ๋ค์๊ณผ ๊ฐ์ด ๋ฐ์์ (์ฌ์ง) test_token.py์ ๋ณต์ฌํด์ ๋ฃ์ด๋์์ต๋๋ค. ํ์ฌ ์ test_token.py์ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค import requests #JWT JWT_ACCESS_TOKEN = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNjQ4MDk4NzcxLCJpYXQiOjE2NDgwOTUxNzEsImp0aSI6IjMzYTM4ODU1MTI3ZTRhYWJiNzZkNmZhNWI3NTgwZjM1IiwidXNlcl9pZCI6Mn0.Z1mjp40YD6Eg0hQK01-Fp5FzDnk08G0Gfj54F1xtqH8" JWT_REFRESH_TOKEN = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbl90eXBlIjoicmVmcmVzaCIsImV4cCI6MTY0ODM1NDM3MSwiaWF0IjoxNjQ4MDk1MTcxLCJqdGkiOiIwN2RjMGY0MDZhMDA0YzRiOWVkNmJlN2Q0MTE2NjJjMSIsInVzZXJfaWQiOjJ9.Qtq40KFnvG994OhlwXFoL8f_nPOUR4_lwKlRmqiJiYs" #JWTํค๋ #์ฐธ๊ณ ๋ก bearer : JWT ๋๋ OAuthํ ํฐ์ ์ฌ์ฉํ๋ค๋ ๋ป์ jwt_headers={ "Authorization": f"Bearer {JWT_ACCESS_TOKEN}"} res = requests.get("http://localhost:8000/post/1",headers=jwt_headers) print(res) ๊ฐ์ ๋ง์ง๋ง๋ถ๋ถ์์ ์๊พธ ๋งํ์ ์๊พธ ์ง๋ฌธ๋๋ฆฌ๋๊ฒ ์ฃ์กํ๋ค์ ใ ใ ๋ ๋ต๋ณ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
- 0
- 5
- 1.8K