Wistar(会員登録、登録、認証&承認)


Wistartramでいろいろな機能を実現し、フロントとテストしたのは初めての経験です.私はいろいろな機能を試して、知らないところをたくさん見つけたので、これらの場所を整理して、それをたくさんの場所に応用します.基本設定を作成しますが、重要な部分は含まれません.
登録
models.py
from django.db import models

class User(models.Model):
    email        = models.emailField(max_lengh=50, unique=True)
    password     = models.charField(max_lengh=50)
    phone_number = models.charField(max_lengh=50, null=True, unique=True)
    nickname     = models.charField(max_lengh=50, null=True, unique=True)
    
    class Meta:
    	db_table = 'uers'
まずモデリングによってモデルを構築します.pyを作りました
会員加入にはemail、password、phone number、ニックネームが必要ですが、phone numberとniknameは記入する必要がないのでnull=Trueをあげて他の人と重なることができない内容にしたので、特別設定しました.
views.py
import re, json, bcrypt, jwt

from json.encoder import JSONEncoder

from django.views import View
from django.http  import JsonResponse
from django.db.models  import Q

from .models      import User
from my_settings import SECRET_KEY, ALGORITHM

class SignupView(View):

    def post(self, request):

        email_regex    = '^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$'
        password_regex = '^[a-zA-Z0-9!@#$%^&*()-_+={}\|\\\/].{7,}$'

        try:
            data = json.loads(request.body)

            hased_pw = bcrypt.hashpw(data['password'].encode('utf-8'), bcrypt.gensalt()).decode('utf-8')

            nickname     = data.get('nickname')
            email        = data['email']
            password     = data['password']
            phone_number = data.get('phone_number')

            if not re.search(email_regex, email):
                return JsonResponse({'message': '이메일 형식이 아닙니다.'}, status= 400)
            
            if not re.search(password_regex, password):
                return JsonResponse({'message': '패스워드 형식이 아닙니다.'}, status= 400)
              
            if User.objects.filter(
                Q(nickname = nickname) | Q(phone_number = phone_number) | Q(email = email)):
                
                return JsonResponse({'message': '입력값이 중복되었습니다.'}, status= 409)
            
            User.objects.create(
                nickname     = nickname,
                email        = email,
                password     = hased_pw,
                phone_number = phone_number
            )
            
            return JsonResponse({'message': 'SUCCESS'}, status= 201)

        except KeyError:
            return JsonResponse({'message': 'KEY_ERROR'}, status= 400)

class LoginView(View):
    
    def post(self, request):
        try:
            data = json.loads(request.body)

            account  = data['email']
            password = data['password']

            if not User.objects.filter(email = account).exists():
                return JsonResponse({'message': 'INVALID_USER'}, status= 401)

            user_id = User.objects.get(email=account)

            if not bcrypt.checkpw(password.encode('utf-8'), user_id.password.encode('utf-8')):
                return JsonResponse({'message': 'INVALID_USER'}, status= 401)

            token = jwt.encode({'account': account}, SECRET_KEY, algorithm=ALGORITHM)
            return JsonResponse({'message': 'SUCCESS', "token": token}, status = 200)
        except KeyError:
            return JsonResponse({'message': 'KEY_ERROR'}, status= 400)
    
まず、インデントと=標準ソートが重要で、行はスペースで使用されます.
説明:
正規表現を使うのは初めてです.最初から正規表現の部分を書くのは難しいので、他の場所で使用する表現をインポートし、必要な条件の正規表現に変更しました.
正規表現に合致しない値が含まれ、エラー値を指定する必要があるため、戻り値はフォーマットではなく、400-errorコードであるためstatus 400に与えられます.次はqオブジェクトif User.objects.filter(を初めて使用します.
最初は、同じif文を3つ提示しましたが、orを使用するときにqオブジェクトに変更することをお勧めします.最初はどの部分の値を正確に繰り返したのか分かりませんが、なぜそれを使うのでしょうか.私はこのような考えを持っていますが、それは確かに簡略化された利点があるので、私はそれを使い始めました.次にpostのtry exception文でkeyerrorを加算し、keyerror値を入力しないとkeyerrorに与えます.
ログイン部分は最初はgetを使うと思っていましたが、後で考えたらbodyに値を作成すべきだと思ってpostを使いました.
ログインセクションにはemailとpasswordが使用されています.loginセクションでは、bcryptおよびjwtトークンを介して暗号化アクティビティを介して新しいトークンを発行する.ログイン部でもエラー処理を行い,データ上でトークン値を検証した.
資格認定
models.py
from django.db import models

from user.models import User
# Create your models here.

class Posting(models.Model):
    time    = models.TimeField(auto_now_add=True)
    img_url = models.URLField()
    user    = models.ForeignKey(User, on_delete=models.CASCADE)

    class Meta:
        db_table = 'postings'
投稿を登録するために、新しいアプリケーション、新しいモデルが作成されました.pyが作成されました.現在の時間、img urlユーザー情報が必要であるため、上記のコードに従って作成します.timeはtimefieldを初めて使用し、auto now add=Trueを使用します.このセクションでは、自動的にコンテンツを入力し、ユーザーの情報を必要とするため、forinキーで参照します.
views.py
import json, jwt

from django.views import View
from django.http  import JsonResponse

from .models import Posting
from user.models import User
from my_settings import SECRET_KEY, ALGORITHM

class PostingView(View):
    
    def post(self, request):

        try:
            data = json.loads(request.body)
            token      = request.headers['token']

            Posting.objects.create(
            img_url  = data['img_url'],
            user     = User.objects.get(email=jwt.decode(token, SECRET_KEY, algorithms=ALGORITHM)['account'])
            )

            return JsonResponse({'message': 'SUCCESS'}, status= 201)

        except KeyError:
            return JsonResponse({'message': 'KEY_ERROR'}, status= 400)

class Post_updateView(View):

    def get(self, request):

        posting_data = Posting.objects.values()
        return JsonResponse({'posting_data': list(posting_data)}, status = 200)
       
説明:
クラス投稿を登録するためにpostingviewを作成し、投稿を公開するためにpost updateviewを作成しました.
posttingviewはpostを使用して投稿を登録しますが、投稿を登録するにはトークン値を取得する必要があります.Decodeを使用するのは、ディックシーケンスアクセスのために暗号化されたトークンを復号する必要があるためです.img urlで投稿を登録し、キー値を入力せずに時間が生成されたことをテストで知りました.
投稿を発表するためにposting.objects.values()を利用しましたvaluesは、ディックシーケンスとして保存されているすべてのロケーション情報を取得するクエリーセットです.私は初めてこのクエリーセットを使って、たくさん応用できるはずです.
ポスト
多くの機能は実装されていませんが、これらの機能を実装することで、多くのことを学び、他の人と比較しました.最初は、他の人が書いた文章だけを見て情報を探していましたが、djangoの公式ドキュメントから得た情報が非常に多かったことも貴重だと思います.開発者として、不足は多いが、徐々に基礎を築いてきた開発者になりたいと思います.今のように知らない部分は、同僚たちとのコミュニケーションを通じて、いろいろな経験とコミュニケーション能力を持つ開発者になるように努力します.