第1のステップと、予備的分析
設計モデルの前に、我々は、データベースのコードを保存することを決定しましたので、そこでここでは、使用する必要があります mixins.CreateModelMixinを
ユーザーの携帯電話番号で送信されると同時に、で、私たちには、自分のバックエンドの検証を行う必要があります
- 電話番号が登録されているかどうか
- 電話番号が正当[settings.pyプラスREGEX_MOBILE = "^ 1 [358] \ {D} $ 9。。| ^ 147 \ 8 {D} $ | ^ 176 \ 8 {D} $。"]
- 2つのコード間の間隔は60秒超であるかどうか
これらの考察に基づいて、我々は作成する必要がありますシリアライザを
シリアライザ・ロジックを書くとき、私たちは、シリアライザとusers.models.VerifyCodeとして財を書き込む前に、我々は同じようにならないことをここで注意しなければならないバインド、VerifyCodeコードが必要な分野であるが、ユーザーは電話番号のみに確認コードを取得する必要がありますので、
あなたがフィールドにシリアライザとのみを使用している場合、これに書き換える必要性を確認しvalidate_フィールド名を()関数を
コードコードは、必要があり、その後の後に正常に送信され、保存、ユーザーがコードを推測防止し、及びログインが成功します
第2の工程と、書き込みコード
まず、書き込みuser.serializers.py
輸入再 から日時インポート日時で、timedelta から rest_frameworkの輸入シリアライザ から django.contrib.auth 輸入get_user_model MxShop.settingsの輸入REGEX_MOBILE から .models インポートVerifyCodeを ユーザー = get_user_model() #は、USERPROFILEデータベーステーブルを取得することができます #電話番号を確認し 、クラスSmsSerializer(serializers.Serializerを): モバイル = serializers.CharField(MAX_LENGTH = 11 ) #アローン検証するために、モバイル分野のための DEF :validate_mobile(モバイルセルフ、) #の電話番号が登録されている IF User.objects.filter(モバイル= モバイル).count(): 昇給 serializers.ValidationErrorを(" ユーザーがすでに存在しています" ) #電話番号が正当なものである IFが ない(REGEX_MOBILE、モバイル)をre.match: 昇給 serializers.ValidationError(「違法な携帯電話番号」) #送信周波数を確認 = DateTime.Now()one_minute_ago -はtimedelta(時間= 0、= 1分、秒= 0) IF VerifyCode.objects.filter(add_time__gt = one_minute_ago、モバイル= モバイル).count(): 上げ serializers.ValidationError (「最後の伝送距離が60秒を超えていません」) #によって検証 リターンモバイル
そして、書き込みuser.views.py
django.shortcuts インポートレンダリング から django.contrib.auth.backends インポートModelBackendを から django.contrib.auth 輸入get_user_model から django.db.models インポートQを から rest_framework.mixins インポートCreateModelMixinを から rest_frameworkの輸入ビューセット から rest_framework.response 輸入レスポンス から rest_framework 輸入状況 からランダム輸入選択肢 .serializers インポートSmsSerializerを から utils.yunpian 輸入YunPian から MxShop.settingsの輸入APIKEY から .models インポートVerifyCodeを ユーザー = get_user_model() #の送信メッセージ認証コード クラスSmsCodeViewset(CreateModelMixin、viewsets.GenericViewSet)。 serializer_class = SmsSerializer #ランダムコードの生成機能 DEF generate_code(セルフ): 種子 = " 1234567890 " code_lst = [] のための I における範囲(4 ): code_lst.append(選択肢(シーズ)) リターン "" .join(code_lst) デフ(自己、要求、* argsを、**作成kwargsからの): シリアライザ = self.get_serializer(データ= request.data) serializer.is_valid(RAISE_EXCEPTION = TRUE) #シリアライザが通過しない場合には、後者は実行されず、DRFう自動包装ステータスコード400を #モバイルフィールド上記検証が成功し、モバイル得、その送信及びコード モバイルserializer.validated_data = [ 「モバイル」 ] #1 validated_dataがデータシリアライザに戻され、A辞書 yunpian = YunPian(APIKEY) コード = self.generate_code() sms_status = yunpian.send_sms(コード=コード、モバイル= モバイル) #送信が失敗した場合は、パディングモバイルにエラーメッセージ、一方、パッケージ400のコードの状態 IF sms_status [ 「コード」 ]!= 0:を 返す(レスポンス { " モバイル":sms_status [ " MSG " ]}、 ステータス = status.HTTP_400_BAD_REQUEST ) 他:#データベースに保存するための送信成功コードであれば、電話番号を返し、ステータスコードパッケージ201 code_record = VerifyCode(コード=コード、モバイル= モバイル) code_record.save() リターンレスポンス( { 「モバイル」:モバイル} ステータス = status.HTTP_201_CREATED )
次に、settings.py
#電話番号正規表現 REGEX_MOBILE = " ^ 1 [358] \ {D} $ 9 |。。。^ 147 \ 8 {D} $ | ^ 176 \ 8 {D} $。" #クラウドシートウェブに配置された APIKEY = 「cdb6f4b3860c552f790176a9e4f3fd85 」
最後にurls.py、確認コードを登録するインタフェース
#送信認証コードインターフェース (R&LT router.register ' コード'、SmsCodeViewset、ベース名= " コード")
次に、あなたのブラウザのテストに行きます
---事実ではなく、その中国での紳士、その内部のガバナンスは、外側死亡した チャン・ ----