まず、認証コンポーネント
どのように使用するには:
①、新しいファイルを認定クラスを記述します。my_examine.pyを
#のインポートは、基本クラスBaseAuthenticationを継承する必要がある から rest_framework.authentication インポートBaseAuthentication から rest_framework.exceptions インポートAuthenticationFailed から app01 インポートモデル #がBaseAuthenticationの継承認証クラスの作成 クラスMYAUTH(BaseAuthenticationを): #は、コンテンツを定義するために使用される特定の認証方法書き込み認証固定 DEFを認証(自己、リクエスト): #1 書き込み認証ロジックコード #の例では、バックエンドデータベースからデータトークンを想定し、フロントエンドによって送信された要求は、認証トークンが必要 トークン= request.GET.get(「トークン」) token_objModels.Token.objects.filterは=(=トークン)(1次回トークン) IF token_obj: #は、トークン検証を表す値を持つ #現在ユーザオブジェクトに記録token_obj.user取るために使用することができる 。#ここで2つのデータを戻す必要がある 戻りtoken_objをtoken_obj .user、 他: 昇給 AuthenticationFailed(' 不正')
話題:ビュークラスで認証を追加します:
app01.my_examine 輸入MYAUTH #ここにあなたの意見を作成します。 クラス書籍(APIView): #给書籍视图类添加トークン认证 authentication_classes = [MYAUTH、] DEF 得る(自己、リクエスト): 応答 = { ' コード' 100、' MSG ':' 查询成功' } 書籍 = モデル。 Book.objects.all() books_ser = BookSer(例えば=書籍、多くの= 真) 応答[ ' データ' ] =books_ser.data リターンレスポンス(応答)
グローバル認証の設定は、使用します:
settings.py内の設定で
REST_FRAMEWORK = { " DEFAULT_AUTHENTICATION_CLASSES ":[ " app01.my_examine.MyAuth " 、] }
グローバル認定は、いくつかのビューが認証を設定することはできませんので、このようなレジスタ、ログインなど、明らかに現実的ではない設定値を、認定されたすべてのクラスを考慮して、設定されています
だから、ローカル認証の認証方法を無効にする必要があります:
認証コードを以下の部分図で同様の位置を追加し、部分的に完全な無効化
authentication_classes ] = [
要約:(ソースコードを分析することにより)
- あなたはsetting.pyプロジェクトでREST_FRAMEWORKを設定した場合、デフォルトの設定では、取るためにプロジェクトを開始する - デフォルトのコンフィギュレーションファイルDRFテイクに行く前に、取られていない場合 - あなたはクラスでビューを設定する場合は、にアクセスしてくださいユーザ設定が取り まとめを: 最初のビューのクラス構成を取る ----デフォルトの設定「----でプロジェクトの設定を取ります」
トークン概要:
トークンの実装プロセス:ログイン成功は、フロントエンドとフロントエンドに応じて、データとともに送信されます後にユーザーがアクセス要求を送信し、次回、サーバ側でユーザ関連し、文字列の文字列のみ(トークン)を計算するために、独自の暗号化アルゴリズムによって保存トークンは、バックエンド・データ・サーバと一緒に送信される場合、バックエンドサーバは、最初の(この場所をチェックするミドルウェアであってもよいビューであってもよい)トークンに検証され、ユーザによる検証のプロセスが再び実質的にユーザー認証ログインに代わって合意が成功した場合、もちろん、あなたがこのトークンを設定することができ、トークン数から抜け出すと一致により送信されたフロントエンドユーザートークンに保存されている今、ユーザーのトークン文字列を計算するために、関連するデータの暗号化アルゴリズムは、有効な時間です。ある程度までは、サーバー上の圧力を緩和。
アプリケーションを書かれたインターフェイスのログイントークン:
models.py
#models.pyの クラスのユーザ(models.Model): 名前 = models.CharField(MAX_LENGTH = 32 ) パスワード = models.CharField(MAX_LENGTH = 64 ) 選択肢 =((' 1 '、' Super_Admin ')、(' 2 '、' General_Admin ')、(' 3 '、' General_User ' )) USER_TYPE = models.CharField(MAX_LENGTH = 6、選択肢=選択肢は、デフォルト= ' 3 ' ) #ユーザーテーブルには、いずれかを実行に関連付けられ たクラス:トークン(models.Model) トークン = models.CharField(= 64 MAX_LENGTH ) ユーザー = models.OneToOneField(=に' ユーザー')
views.py
#のviews.py から rest_framework.responseのインポート応答 から app01.my_examine 輸入MYAUTH #がここにあなたの意見を作成します。 UUID インポートuuid4 から django.core.exceptions インポートObjectDoesNotExist クラスログイン(APIViewを): DEF ポスト(自己、リクエスト): 応答 = { ' コード' 100、' MSG ':' 登录成功' } 名 = request.data。 (取得"名前「) パスワード = request.data.get(」パスワード" ) のtry : #getメソッド、getメソッドを使用してデータのみを取ることができ、または到達複数の場合、それは例外がスローされます ユーザー= models.User.objectsを。フィルタ(名=名、パスワード= パスワード)に.get() #のここで説明する異常試し法によるキャプチャは、異常がなければ、この方法は、ユーザーオブジェクトを取得するには、Get来る、ユーザーがログインしている #成功したログインデータは、(トークンのテーブルを格納する必要がありますここ)トークンがサーバデータベースに格納されていると仮定 #ID UUIDモジュール用いてセーター生成 トークン= uuid4() #を作成しない場合は、ユーザーデータベース内に存在するが、更新された場合、トークンを #の使用update_or_create方法 models.Tokenを。 objects.update_or_create(ユーザー=ユーザー、デフォルト= {「トークン」トークン}) #は、辞書にトークンが返される レスポンス[ 「トークン」 ] = トークン #オブジェクトが存在しない場合、特定の異常、ユーザを取り込むここで取る 以外E AS ObjectDoesNotExistの: レスポンス[ ' コード' ] = 101 レスポンス[ ' MSG ' ] = ' ユーザー名またはパスワードが正しくありません" #のキャプチャ他の異常 を除くインクルード:E AS例外 レスポンス[ ' コード' ] = 102 レスポンス[ " MSG「 ] = 」不明なエラー' #は、データが返される、遠位 返す応答(レスポンス)
ルートを追加します。
URL(R ' ^ログイン/ '、views.Login.as_view())、
第二に、権限コンポーネント
利用権限及び認証コンポーネントは、実質的に同一の構成要素です。
どのように使用するには:
①まだでmy_examine.pyに、特権クラスを記述します。
from rest_framework.permissions import BasePermission # 创建认证类,BasePermission class MyPermission(BasePermission): message = '权限不足,无法查看' # 固定写一个has_permission方法用于定义具体权限内容 def has_permission(self, request, view): # #因为权限在认证之后执行的,所有能取到reuqest.user if request.user.user_type == '1': return True else: return False
局部使用:
-在视图类中写
permission_classes=[MyPermision,]
全局使用:
在settings.py中配置 REST_FRAMEWORK={ "DEFAULT_PERMISSION_CLASSES":["app01.my_examine.MyPermision",] }
局部禁用:
-在视图类中写
permission_classes = []
这里可以设置添加一个代码让返回显示中文提示:
# 在MyPermision类下面添加 message = '权限不足,无法查看'