[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!
  • 200
    :データgetpostupdateの処理が成功した場合
  • .
  • 201
    :データresourceが作成されている場合は、
  • です.
  • 400
    :front-end要求が処理できない場合
    : bad request
  • 401
    :
  • 、無許可

    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.exceptionsMultipleObjectsReturnedを使っていないので取り除くべきですexceptionを使ってみたときはいつもモデルが間違っていると言っていました…!
    正式な書類を確認した後、model classで使用します.👉🏻 Model Class Reference
    (model classでimport、views.pyでexception MultipleObjectsReturnedと書きます!)
    今日の平和コード!
    (今は午前4時35分休憩…)