首页 > 解决方案 > 如何将 Django 的身份验证模型与自定义 REACT 前端注册集成

问题描述

所以,这个问题可能太抽象了,但我觉得有必要在这里拍摄。我被教导使用的 Django 完全不符合惯例,他们不使用 Django 的默认身份验证模型/视图。我将在下面向您展示我过去 SignUpView 的示例:

from .models import Customer


class SignUpView(View):
    def post(self, request):
        data = json.loads(request.body)

        try:
            validate_email(data['email'])
            if len(data['password']) < 6:
                return JsonResponse({'message': '6자리 이상 입력하세요'}, status=400)
            if not Customer.objects.filter(email = data['email']).exists():
                hashed_password = bcrypt.hashpw(data['password'].encode('utf-8'), bcrypt.gensalt()).decode('utf-8')
                Customer.objects.create(
                        email = data['email'],
                        password = hashed_password,
                        username = data['username'],
                        phone = data['phone']
                )
                return JsonResponse({'message':'SUCCESS'}, status=200)
            else:
                return JsonResponse({'message':'ALREADY_EXIST'}, status=400)
        except KeyError:
            return JsonResponse({'message':'INVALID_KEYS'}, status=400)
        except ValidationError:
            return JsonResponse({'message':'INVALID_EMAIL'}, status=400)

然而,有一天我被要求创建超级用户功能和自定义权限功能,从而迫使我放弃我被教导制作注册视图的方式。以下是我今天创建的内容,以及一些博客文章

from django.shortcuts               import render
from django.contrib.auth.models     import User
from django.contrib.auth.models     import Permission
from django.contrib.auth.forms      import UserCreationForm
from django.views                   import View
from django.contrib.auth            import login
from django.contrib.auth.decorators import login_required

@login_required
def index(request):
    return render(request,'accounts/index.html')

class SignUpView(View)
    def post(request):
        context = {}
        form = UserCreationForm(request.POST or None)
        if request.method == "POST":
            if form.is_valid():
                user = form.save()
                login(request,user)
                return render(request,'accounts/index.html')
        context['form']=form
        return render(request,'registration/sign_up.html',context)

我刚刚创建的代码不起作用,因为我没有使用 Django 模板,而是我的前端队友正在创建表单,就像以前一样。因此,我将使用如下代码接收潜在用户的注册表单:

data = json.loads(request.body)
email = data['email']
password = bcrypt.hashpw(data['password'].encode('utf-8'), bcrypt.gensalt()).decode('utf-8')
username = data['username']
phone = data['phone']

有什么方法可以像我刚才演示的那样将 Django 的 Auth 功能与自定义注册表单集成在一起?提前非常感谢!

标签: pythondjango

解决方案


我不会问为什么你被教导不要使用 Django 的身份验证系统,和/或为什么你在 Django 已经使用 Bcrypt 密码散列的情况下使用它,而且可能比你更安全,但是.. .

如果你已经有

form = UserCreationForm(request.POST or None)

data = json.loads(request.body)
email = data['email']
password = 
username = data['username']
phone = data['phone']

那么合成就很简单了

data = json.loads(request.body)
form = UserCreationForm(data={
  'email': data['email'],
  'password': data['password'],
  'username': data['username'],
  'phone': data['phone'],
})

并继续这样做,但我建议查看例如Django REST 框架,以使这些 API 视图更易于使用。


推荐阅读