• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

JWT-配置与使用

python 搞java代码 3年前 (2022-05-21) 25次浏览 已收录 0个评论
文章目录[隐藏]

1.jwt的安装配置 .

1.1安装JWT

pip install djangorestframework-<a href="https://www.gaodaima.com/tag/jwt" title="查看更多关于jwt的文章" target="_blank">jwt</a>==1.11.0

www#gaodaima.com来源gao*daima.com搞@代#码网搞代码

1.2 settings.py配置jwt载荷中的有效期设置

<span>#</span><span> jwt载荷中的有效期设置</span>
JWT_AUTH =<span> {
    </span><span>#</span><span> 1.<a href="https://www.gaodaima.com/tag/token" title="查看更多关于token的文章" target="_blank">token</a>前缀:headers中 Authorization 值的前缀</span>
    <span>"</span><span>JWT_AUTH_HEADER_PREFIX</span><span>"</span>: <span>"</span><span>JWT</span><span>"</span><span>,
    </span><span>#</span><span> 2.token有效期:一天有效</span>
    <span>"</span><span>JWT_EXPIRATION_DELTA</span><span>"</span>: datetime.timedelta(days=1<span>),
    </span><span>#</span><span> 3.刷新token:允许使用旧的token换新token,接口对接需要设置为true</span>
    <span>"</span><span>JWT_ALLOW_REFRESH</span><span>"</span><span>: True,
    </span><span>#</span><span> 4.token有效期:token在24小时内过期, 可续期token</span>
    <span>"</span><span>JWT_REFRESH_EXPIRATION_DELTA</span><span>"</span>: datetime.timedelta(hours=24<span>),
    </span><span>#</span><span> 5.自定义JWT载荷信息:自定义返回格式,需要手工创建</span>
    <span>"</span><span>JWT_RESPONSE_PAYLOAD_HANDLER</span><span>"</span>: <span>"</span><span>user.utils.jwt_response_payload_handler</span><span>"</span><span>,
}</span>

1.3 settings.py JWT结合DRF进行认证权限配置

<span>"""</span><span>
Django settings for opwf project.

Generated by "django-admin startproject" using Django 2.0.13.

For more information on this file, see
https://docs.djangoproject.com/en/2.0/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/2.0/ref/settings/
</span><span>"""</span>
<span>import</span><span> datetime
</span><span>import</span><span> os, sys

</span><span>#</span><span> Build paths inside the project like this: os.path.join(BASE_DIR, ...)</span>
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(<span>__file__</span><span>)))
sys.path.insert(0, os.path.join(BASE_DIR, </span><span>"</span><span>apps</span><span>"</span><span>))

</span><span>#</span><span> Quick-start development settings - unsuitable for production</span><span>
#</span><span> See https://docs.djangoproject.com/en/2.0/howto/deployment/checklist/</span>

<span>#</span><span> SECURITY WARNING: keep the secret key used in production secret!</span>
SECRET_KEY = <span>"</span><span>uorj1ni^mnut@wo@c%)iv)%5=8dxlml4-j0!f3b%4#f*8a5)3t</span><span>"</span>

<span>#</span><span> SECURITY WARNING: don"t run with debug turned on in production!</span>
DEBUG =<span> True

ALLOWED_HOSTS </span>= [<span>"</span><span>*</span><span>"</span><span>]

</span><span>#</span><span> Application definition</span>
<span>
INSTALLED_APPS </span>=<span> [
    </span><span>"</span><span>django.contrib.admin</span><span>"</span><span>,
    </span><span>"</span><span>django.contrib.auth</span><span>"</span><span>,
    </span><span>"</span><span>django.contrib.contenttypes</span><span>"</span><span>,
    </span><span>"</span><span>django.contrib.sessions</span><span>"</span><span>,
    </span><span>"</span><span>django.contrib.messages</span><span>"</span><span>,
    </span><span>"</span><span>django.contrib.staticfiles</span><span>"</span><span>,
    </span><span>"</span><span>rest_framework</span><span>"</span><span>,
    </span><span>"</span><span>corsheaders</span><span>"</span><span>,

    </span><span>"</span><span>user.apps.UserConfig</span><span>"</span><span>,
    </span><span>"</span><span>workflow.apps.WorkflowConfig</span><span>"</span><span>,
    </span><span>"</span><span>workerorder.apps.WorkerorderConfig</span><span>"</span><span>,
    </span><span>#</span><span> "jwt",</span>
    <span>#</span><span> "rest_framework_jwt",</span>
    <span>#</span><span> "rest_framework.authentication"</span>
<span>
]

MIDDLEWARE </span>=<span> [
    </span><span>"</span><span>django.middleware.security.SecurityMiddleware</span><span>"</span><span>,
    </span><span>"</span><span>django.contrib.sessions.middleware.SessionMiddleware</span><span>"</span><span>,
    </span><span>"</span><span>django.middleware.common.CommonMiddleware</span><span>"</span><span>,
    </span><span>"</span><span>corsheaders.middleware.CorsMiddleware</span><span>"</span><span>,
    </span><span>#</span><span> "django.middleware.csrf.CsrfViewMiddleware",</span>
    <span>"</span><span>django.contrib.auth.middleware.AuthenticationMiddleware</span><span>"</span><span>,
    </span><span>"</span><span>django.contrib.messages.middleware.MessageMiddleware</span><span>"</span><span>,
    </span><span>"</span><span>django.middleware.clickjacking.XFrameOptionsMiddleware</span><span>"</span><span>,
]

ROOT_URLCONF </span>= <span>"</span><span>opwf.urls</span><span>"</span><span>
CORS_ORIGIN_ALLOW_ALL </span>=<span> True

CORS_ORIGIN_WHITELIST </span>=<span> (
    </span><span>"</span><span>http://127.0.0.1:8080</span><span>"</span><span>,
    </span><span>"</span><span>http://localhost:8080</span><span>"</span><span>,
)
CORS_ALLOW_CREDENTIALS </span>=<span> True

TEMPLATES </span>=<span> [
    {
        </span><span>"</span><span>BACKEND</span><span>"</span>: <span>"</span><span>django.template.backends.django.DjangoTemplates</span><span>"</span><span>,
        </span><span>"</span><span>DIRS</span><span>"</span><span>: [],
        </span><span>"</span><span>APP_DIRS</span><span>"</span><span>: True,
        </span><span>"</span><span>OPTIONS</span><span>"</span><span>: {
            </span><span>"</span><span>context_processors</span><span>"</span><span>: [
                </span><span>"</span><span>django.template.context_processors.debug</span><span>"</span><span>,
                </span><span>"</span><span>django.template.context_processors.request</span><span>"</span><span>,
                </span><span>"</span><span>django.contrib.auth.context_processors.auth</span><span>"</span><span>,
                </span><span>"</span><span>django.contrib.messages.context_processors.messages</span><span>"</span><span>,
            ],
        },
    },
]

WSGI_APPLICATION </span>= <span>"</span><span>opwf.wsgi.application</span><span>"</span>

<span>#</span><span> Database</span><span>
#</span><span> https://docs.djangoproject.com/en/2.0/ref/settings/#databases</span>
<span>
DATABASES </span>=<span> {
    </span><span>"</span><span>default</span><span>"</span><span>: {
        </span><span>"</span><span>ENGINE</span><span>"</span>: <span>"</span><span>django.db.backends.mysql</span><span>"</span><span>,
        </span><span>"</span><span>NAME</span><span>"</span>: <span>"</span><span>opwf_db</span><span>"</span><span>,
        </span><span>"</span><span>USER</span><span>"</span>: <span>"</span><span>root</span><span>"</span><span>,
        </span><span>"</span><span>PASSWORD</span><span>"</span>: <span>"</span><span>1</span><span>"</span><span>,
        </span><span>"</span><span>HOST</span><span>"</span>: <span>"</span><span>127.0.0.1</span><span>"</span><span>,
        </span><span>"</span><span>PORT</span><span>"</span>: <span>"</span><span>3306</span><span>"</span><span>
    }
}

</span><span>#</span><span> Password validation</span><span>
#</span><span> https://docs.djangoproject.com/en/2.0/ref/settings/#auth-password-validators</span>
<span>
REST_FRAMEWORK </span>=<span> {
    </span><span>#</span><span> 文档报错: AttributeError: ‘AutoSchema’ object has no attribute ‘get_link’</span>
    <span>#</span><span> 用下面的设置可以解决</span>
    <span>"</span><span>DEFAULT_SCHEMA_CLASS</span><span>"</span>: <span>"</span><span>rest_framework.schemas.AutoSchema</span><span>"</span><span>,
    </span><span>#</span><span> 默认设置是:</span>
    <span>#</span><span> "DEFAULT_SCHEMA_CLASS": "rest_framework.schemas.openapi.AutoSchema",</span>

    <span>#</span><span> 异常处理器</span>
    <span>#</span><span> "EXCEPTION_HANDLER": "user.utils.exception_handler",</span>

    <span>#</span><span> Base API policies      默认渲染器类</span>
    <span>"</span><span>DEFAULT_RENDERER_CLASSES</span><span>"</span><span>: [
        </span><span>"</span><span>rest_framework.renderers.JSONRenderer</span><span>"</span><span>,
        </span><span>"</span><span>rest_framework.renderers.BrowsableAPIRenderer</span><span>"</span><span>,
    ],
    </span><span>#</span><span> 默认解析器类</span>
    <span>"</span><span>DEFAULT_PARSER_CLASSES</span><span>"</span><span>: [
        </span><span>"</span><span>rest_framework.parsers.JSONParser</span><span>"</span><span>,
        </span><span>"</span><span>rest_framework.parsers.FormParser</span><span>"</span><span>,
        </span><span>"</span><span>rest_framework.parsers.MultiPartParser</span><span>"</span><span>
    ],
    </span><span>#</span><span> 1.认证器(全局)</span>
    <span>"</span><span>DEFAULT_AUTHENTICATION_CLASSES</span><span>"</span><span>: [
        </span><span>"</span><span>rest_framework_jwt.authentication.JSONWebTokenAuthentication</span><span>"</span>,  <span>#</span><span> 在 DRF中配置JWT认证</span>
        <span>#</span><span> "rest_framework.authentication.SessionAuthentication",  # 使用session时的认证器</span>
        <span>#</span><span> "rest_framework.authentication.BasicAuthentication"  # 提交表单时的认证器</span>
<span>    ],

    </span><span>#</span><span> 2.权限配置(全局): 顺序靠上的严格</span>
    <span>"</span><span>DEFAULT_PERMISSION_CLASSES</span><span>"</span><span>: [
        </span><span>#</span><span> "rest_framework.permissions.IsAdminUser",  # 管理员可以访问</span>
        <span>#</span><span> "rest_framework.permissions.IsAuthenticated",  # 认证用户可以访问</span>
        <span>#</span><span> "rest_framework.permissions.IsAuthenticatedOrReadOnly",  # 认证用户可以访问, 否则只能读取</span>
        <span>#</span><span> "rest_framework.permissions.AllowAny",  # 所有用户都可以访问</span>
        <span>#</span><span> "user.utils.VipPermission",  #自定义权限</span>
<span>    ],
    </span><span>#</span><span> 3.限流(防爬虫)</span>
    <span>"</span><span>DEFAULT_THROTTLE_CLASSES</span><span>"</span><span>: [
        </span><span>"</span><span>rest_framework.throttling.AnonRateThrottle</span><span>"</span><span>,
        </span><span>"</span><span>rest_framework.throttling.UserRateThrottle</span><span>"</span><span>,
    ],
    </span><span>#</span><span> 3.1限流策略</span>
    <span>#</span><span> "DEFAULT_THROTTLE_RATES": {</span>
    <span>#</span><span>     "user": "100/hour",  # 认证用户每小时100次</span>
    <span>#</span><span>     "anon": "300/day",  # 未认证用户每天能访问3次</span>
    <span>#</span><span> },</span>

    <span>"</span><span>DEFAULT_CONTENT_NEGOTIATION_CLASS</span><span>"</span>: <span>"</span><span>rest_framework.negotiation.DefaultContentNegotiation</span><span>"</span><span>,
    </span><span>"</span><span>DEFAULT_METADATA_CLASS</span><span>"</span>: <span>"</span><span>rest_framework.metadata.SimpleMetadata</span><span>"</span><span>,
    </span><span>"</span><span>DEFAULT_VERSIONING_CLASS</span><span>"</span><span>: None,

    </span><span>#</span><span> 4.分页(全局):全局分页器, 例如 省市区的数据自定义分页器, 不需要分页</span>
    <span>#</span><span> "DEFAULT_PAGINATION_CLASS": "rest_framework.pagination.PageNumberPagination",</span>
    <span>#</span><span> # 每页返回数量</span>
    <span>#</span><span> "PAGE_SIZE": 3,</span>
    <span>#</span><span> 5.过滤器后端</span>
    <span>"</span><span>DEFAULT_FILTER_BACKENDS</span><span>"</span><span>: [
        </span><span>"</span><span>django_filters.rest_framework.DjangoFilterBackend</span><span>"</span><span>,
        </span><span>#</span><span> "django_filters.rest_framework.backends.DjangoFilterBackend", 包路径有变化</span>
<span>    ],

    </span><span>#</span><span> 5.1过滤排序(全局):Filtering 过滤排序</span>
    <span>"</span><span>SEARCH_PARAM</span><span>"</span>: <span>"</span><span>search</span><span>"</span><span>,
    </span><span>"</span><span>ORDERING_PARAM</span><span>"</span>: <span>"</span><span>ordering</span><span>"</span><span>,

    </span><span>"</span><span>NUM_PROXIES</span><span>"</span><span>: None,

    </span><span>#</span><span> 6.版本控制:Versioning  接口版本控制</span>
    <span>"</span><span>DEFAULT_VERSION</span><span>"</span><span>: None,
    </span><span>"</span><span>ALLOWED_VERSIONS</span><span>"</span><span>: None,
    </span><span>"</span><span>VERSION_PARAM</span><span>"</span>: <span>"</span><span>version</span><span>"</span><span>,

    </span><span>#</span><span> Authentication  认证</span>
    <span>#</span><span> 未认证用户使用的用户类型</span>
    <span>"</span><span>UNAUTHENTICATED_USER</span><span>"</span>: <span>"</span><span>django.contrib.auth.models.AnonymousUser</span><span>"</span><span>,
    </span><span>#</span><span> 未认证用户使用的Token值</span>
    <span>"</span><span>UNAUTHENTICATED_TOKEN</span><span>"</span><span>: None,

    </span><span>#</span><span> View configuration</span>
    <span>"</span><span>VIEW_NAME_FUNCTION</span><span>"</span>: <span>"</span><span>rest_framework.views.get_view_name</span><span>"</span><span>,
    </span><span>"</span><span>VIEW_DESCRIPTION_FUNCTION</span><span>"</span>: <span>"</span><span>rest_framework.views.get_view_description</span><span>"</span><span>,

    </span><span>"</span><span>NON_FIELD_ERRORS_KEY</span><span>"</span>: <span>"</span><span>non_field_errors</span><span>"</span><span>,

    </span><span>#</span><span> Testing</span>
    <span>"</span><span>TEST_REQUEST_RENDERER_CLASSES</span><span>"</span><span>: [
        </span><span>"</span><span>rest_framework.renderers.MultiPartRenderer</span><span>"</span><span>,
        </span><span>"</span><span>rest_framework.renderers.JSONRenderer</span><span>"</span><span>
    ],
    </span><span>"</span><span>TEST_REQUEST_DEFAULT_FORMAT</span><span>"</span>: <span>"</span><span>multipart</span><span>"</span><span>,

    </span><span>#</span><span> Hyperlink settings</span>
    <span>"</span><span>URL_FORMAT_OVERRIDE</span><span>"</span>: <span>"</span><span>format</span><span>"</span><span>,
    </span><span>"</span><span>FORMAT_SUFFIX_KWARG</span><span>"</span>: <span>"</span><span>format</span><span>"</span><span>,
    </span><span>"</span><span>URL_FIELD_NAME</span><span>"</span>: <span>"</span><span>url</span><span>"</span><span>,

    </span><span>#</span><span> Encoding</span>
    <span>"</span><span>UNICODE_JSON</span><span>"</span><span>: True,
    </span><span>"</span><span>COMPACT_JSON</span><span>"</span><span>: True,
    </span><span>"</span><span>STRICT_JSON</span><span>"</span><span>: True,
    </span><span>"</span><span>COERCE_DECIMAL_TO_STRING</span><span>"</span><span>: True,
    </span><span>"</span><span>UPLOADED_FILES_USE_URL</span><span>"</span><span>: True,

    </span><span>#</span><span> Browseable API</span>
    <span>"</span><span>HTML_SELECT_CUTOFF</span><span>"</span>: 1000<span>,
    </span><span>"</span><span>HTML_SELECT_CUTOFF_TEXT</span><span>"</span>: <span>"</span><span>More than {count} items...</span><span>"</span><span>,

    </span><span>#</span><span> Schemas</span>
    <span>"</span><span>SCHEMA_COERCE_PATH_PK</span><span>"</span><span>: True,
    </span><span>"</span><span>SCHEMA_COERCE_METHOD_NAMES</span><span>"</span><span>: {
        </span><span>"</span><span>retrieve</span><span>"</span>: <span>"</span><span>read</span><span>"</span><span>,
        </span><span>"</span><span>destroy</span><span>"</span>: <span>"</span><span>delete</span><span>"</span><span>
    },

    </span><span>#</span><span> "Access-Control-Allow-Origin":"http://localhost:8080",</span>
    <span>#</span><span> "Access-Control-Allow-Credentials": True</span>
<span>
}

AUTH_PASSWORD_VALIDATORS </span>=<span> [
    {
        </span><span>"</span><span>NAME</span><span>"</span>: <span>"</span><span>django.contrib.auth.password_validation.UserAttributeSimilarityValidator</span><span>"</span><span>,
    },
    {
        </span><span>"</span><span>NAME</span><span>"</span>: <span>"</span><span>django.contrib.auth.password_validation.MinimumLengthValidator</span><span>"</span><span>,
    },
    {
        </span><span>"</span><span>NAME</span><span>"</span>: <span>"</span><span>django.contrib.auth.password_validation.CommonPasswordValidator</span><span>"</span><span>,
    },
    {
        </span><span>"</span><span>NAME</span><span>"</span>: <span>"</span><span>django.contrib.auth.password_validation.NumericPasswordValidator</span><span>"</span><span>,
    },
]

</span><span>#</span><span> Internationalization</span><span>
#</span><span> https://docs.djangoproject.com/en/2.0/topics/i18n/</span>
<span>
LANGUAGE_CODE </span>= <span>"</span><span>zh-hans</span><span>"</span><span>

TIME_ZONE </span>= <span>"</span><span>Asia/Shanghai</span><span>"</span><span>

USE_I18N </span>=<span> True

USE_L10N </span>=<span> True

USE_TZ </span>=<span> False

</span><span>#</span><span> Static files (CSS, JavaScript, Images)</span><span>
#</span><span> https://docs.djangoproject.com/en/2.0/howto/static-files/</span>
<span>
STATIC_URL </span>= <span>"</span><span>/static/</span><span>"</span><span>
AUTH_USER_MODEL </span>= <span>"</span><span>user.User</span><span>"</span>

<span>#</span><span> jwt载荷中的有效期设置</span>
JWT_AUTH =<span> {
    </span><span>#</span><span> 1.token前缀:headers中 Authorization 值的前缀</span>
    <span>"</span><span>JWT_AUTH_HEADER_PREFIX</span><span>"</span>: <span>"</span><span>JWT</span><span>"</span><span>,
    </span><span>#</span><span> 2.token有效期:一天有效</span>
    <span>"</span><span>JWT_EXPIRATION_DELTA</span><span>"</span>: datetime.timedelta(days=1<span>),
    </span><span>#</span><span> 3.刷新token:允许使用旧的token换新token</span>
    <span>"</span><span>JWT_ALLOW_REFRESH</span><span>"</span><span>: True,
    </span><span>#</span><span> 4.token有效期:token在24小时内过期, 可续期token</span>
    <span>"</span><span>JWT_REFRESH_EXPIRATION_DELTA</span><span>"</span>: datetime.timedelta(hours=24<span>),
    </span><span>#</span><span> 5.自定义JWT载荷信息:自定义返回格式,需要手工创建</span>
    <span>"</span><span>JWT_RESPONSE_PAYLOAD_HANDLER</span><span>"</span>: <span>"</span><span>user.utils.jwt_response_payload_handler</span><span>"</span><span>,
}</span>

settings.py

1.4 user/urls.py 增加获取token接口和刷新token接口

<span>from</span> django.urls <span>import</span><span> include, path
</span><span>from</span> rest_framework.authtoken.views <span>import</span><span> obtain_auth_token

</span><span>from</span> user <span>import</span><span> views
</span><span>from</span> rest_framework.routers <span>import</span><span> SimpleRouter, DefaultRouter
</span><span>from</span> rest_framework_jwt.views <span>import</span><span> obtain_jwt_token, refresh_jwt_token

</span><span>#</span><span> 自动生成路由方法, 必须使用视图集</span><span>
#</span><span> router = SimpleRouter()  # 没有根路由  /user/ 无法识别</span>
router = DefaultRouter()   <span>#</span><span> 有根路由</span>
router.register(r<span>"</span><span>user</span><span>"</span><span>, views.UserViewSet)

urlpatterns </span>=<span> [
    path(</span><span>"</span><span>index/</span><span>"</span>, views.index),          <span>#</span><span> 函数视图</span>
    path(<span>"</span><span>login/</span><span>"</span>, obtain_jwt_token),     <span>#</span><span> 获取token,登录视图</span>
    path(<span>"</span><span>register/</span><span>"</span>,views.Register.as_view()), <span>#</span><span>注册用户</span>
    path(<span>"</span><span>refresh/</span><span>"</span>, refresh_jwt_token),  <span>#</span><span> 刷新token</span>
    path(<span>"</span><span>api-auth/</span><span>"</span>, include(<span>"</span><span>rest_framework.urls</span><span>"</span>, namespace=<span>"</span><span>rest_framework</span><span>"</span>)),  <span>#</span><span> 认证地址</span>
<span>]

urlpatterns </span>+= router.urls  <span>#</span><span> 模块地址</span><span>
#</span><span> print(router.urls)</span>

<span>#</span><span> obtain_jwt_token = ObtainJSONWebToken.as_view()      # 获取token</span><span>
#</span><span> refresh_jwt_token = RefreshJSONWebToken.as_view()    # 刷新token</span><span>
#</span><span> verify_jwt_token = VerifyJSONWebToken.as_view()      # 修改token</span>

1.5 user/utils.py 从写jwt_response_payload_handler

<span>def</span> jwt_response_payload_handler(token, user=None, request=None, role=<span>None):
    </span><span>"""</span><span>
    自定义jwt认证成功返回数据
    :token  返回的jwt
    :user   当前登录的用户信息[对象]
    :request 当前本次客户端提交过来的数据
    :role 角色
    </span><span>"""</span>
    <span>if</span><span> user.first_name:
        name </span>=<span> user.first_name
    </span><span>else</span><span>:
        name </span>=<span> user.username
    </span><span>return</span><span> {
        </span><span>"</span><span>authenticated</span><span>"</span>: <span>"</span><span>true</span><span>"</span><span>,
        </span><span>"</span><span>id</span><span>"</span><span>: user.id,
        </span><span>"</span><span>role</span><span>"</span><span>: role,
        </span><span>"</span><span>name</span><span>"</span><span>: name,
        </span><span>"</span><span>username</span><span>"</span><span>: user.username,
        </span><span>"</span><span>email</span><span>"</span><span>: user.email,
        </span><span>"</span><span>token</span><span>"</span><span>: token,
    }</span>

1.6 user/utils.py 生成token

<span>#</span><span>生成jwt_token</span>
<span>def</span> create_token(user):  <span>#</span><span>user:接收的用户对象</span>
    jwt_payload_handler =<span> api_settings.JWT_PAYLOAD_HANDLER
    jwt_encode_handler </span>=<span> api_settings.JWT_ENCODE_HANDLER
    payload </span>=<span> jwt_payload_handler(user)
    token </span>=<span> jwt_encode_handler(payload)
    </span><span>return</span> token

2.代码实践 .

<span>from</span> django.db <span>import</span><span> models

</span><span>#</span><span> Create your models here.</span>

<span>from</span> django.contrib.auth.models <span>import</span><span> AbstractUser


</span><span>class</span><span> Vip(models.Model):
    vip_choices </span>=<span> (
        (</span><span>"</span><span>1</span><span>"</span>,<span>"</span><span>普通会员</span><span>"</span><span>),
        (</span><span>"</span><span>2</span><span>"</span>,<span>"</span><span>高级会员</span><span>"</span><span>)
    )
    vip_name </span>= models.CharField(verbose_name=<span>"</span><span>vip名称</span><span>"</span>,max_length=20<span>)
    vip_type </span>= models.CharField(verbose_name=<span>"</span><span>vip种类</span><span>"</span>,max_length=20,choices=<span>vip_choices)
    desc </span>= models.CharField(verbose_name=<span>"</span><span>vip描述</span><span>"</span>,max_length=255<span>)

    </span><span>class</span><span> Meta:
        db_table </span>= <span>"</span><span>tb_vip</span><span>"</span><span>
        verbose_name </span>= <span>"</span><span>Vip表</span><span>"</span>



<span>class</span><span> User(AbstractUser):
    nike_name </span>= models.CharField(verbose_name=<span>"</span><span>昵称</span><span>"</span>,max_length=30,null=<span>True)
    phone </span>= models.CharField(verbose_name=<span>"</span><span>手机号</span><span>"</span>,max_length=30,null=<span>True)
    email </span>= models.CharField(verbose_name=<span>"</span><span>邮箱</span><span>"</span>,max_length=255,null=<span>True)
    address </span>= models.CharField(verbose_name=<span>"</span><span>地址</span><span>"</span>,max_length=255,null=<span>True)
    vip </span>= models.ForeignKey(Vip,on_delete=models.CASCADE,null=True,default=<span>None)

    </span><span>class</span><span> Meta:
        db_table </span>= <span>"</span><span>tb_user</span><span>"</span><span>
        verbose_name </span>= <span>"</span><span>用户表</span><span>"</span>

user/models.py

<span>from</span> django.urls <span>import</span><span> path
</span><span>from</span> . <span>import</span><span> views

</span><span>from</span> rest_framework_jwt.views <span>import</span><span> obtain_jwt_token
urlpatterns </span>=<span> [

    path(</span><span>"</span><span>register/</span><span>"</span>,views.Register.as_view()),     <span>#</span><span>注册</span>
    path(<span>"</span><span>login/</span><span>"</span>,obtain_jwt_token),                   <span>#</span><span>登录</span>
    path(<span>"</span><span>test/</span><span>"</span>,views.Test.as_view()),               <span>#</span><span>测试权限用的</span>
<span>
]</span>

user/urls.py

<span>from</span> django.shortcuts <span>import</span><span> render

</span><span>#</span><span> Create your views here.</span>

<span>from</span> rest_framework.views <span>import</span><span> APIView,Response
</span><span>from</span> .serializers <span>import</span> *
<span>from</span> .models <span>import</span> *
<span>from</span> user.utils <span>import</span><span> create_token
</span><span>from</span> rest_framework.permissions <span>import</span><span> IsAuthenticated,IsAdminUser,AllowAny
</span><span>from</span> user.utils <span>import</span><span> VipPermission


</span><span>class</span><span> Register(APIView):

    </span><span>def</span><span> post(self,requset):
        </span><span>print</span><span>(requset.data)
        username </span>= requset.data.get(<span>"</span><span>username</span><span>"</span><span>)
        password </span>= requset.data.get(<span>"</span><span>password</span><span>"</span><span>)
        phone </span>= requset.data.get(<span>"</span><span>phone</span><span>"</span><span>)
        email </span>= requset.data.get(<span>"</span><span>email</span><span>"</span><span>)
        address </span>= requset.data.get(<span>"</span><span>address</span><span>"</span><span>)

        </span><span>if</span> <span>not</span><span> all([username,password,phone,email,address]):
            </span><span>return</span> Response({<span>"</span><span>msg</span><span>"</span>:<span>"</span><span>数据不完整</span><span>"</span>,<span>"</span><span>code</span><span>"</span>:400<span>})

        </span><span>#</span><span>create添加</span>
        <span>#</span><span> user_obj = User.objects.create(username=username,password=make_password(password),</span>
        <span>#</span><span>                                phone=phone,email=email,address=address)</span>
        <span>#
</span>        <span>#</span><span> token = create_token(user_obj)</span>
        <span>#
</span>        <span>#</span><span> data = {</span>
        <span>#</span><span>     "id":user_obj.pk,</span>
        <span>#</span><span>     "username":user_obj.username,</span>
        <span>#</span><span>     "phone":user_obj.phone,</span>
        <span>#</span><span>     "email":user_obj.email,</span>
        <span>#</span><span>     "address":user_obj.address,</span>
        <span>#</span><span>     "token":token</span>
        <span>#</span><span> }</span>

        <span>#</span><span>序列化添加</span>
        user_serializer = UserSerializers(data=<span>requset.data)
        user_serializer.is_valid()
        user_serializer.save()

        </span><span>return</span> Response({<span>"</span><span>msg</span><span>"</span>:<span>"</span><span>注册成功</span><span>"</span>,<span>"</span><span>code</span><span>"</span>:200,<span>"</span><span>data</span><span>"</span><span>:user_serializer.data})



</span><span>class</span><span> Test(APIView):

    </span><span>#</span><span> permission_classes = (IsAuthenticated,)   #只有认证用户可以访问</span>
    <span>#</span><span> permission_classes = (IsAdminUser,)       #只有管理员用户可以访问</span>
    <span></span>



搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:JWT-配置与使用
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址