个人技术分享

注册token应用

修改settings.py:

INSTALLED_APPS = [
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
    "todo",
    "rest_framework",
    "rest_framework.authtoken",
]

接着迁移模型:

python manage.py migrate

配置DRF

修改settings.py:

REST_FRAMEWORK = {
    "DEFAULT_AUTHENTICATION_CLASSES": [
        "rest_framework.authentication.TokenAuthentication",
    ]
}

创建应用

这里不能叫auth,否则会重名,会抛异常。

python manage.py startapp mauth

注册应用:

INSTALLED_APPS = [
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
    "mauth",
    "todo",
    "rest_framework",
    "rest_framework.authtoken",
]

实现用户注册的视图函数

完整代码:

from django.shortcuts import render
import logging

from django.contrib.auth.models import User
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from rest_framework.authtoken.models import Token
from rest_framework.parsers import JSONParser


@csrf_exempt
def register(request):
    if request.method != "POST":
        logging.warning(f"暂不支持此方法:{request.method}")
        return

    try:
        data = JSONParser().parse(request)
        user = User.objects.create_user(username=data["username"], password=data["password"])
        user.save()
        token = Token.objects.create(user=user)
        return JsonResponse({"token": str(token)}, status=200)
    except Exception as e:
        logging.error(e)
        return JsonResponse({"error": "注册用户失败"}, status=400)

注册路由

总路由:

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path("admin/", admin.site.urls),
    path("api/todo/", include("todo.urls")),
    path("api/auth/", include("mauth.urls")),
]

子路由:

from django.urls import path
from . import views

app_name = "mauth"
urlpatterns = [
    path("register/", views.register, name="register"),
]

接口测试

注意,这里充分体现了Django开发最不方便的地方,因为我们没有继承默认的DRF类,所以这个接口不支持通过网页测试了。

所以,这里我们使用Postman进行测试。

POST:http://localhost:8000/api/auth/register/

截图如下:
在这里插入图片描述

注册成功以后,会返回一个token。