javascript - 用 React 服务 Django 视图?
问题描述
我正在制作一个 web 应用程序,其中 react 作为前端,django-rest-framework 作为后端。
对于 django,我正在关注一个教程。https://www.techwithtim.net/tutorials/django/user-registration/ - 在这里,他们用 django 制作了一个具有适当验证的注册表单。
有没有办法用 React 做同样的事情?本质上,有没有办法用 React 显示 Django 模板和视图?如果没有,我应该只链接到 Django 服务器上托管的特定 Django 页面吗?
请帮忙。谢谢!
解决方案
首先,您必须像这样为您的登录和注册视图创建序列化程序
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})
并且您必须为此创建端点以将您的前端连接到您的后端
网址.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:''
});
};
从登录方法,您将收到来自该响应的响应,您必须访问.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')
推荐阅读
- flutter - 我想在用户第一次在应用程序中唱歌时设置默认主题,而无需“选择”按钮或复选框
- reactjs - TS2322: Type 'NotRequiredArraySchema
' is not assignable to type 'Ref | Schema I'm solving this problem. I'm using yup for formik validation. Code
- python - How to define a sentence as ,Starting with "uppercase letter" end ending with ".", in a txt file
- android - Created file disappears when Android app is killed programatically
- javascript - "classList.toggle" doesn't apply styles, but it gets applied manually
- django - Configuring Gunicorn with nginx - nginx displaying 500 Internal Server Error when running on port 8000
- c# - Is it possible to publish a program in the microsoft store that depends on the installation of another?
- google-sheets - 如何在 Google 电子表格中获取 2 个命名范围之间的交集的单元格值
- c# - 成员 'object.equals(object?, object?' 不能使用实例引用访问;在列表删除 c#?
- node.js - Passport Github 策略不起作用并抛出错误