【问题标题】:Serve Django views with React?用 React 服务 Django 视图?
【发布时间】:2021-09-24 21:57:01
【问题描述】:

我正在制作一个 web 应用程序,其中 react 作为前端,django-rest-framework 作为后端。

对于 django,我正在关注一个教程。 https://www.techwithtim.net/tutorials/django/user-registration/ - 在这里,他们用 django 制作了一个经过适当验证的注册表。

有没有办法对 React 做同样的事情?本质上,有没有办法用 React 显示 Django 模板和视图?如果没有,我应该只链接到 Django 服务器上托管的特定 Django 页面吗?

请帮忙。谢谢!

【问题讨论】:

  • 你检查过了吗,Django Forms with ReactJS 似乎对你有帮助。
  • 好的!但这给出了呈现表单的字段。我想在我的表单中使用 django 内置验证。
  • @sagar_v_p 因为如果发生验证错误,比如密码很常见,怎么会知道它?
  • React 会在表单发送到您的 API 端点后知道。但是,如果您希望在发送表单之前进行验证,那么您需要公开另一个接收密码的 API 端点,并让 Django 在序列化程序或视图中运行其密码验证。在这两种情况下,您都需要编写 API 序列化程序、视图并配置 URL 端点。
  • 好的!那么我该如何告诉 django 进行验证呢?

标签: javascript python reactjs django


【解决方案1】:

首先,您必须像这样为您的登录和注册视图创建序列化程序

from rest_framework import serializers
from django.contrib.auth.models import User
from django.contrib.auth import authenticate

# Register Serializer
class RegisterSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('id', 'username', 'email', 'password')
        extra_kwarg = {'password':{'write_only':True}}

    def create(self, validated_data):
        user = User.objects.create_user(
            validated_data['username'],
            validated_data['email'],
            validated_data['password']
            )
        return user

# Login Serializer

class LoginSerializer(serializers.Serializer):
    username = serializers.CharField()
    password = serializers.CharField()

    def validate(self, data):
        user = authenticate(**data)
        if user and user.is_active:
            return user
        raise serializers.ValidationError("Incorrect Credentials")

在您的 views.py 中,您必须像这样创建视图

from rest_framework import generics
from rest_framework.response import Response
from .serializers import RegisterSerializer, LoginSerializer

# Register API
class RegisterAPI(generics.GenericAPIView):
    #I'm using generic view you can create your custom view
    serializer_class = RegisterSerializer
    def post(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        #here your data get validated and throw ValidationError to your API endpoint
        user = serializer.save()
        return Response({
            "user":UserSerializer(user, context=self.get_serializer_context()).data})

# Login API
class LoginAPI(generics.GenericAPIView):
    serializer_class = LoginSerializer

    def post(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        user = serializer.validated_data
        return Response({
            "user":UserSerializer(user, context=self.get_serializer_context()).data})

您必须为此创建端点以将您的前端连接到您的后端

urls.py

from django.urls import path
from .api import RegisterAPI, LoginAPI

urlpatterns = [
    path('api/auth/register', RegisterAPI.as_view()),
    path('api/auth/login', LoginAPI.as_view()),
]

而且您必须在前端应用程序 onSubmit 或任何您想要的方法中调用方法

onSubmit = e => {
        e.preventDefault();
        const {username, email, password} = this.state; //you have to create state I've not provided because it will be to big code
        const login = {name, email, password};
        this.Login(login);//this method you have to create to fetch data to your endpoint and it will give you a response 
        this.setState({
            name:'',
            email:'',
            password:''
        });
    };

从 Login 方法中,您将收到来自该响应的响应,您必须像这样访问 .catch() 方法中的所有错误

.catch(err => {
  const errorText = err.response.data,
  const errorStatus = err.response.status
});

我认为这是很多代码,所以我将在此停止更多信息,我将为您提供一个教程 URL。

更新

用户序列化器

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('id', 'username', 'email')

【讨论】:

  • 好的,谢谢!如果密码不正确,它会返回错误,但是我怎样才能得到密码没有通过验证测试的原因?
  • 您好@Pythony 进行单个字段验证检查此帖子stackoverflow.com/a/36419160/14457833
  • 好的!谢谢!!
  • 如何创建UserSerializer?
  • 你好@Pythony 检查我已经编辑了我的答案添加了UserSerializer
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-09
  • 1970-01-01
  • 2016-01-17
  • 1970-01-01
  • 2014-07-06
  • 2019-07-02
相关资源
最近更新 更多