Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在django中登录和注册用户时对多个用户进行身份验证_Python_Django_Django Rest Framework - Fatal编程技术网

Python 如何在django中登录和注册用户时对多个用户进行身份验证

Python 如何在django中登录和注册用户时对多个用户进行身份验证,python,django,django-rest-framework,Python,Django,Django Rest Framework,我正在尝试使用django rest框架构建多供应商电子商务。我一直在研究如何对多个用户进行身份验证,就像我有客户和卖家一样。我已经成功地为卖家创建了API,但我无法为用户指定角色。(基本上,我们正在构建移动应用程序和web) 我的模型是: from django.db import models from django.contrib.auth.models import User from django.db import models # Create your models here.

我正在尝试使用django rest框架构建多供应商电子商务。我一直在研究如何对多个用户进行身份验证,就像我有客户和卖家一样。我已经成功地为卖家创建了API,但我无法为用户指定角色。(基本上,我们正在构建移动应用程序和web)

我的模型是:

from django.db import models
from django.contrib.auth.models import User
from django.db import models

# Create your models here.


class SellerProfile(models.Model):
    user = models.OneToOneField(
        User, blank=True, null=True, on_delete=models.SET_DEFAULT, default=None)


    mobileNo = models.CharField(max_length=40, default=None)
    cnic = models.CharField(max_length=30, default=None)
    city = models.CharField(max_length=30, default=None)
    address = models.CharField(max_length=30, default=None)
    state = models.CharField(max_length=30, default=None)
    shop_name = models.CharField(max_length=30, default=None)

    def __str__(self):
        return self.user.username


class ClientProfile(models.Model):
    user = models.OneToOneField(User, models.SET_DEFAULT, default=None)


    def __str__(self):
        return self.user.username

和我的序列化程序:

from profiles.models import SellerProfile, ClientProfile
from rest_framework import serializers, status
# from models import *
from django.contrib.auth.models import User
from django.contrib.auth.hashers import make_password


class UserSerializer(serializers.ModelSerializer):

    password = serializers.CharField(
        write_only=True,
        required=True,
        help_text='password',
        style={'input_type': 'password', 'placeholder': 'Password'}
    )

    class Meta:
        model = User
        fields = ('username', 'first_name', 'last_name', 'email', 'password')

    def create(self, validated_data):
        user = super().create(validated_data)
        user.set_password(validated_data['password'])
        user.save()
        return user

    # def __str__(self):
    #     return self.user


class ClientSerializer(serializers.ModelSerializer):

    user = UserSerializer(required=True)

    class Meta:
        model = ClientProfile
        fields = ['user']

    def create(self, validated_data):
        user_data = validated_data.pop('user')
        user = UserSerializer.create(
            UserSerializer(), validated_data=user_data)
        buyer, created = ClientProfile.objects.update_or_create(
            user=user,
            # mobileNo=validated_data.pop('mobileNo'),
            # location=validated_data.pop('location'),
            # address=validated_data.pop('address'),

        )
        return buyer


class SellerSerializer(serializers.ModelSerializer):

    user = UserSerializer(required=True)

    class Meta:
        model = SellerProfile
        fields = ('user', 'mobileNo', 'cnic',
                  'city', 'address', 'state', 'shop_name')

    def create(self, validated_data):
        user_data = validated_data.pop('user')
        user = UserSerializer.create(
            UserSerializer(), validated_data=user_data)
        seller, created = SellerProfile.objects.update_or_create(user=user,
                                                                 mobileNo=validated_data.pop(
                                                                     'mobileNo'),
                                                                 cnic=validated_data.pop(
                                                                     'cnic'),
                                                                 city=validated_data.pop(
                                                                     'city'),
                                                                 address=validated_data.pop(
                                                                     'address'),
                                                                 shop_name=validated_data.pop(
                                                                     'shop_name'),
                                                                 )
        return seller


这是我的视图集:

from .serializers import *
from profiles.models import *
from rest_framework import viewsets
from rest_framework.response import Response
from rest_framework import status


class SellerViewSet(viewsets.ModelViewSet):
    serializer_class = SellerSerializer
    queryset = SellerProfile.objects.all()
    def get(self, format=None):

        seller = SellerProfile.objects.all()
        serializer = SellerSerializer(seller, many=True)
        return Response(serializer.data)

    def post(self, request):
        serializer = SellerSerializer(data=request.data)
        if serializer.is_valid(raise_exception=ValueError):
            serializer.create(validated_data=request.data)
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.error_messages,
                        status=status.HTTP_400_BAD_REQUEST)


class BuyerViewSet(viewsets.ModelViewSet):
    serializer_class = ClientSerializer
    queryset = ClientProfile.objects.all()
    def get(self, format=None):

        seller = ClientProfile.objects.all()
        serializer = UserSerializer(seller, many=True)
        return Response(serializer.data)

    def post(self, request):
        serializer = ClientSerializer(data=request.data)
        if serializer.is_valid(raise_exception=ValueError):
            serializer.create(validated_data=request.data)
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.error_messages,
                        status=status.HTTP_400_BAD_REQUEST)


以下是web注册的视图:

def registration(request):
    if request.method == 'POST':
        form = UserForm(request.POST)
        sellerFrom = SellerFrom(request.POST)
        if form.is_valid() and sellerFrom.is_valid():
            user = form.save()
            seller = sellerFrom.save()
            seller.user = user
            seller.save()
            username = form.cleaned_data.get('username')
            password = form.cleaned_data.get('password1')
            # user = authentication(username=username, password=password)
            # login(request, user)
            messages.success(request, 'account was created for' + username)
            form = UserForm()
            sellerFrom = SellerFrom()
            return redirect('login')
    else:
        form = UserForm()
        sellerFrom = SellerFrom()

    context = {'form': form, 'sellerForm': sellerFrom}
    return render(request, 'gui/signup.html', context)

以下是登录视图:


def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        user = authenticate(request, username=username, password=password)
        if user is not None:
            # if user.role == "seller_profile":
            auth_login(request, user)
            return redirect('home')
        else:
            messages.info(request, 'Username or password is incorrect')
    context = {}
    return render(request, 'gui/login.html', context)

现在,上面的编码正在做什么。实际上,它处理用户注册和登录,但我想给他们一个角色,比如seller=seller\u角色和client=client\u角色。还想知道如何在用户登录时对其进行身份验证,无论用户是卖家还是客户。
我正在寻找答案,非常感谢,很抱歉我的英语不好

您可以使用
将您的用户划分为
卖家
客户
类型。您还可以添加特定组的权限,以控制一组用户的权限
groups
是django
django.contrib.auth.models
用户
模型提供的字段。请查看本文。。。我一直在用它