[PROD JECT]実装Westgram endpoint(4)-コメントを終了!
0、変数名が簡単! class User(models.Model):
user_name = models.CharField(max_length=30, unique=True)
-> 이렇게 해주면 무조건 unique하게 입력되기 때문에
추후에 회원가입 시 무조건 unique하게 입력되고,
로그인 시에도 filter(), get()메서드를 사용했을 때 unique한 값만 가져올 수 있다.
👆🏻 models.pyでテーブルを定義するときに、長い変数名を作成する必要のない私...!user = User.objects.get(id=1)
user.name
👆🏻 後で確認します.pyで論理を記述する場合、モデル内の各クラスからこのフィールドの値を取得する場合、user.user_name
と書く必要がないよりも、user.name
と書く方が毒性が高い!
🤩 修正の様子
from django.db import models
class User(models.Model):
name = models.CharField(max_length=30, unique=True, default='')
password = models.CharField(max_length=100)
class Meta:
db_table = 'users'
1.json復号エラー防止 def post(self, request):
data = json.loads(request.body)
try:
.....
このように記述すると、フロントエンドからのデータが1つもないため、jsonがロードするデータがない場合、raise Exceptions ......
👆🏻レゴは約ロックdecode
になります.def post(self, request):
try:
data = json.loads(request.body)
.....
except JsonDecodeError:
.....
このようにtry文に現れる可能性のある状況を入れると、
具体的には除外する場合(もちろん、decode에러
のほか、その他のエラーも明記…!)
🤩 修正の様子
import json
import re
import bcrypt
import jwt
from django.http import JsonResponse
from django.views import View
from user.models import User
from westagram.settings import SECRET_KEY, ALGORITHM
# sign up
class Signup(View):
def post(self, request):
try:
data = json.loads(request.body)
if data.get('name') is not None:
if data.get('password') is not None:
if User.objects.filter(name=data['name']).count() > 0:
return JsonResponse({'message':'DUPLICATED_USERNAME'}, status=400)
if re.search('[0-9]+', data['password']) is None:
return JsonResponse({'message':'TOO_SHORT_PW'}, status=400)
hashed_password = bcrypt.hashpw(data['password'].encode('utf-8'), bcrypt.gensalt())
User.objects.create(
name = data['name'],
password = hashed_password.decode('utf-8')
)
return JsonResponse({'message':'SUCCESS'}, status=200)
except KeyError: <- 요 구간!
return JsonResponse({'message':'KEY_ERROR'}, status=400)
except ValueError:
return JsonResponse({'message':'DECODE_ERROR'}, status=400)
2.簡潔なif文 def post(self, request):
try:
data = json.loads(request.body)
if data.get('user_name') is not None:
このように行間にif文が書いてあります...
ただし、json形式で入力されるデータ変数はすでにdictionary
形式である..get()
メソッドを使用する場合、値がない場合は無条件にNoneを返します.
ifをそんなに長く書く必要はありません!
また、データの値を別の変数に置かない場合は、
引き続き上部に戻り、データ変数の値を表示します.
よく使う価格は変数に入れて準備したほうがいいです!(可読性も…!name = data.get('name')
password = data.get('password')
if name or password 👍 :
return ...
👆🏻 こんなロケしか書けません!!
3.filter()を使用して、データベース内のデータが存在するかどうかを確認します。 if name:
if User.objects.filter(name=name).exists():
return ...
if len(password) < 5:
return ...
すでにfilter()
の方法は1つの相応の値しか持ってこないので、私が前にやったように.count()
の方法で1つの数を数える必要はありません...!
インポートした値が存在するかどうか、存在するかどうかを確認するだけで...!
🤩 修正の様子
class Signup(View):
def post(self, request):
try:
data = json.loads(request.body)
name = data.get('name')
password = data.get('password')
if name:
if password:
if User.objects.filter(name=name).exists():
return JsonResponse({'message':'DUPLICATED_USERNAME'}, status=400)
if len(password) < 8:
return JsonResponse({'message':'TOO_SHORT_PW'}, status=400)
hashed_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())
User.objects.create(
name = name,
password = hashed_password.decode('utf-8')
)
return JsonResponse({'message':'SUCCESS'}, status=200)
except KeyError:
return JsonResponse({'message':'KEY_ERROR'}, status=400)
except ValueError:
return JsonResponse({'message':'DECODE_ERROR'}, status=400)
4.状況に合ったステータスコード! status
code!
class User(models.Model):
user_name = models.CharField(max_length=30, unique=True)
-> 이렇게 해주면 무조건 unique하게 입력되기 때문에
추후에 회원가입 시 무조건 unique하게 입력되고,
로그인 시에도 filter(), get()메서드를 사용했을 때 unique한 값만 가져올 수 있다.
user = User.objects.get(id=1)
user.name
from django.db import models
class User(models.Model):
name = models.CharField(max_length=30, unique=True, default='')
password = models.CharField(max_length=100)
class Meta:
db_table = 'users'
def post(self, request):
data = json.loads(request.body)
try:
.....
このように記述すると、フロントエンドからのデータが1つもないため、jsonがロードするデータがない場合、raise Exceptions ......
👆🏻レゴは約ロックdecode
になります.def post(self, request):
try:
data = json.loads(request.body)
.....
except JsonDecodeError:
.....
このようにtry文に現れる可能性のある状況を入れると、具体的には除外する場合(もちろん、
decode에러
のほか、その他のエラーも明記…!)🤩 修正の様子
import json
import re
import bcrypt
import jwt
from django.http import JsonResponse
from django.views import View
from user.models import User
from westagram.settings import SECRET_KEY, ALGORITHM
# sign up
class Signup(View):
def post(self, request):
try:
data = json.loads(request.body)
if data.get('name') is not None:
if data.get('password') is not None:
if User.objects.filter(name=data['name']).count() > 0:
return JsonResponse({'message':'DUPLICATED_USERNAME'}, status=400)
if re.search('[0-9]+', data['password']) is None:
return JsonResponse({'message':'TOO_SHORT_PW'}, status=400)
hashed_password = bcrypt.hashpw(data['password'].encode('utf-8'), bcrypt.gensalt())
User.objects.create(
name = data['name'],
password = hashed_password.decode('utf-8')
)
return JsonResponse({'message':'SUCCESS'}, status=200)
except KeyError: <- 요 구간!
return JsonResponse({'message':'KEY_ERROR'}, status=400)
except ValueError:
return JsonResponse({'message':'DECODE_ERROR'}, status=400)
2.簡潔なif文 def post(self, request):
try:
data = json.loads(request.body)
if data.get('user_name') is not None:
このように行間にif文が書いてあります...
ただし、json形式で入力されるデータ変数はすでにdictionary
形式である..get()
メソッドを使用する場合、値がない場合は無条件にNoneを返します.
ifをそんなに長く書く必要はありません!
また、データの値を別の変数に置かない場合は、
引き続き上部に戻り、データ変数の値を表示します.
よく使う価格は変数に入れて準備したほうがいいです!(可読性も…!name = data.get('name')
password = data.get('password')
if name or password 👍 :
return ...
👆🏻 こんなロケしか書けません!!
3.filter()を使用して、データベース内のデータが存在するかどうかを確認します。 if name:
if User.objects.filter(name=name).exists():
return ...
if len(password) < 5:
return ...
すでにfilter()
の方法は1つの相応の値しか持ってこないので、私が前にやったように.count()
の方法で1つの数を数える必要はありません...!
インポートした値が存在するかどうか、存在するかどうかを確認するだけで...!
🤩 修正の様子
class Signup(View):
def post(self, request):
try:
data = json.loads(request.body)
name = data.get('name')
password = data.get('password')
if name:
if password:
if User.objects.filter(name=name).exists():
return JsonResponse({'message':'DUPLICATED_USERNAME'}, status=400)
if len(password) < 8:
return JsonResponse({'message':'TOO_SHORT_PW'}, status=400)
hashed_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())
User.objects.create(
name = name,
password = hashed_password.decode('utf-8')
)
return JsonResponse({'message':'SUCCESS'}, status=200)
except KeyError:
return JsonResponse({'message':'KEY_ERROR'}, status=400)
except ValueError:
return JsonResponse({'message':'DECODE_ERROR'}, status=400)
4.状況に合ったステータスコード! status
code!
def post(self, request):
try:
data = json.loads(request.body)
if data.get('user_name') is not None:
name = data.get('name')
password = data.get('password')
if name or password 👍 :
return ...
if name:
if User.objects.filter(name=name).exists():
return ...
if len(password) < 5:
return ...
すでにfilter()
の方法は1つの相応の値しか持ってこないので、私が前にやったように.count()
の方法で1つの数を数える必要はありません...!インポートした値が存在するかどうか、存在するかどうかを確認するだけで...!
🤩 修正の様子
class Signup(View):
def post(self, request):
try:
data = json.loads(request.body)
name = data.get('name')
password = data.get('password')
if name:
if password:
if User.objects.filter(name=name).exists():
return JsonResponse({'message':'DUPLICATED_USERNAME'}, status=400)
if len(password) < 8:
return JsonResponse({'message':'TOO_SHORT_PW'}, status=400)
hashed_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())
User.objects.create(
name = name,
password = hashed_password.decode('utf-8')
)
return JsonResponse({'message':'SUCCESS'}, status=200)
except KeyError:
return JsonResponse({'message':'KEY_ERROR'}, status=400)
except ValueError:
return JsonResponse({'message':'DECODE_ERROR'}, status=400)
4.状況に合ったステータスコード! status
code!
:データ
get
、post
、update
の処理が成功した場合:データ
resource
が作成されている場合は、:
front-end
要求が処理できない場合:
bad request
:
5.除汚処理 else:
return JsonResponse({'message':'KEY_ERROR'}, status=400)
else:
return JsonResponse({'message':'KEY_ERROR'}, status=400)
except:
return JsonResponse({'message':'KEY_ERROR'}, status=400)
すべてのif文の異常処理をexceptionの私のコードに統一します!
どう考えてもこれよりきれいに処理できる.好奇心の刹那! except KeyError:
return JsonResponse()
except User.DoesNotExist:
return JsonReponse()
except User.MutipleObjectReturn:
return JsonResponse({'message' :'DUPLICATE_USER'}, status=409)
👆🏻 要するに、すべての場合、私の例外はkey error
なので、except
でどのようなエラーが具体的に説明されているかを説明すると、
1個except
個以上も対応できます!
最終的な意見。pyロジック(登録、ログイン)
🤯 🥺 🤩import json
import re
import bcrypt
import jwt
from django.http import JsonResponse
from django.views import View
from user.models import User
from westagram.settings import SECRET_KEY, ALGORITHM
# sign up
class Signup(View):
def post(self, request):
try:
data = json.loads(request.body)
name = data.get('name')
password = data.get('password')
if name:
if password:
if User.objects.filter(name=name).exists():
return JsonResponse({'message':'DUPLICATED_USERNAME'}, status=400)
if len(password) < 8:
return JsonResponse({'message':'TOO_SHORT_PW'}, status=400)
hashed_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())
User.objects.create(
name = name,
password = hashed_password.decode('utf-8')
)
return JsonResponse({'message':'SUCCESS'}, status=200)
except KeyError:
return JsonResponse({'message':'KEY_ERROR'}, status=400)
except ValueError:
return JsonResponse({'message':'DECODE_ERROR'}, status=400)
# sign in
class Signin(View):
def post(self, request):
try:
data = json.loads(request.body)
name = data['name']
password = data['password']
user_info = User.objects.get(name=name)
signin_id = user_info.name
signin_pw = user_info.password.encode('utf-8')
if User.objects.filter(name=name).exists():
if signin_id == name and bcrypt.checkpw(password.encode('utf-8'), signin_pw):
access_token = jwt.encode({'name':name}, SECRET_KEY, algorithm = ALGORITHM).decode('utf-8')
return JsonResponse({'message':'SUCCESS', 'access_token':access_token}, status=200)
except KeyError:
return JsonResponse({'message':'KEY_ERROR'}, status=401)
except ValueError:
return JsonResponse({'message':'INVALID_USER'}, status=401)
except User.MultipleObjectsReturned:
return JsonResponse({'message':'MULTIPLE_USERS'}, status=409)
実はdjango.core.exceptions
のMultipleObjectsReturned
を使っていないので取り除くべきですexception
を使ってみたときはいつもモデルが間違っていると言っていました…!
正式な書類を確認した後、model class
で使用します.👉🏻 Model Class Reference
(model class
でimport、views.pyでexception MultipleObjectsReturned
と書きます!)
今日の平和コード!
(今は午前4時35分休憩…)
Reference
この問題について([PROD JECT]実装Westgram endpoint(4)-コメントを終了!), 我々は、より多くの情報をここで見つけました
https://velog.io/@haileeyu21/PROJECT-Westgram-endpoint-구현-4-마무리-리뷰
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
else:
return JsonResponse({'message':'KEY_ERROR'}, status=400)
else:
return JsonResponse({'message':'KEY_ERROR'}, status=400)
except:
return JsonResponse({'message':'KEY_ERROR'}, status=400)
except KeyError:
return JsonResponse()
except User.DoesNotExist:
return JsonReponse()
except User.MutipleObjectReturn:
return JsonResponse({'message' :'DUPLICATE_USER'}, status=409)
🤯 🥺 🤩
import json
import re
import bcrypt
import jwt
from django.http import JsonResponse
from django.views import View
from user.models import User
from westagram.settings import SECRET_KEY, ALGORITHM
# sign up
class Signup(View):
def post(self, request):
try:
data = json.loads(request.body)
name = data.get('name')
password = data.get('password')
if name:
if password:
if User.objects.filter(name=name).exists():
return JsonResponse({'message':'DUPLICATED_USERNAME'}, status=400)
if len(password) < 8:
return JsonResponse({'message':'TOO_SHORT_PW'}, status=400)
hashed_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())
User.objects.create(
name = name,
password = hashed_password.decode('utf-8')
)
return JsonResponse({'message':'SUCCESS'}, status=200)
except KeyError:
return JsonResponse({'message':'KEY_ERROR'}, status=400)
except ValueError:
return JsonResponse({'message':'DECODE_ERROR'}, status=400)
# sign in
class Signin(View):
def post(self, request):
try:
data = json.loads(request.body)
name = data['name']
password = data['password']
user_info = User.objects.get(name=name)
signin_id = user_info.name
signin_pw = user_info.password.encode('utf-8')
if User.objects.filter(name=name).exists():
if signin_id == name and bcrypt.checkpw(password.encode('utf-8'), signin_pw):
access_token = jwt.encode({'name':name}, SECRET_KEY, algorithm = ALGORITHM).decode('utf-8')
return JsonResponse({'message':'SUCCESS', 'access_token':access_token}, status=200)
except KeyError:
return JsonResponse({'message':'KEY_ERROR'}, status=401)
except ValueError:
return JsonResponse({'message':'INVALID_USER'}, status=401)
except User.MultipleObjectsReturned:
return JsonResponse({'message':'MULTIPLE_USERS'}, status=409)
実はdjango.core.exceptions
のMultipleObjectsReturned
を使っていないので取り除くべきですexception
を使ってみたときはいつもモデルが間違っていると言っていました…!正式な書類を確認した後、
model class
で使用します.👉🏻 Model Class Reference (
model class
でimport、views.pyでexception MultipleObjectsReturned
と書きます!)今日の平和コード!
(今は午前4時35分休憩…)
Reference
この問題について([PROD JECT]実装Westgram endpoint(4)-コメントを終了!), 我々は、より多くの情報をここで見つけました https://velog.io/@haileeyu21/PROJECT-Westgram-endpoint-구현-4-마무리-리뷰テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol