Wecode|Django登録機能の実装


django登録機能の実装


質問する

  • 作成したユーザークラスを読み込みます.すべてのクラスを一度にインポートすることはできません.私が使用するクラス
  • を正確に指定してください.
  • instagramの会員は、アカウントを使用してEメールを送信する必要があります.
  • instagram会員はパスワードが必要です.
  • 会員登録時には、他の携帯電話番号やニックネームを保存することもできます.
  • 電子メールまたは暗号鍵が送信されていない場合は、{"message":"KEY ERROR"}status code 400に戻ります.
  • 会員登録時に電子メールを使用します.電子メールは@とします.含める必要があります.≪関連|Related|emdw≫:条件が満たされていない場合は、対応するエラーを返します.このプロセスは、Eメール認証と呼ばれます.
  • 会員登録時にパスワードは少なくとも8桁含まなければならない.条件が満たされていない場合は、対応するエラーを返します.このプロセスをパスワード検証と呼びます.
  • 会員登録の場合、異なる人は同じ電話番号、ユーザー名、電子メールを使用しないため、既存の資料と重複することはできません.適切なエラーを返してください.
  • 登録に成功すると{"message":"SUCCESS"}status code 201に戻ります.
  • [その他の実装]->一般的な式は、Eメール認証またはパスワード認証に使用されます.
  • リポジトリプロジェクトの初期インストール


    まずはDjangoプロジェクトのために前に習った初期設定をすればいいです
  • 장고 프로젝트 초기세팅 & 가상환경 설정Djangoプロジェクト初期設定
  • しかし、いくつかの付加的な内容があります.CORSいくつかの追加情報があります.
  • CORSインストールプラグイン
  • pip install django-cors-headers
  • ALLOWED_HOSTS 추가
  • # settings.py
    ALLOWED_HOSTS = ['*']
    別のコンピュータが私のサーバーに接続しようとしています.無差別接続を防止するためにALLED HOSTSを修正し,特定のIPアドレスを持つ接続のみを許可した.通常は、許可したいIPアドレスのみを入力しますが、プロジェクトの実行時に複数のIPアドレスを許可する必要があるため、*はこれらのアドレスをすべて許可します.
  • INSTALLED_APPS에 corsheaders 추가
  • # settings.py
    INSTALLED_APPS = [
        #'django.contrib.admin',
        #'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'corsheaders',
    ]
    フロントエンドと通信する場合は、別のポートに接続してみます.INSTALLED APPSでは、既存の設定の下にシースを追加して、この操作を許可します.
  • middleware 추가
  • # settings.py
    MIDDLEWARE = [
    	...
        'corsheaders.middleware.CorsMiddleware',
    ]
  • settings.py 제일 아래 다음 내용 추가
  • # settings.py
    ##CORS
    CORS_ORIGIN_ALLOW_ALL=True
    CORS_ALLOW_CREDENTIALS = True
    
    CORS_ALLOW_METHODS = (
        'DELETE',
        'GET',
        'OPTIONS',
        'PATCH',
        'POST',
        'PUT',
    )
    
    CORS_ALLOW_HEADERS = (
        'accept',
        'accept-encoding',
        'authorization',
        'content-type',
        'dnt',
        'origin',
        'user-agent',
        'x-csrftoken',
        'x-requested-with',
    )
    これは、倉庫プロジェクトを開始する初期設定です.機能の実装を開始しましょう.
    まず、会員シップとログインを実現するためにheat appを作成する必要があります.この名前はuserまたはaccountである必要があります.私はuserを作ります.

    会員加入機能の実施

  • 회원가입 기능 구현 app 만들기
  • python manage.py startapp user
  • 회원가입 user 테이블 만들기
  • from django.db       import models
    
    class User(models.Model):
        email        = models.EmailField(max_length=50)
        password     = models.CharField(max_length=300)
        phone_number = models.CharField(max_length=20, null=True)
        nickname     = models.CharField(max_length=20, null=True)
        
        class Meta:
            db_table = 'users'  
    models.pyには、次の表クラスが作成されています.今後の移行でデータベースにテーブルを作成します.
  • 마이그레이션하여 테이블 생성
  • python manage.py makemigrations
    python manage.py migrate
  • views.py
  • import json, re, bcrypt, jwt
    
    from django.core.exceptions import ObjectDoesNotExist
    from django.http            import JsonResponse
    from django.db              import IntegrityError
    from django.views           import View
    
    from westagram.settings     import SECRET_KEY, ALGORITHM
    from .models                import User 
    
    class UserSignUp(View):
        def post(self, request):
    
            email_regex       = '^[a-zA-Z0-9+-_.]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$'
            data              = json.loads(request.body)
            signup_data       = User.objects
            hashed_pw         = bcrypt.hashpw(data['password'].encode('utf-8'), bcrypt.gensalt())
            decoded_hashed_pw = hashed_pw.decode('utf-8')
            
            try:
                if not re.match(email_regex, data['email']):
                    return JsonResponse({'message': 'EMAIL_ERROR'}, status=400) 
                
                if len(data['password']) < 8:
                    return JsonResponse({'message': 'PASSWORD_ERROR'}, status=400)
                
                if signup_data.filter(nickname = data['nickname']).exists(): 
                    return JsonResponse({'message': 'UNIQUE_ERROR'}, status=400)
    
                if signup_data.filter(phone_number = data['phone_number']).exists():
                    return JsonResponse({'message': 'UNIQUE_ERROR'}, status=400)    
    
                User.objects.create(
                    email        = data['email'],
                    password     = decoded_hashed_pw,
                    nickname     = data['nickname'],
                    phone_number = data['phone_number']
                )
            except KeyError:
                return JsonResponse({'message': 'KEY_ERROR'}, status=400)
            except IntegrityError:
                return JsonResponse({'message': 'UNIQUE_ERROR'}, status=400)
            
            return JsonResponse({'message': 'SUCCESS'}, status=201)
    私たちはあなたが以前学んだbcryptを使用して、会員になるように暗号化します.email validationでは、正規表現を使用して検証されます.同様に、他の条件では正規表現を使用して検証することもできますが、初めて機能を実装した場合、電子メールのみが正規表現を使用し、他の条件は条件文で検証されます.もちろん、電子メールは条件文で検証することもできますが、条件が長くなり、コードが乱雑になります.最初は、これらはすべて条件文によって検証されましたが、その後、通常式を使用する必要があるため、Eメールで最も長い条件文である通常式が使用されました.
    Eメールの条件文が長くなるのは、@および.を使用する必要があるためであり、この記号を使用する場合の順序も重要です.re正規表現Regular Expressionの略語regexをインポートして使用する必要があります.すなわち、正規表現を使用する機能を許可します.try except構文は複数のエラーに対して異常処理を行った.
    パスワード暗号化については、前述のbcryptpostingで詳しく説明します.この部分を参考にして、会員時に暗号化を適用すればいいです.
    Bcrypt暗号化
    暗号化プロセスの重要な側面の1つは、データベースに暗号化されたパスワードが含まれている場合、str形式で格納されることです.したがって、バイトタイプとして符号化されたパスワードもtypeがバイトであるが、DBに記憶されている場合はb$2b$12$dYJ1blTyGOmrCv27nCEPFObqg3A1VOv..TW4z9nfmzChVObjeH9/iの形式であるが、参照として、先頭のbはバイトを表す記号である.ただし、python shellでtypeを印刷しようとするとstrとして現れるので、以降のトークン発行中にトラブルに遭いたくない場合はstrとしてdecode挿入を行うのが望ましい.
    try以外の重要な部分は条件文の統一である.Pythonは人間にやさしい言語なので、可読性の良い人だけがPythonを正しく使うことができます.つまり、他の人がどんなコードを見ても、一目瞭然に書かなければならないということです.したがって,try以外に条件文は統一性を持つべきである.条件文でnotを使用する場合は、条件に合致しない場合は、すべてnotフィルタリングとスキップ条件文を使用し、逆も同様です.条件文にnot条件文とnotが存在しない基本条件文を乱用すると可読性が低下する.
    すべての条件がうまく実現したら、今すぐデータベースでhttpieを使って会員登録実習を行いましょう.
  • user/urls.py
  • from django.urls import path
    from user.views  import UserSignUp
    
    urlpatterns = [
        path('/signup', UserSignUp.as_view()),
    ]

    機能検証


    サーバ通信の実験として2つのツールを使用することができます.httpieおよびpostmanまず、httpieはツールをインストールすることなく、ShellでPythonパッケージを使用することができます.
  • httpie
  • pip install httpie
  • postmanhttps://www.postman.com/
    これはPostman公式サイトです.ここではツールをダウンロードして使用できます.
  • Postman使用画面.二つの中で使いやすいものを使えばいいです.
    では、httpieを使用して実践します.
    http -v POST localhost:8000/user/signup email="[email protected]"
    nickname="테스트" password= "testpassword123" phone_number= "01011223344"
    shellでは、クライアントからサーバに次のコマンドを直接要求できます.


    サーバーを通じて201表示の会員が加入しているのがよく見えます.会員加入に成功した場合は、データベースにも希望の情報が含まれているはずです.

    下図のように、データベースにも良い内容が含まれています.