django rest框架:在后端获取两个post请求

django rest框架:在后端获取两个post请求,django,angular,post,Django,Angular,Post,我有一个Angular应用程序向我的django后端发布注册消息,但是,当我单击页面上的register按钮时,我在django日志中收到了tow post请求,如下所示 [17/Apr/2018 22:13:47] "OPTIONS /user/register HTTP/1.1" 200 0 [17/Apr/2018 22:13:47] "POST /user/register HTTP/1.1" 500 27 [17/Apr/2018 22:13:47] "POST /user/regis

我有一个Angular应用程序向我的django后端发布注册消息,但是,当我单击页面上的register按钮时,我在django日志中收到了tow post请求,如下所示

[17/Apr/2018 22:13:47] "OPTIONS /user/register HTTP/1.1" 200 0
[17/Apr/2018 22:13:47] "POST /user/register HTTP/1.1" 500 27
[17/Apr/2018 22:13:47] "POST /user/register HTTP/1.1" 201 91

当在本地进行测试时,这很烦人,但是当我将其部署到ubuntu服务器(使用uwsgi和nginx)上时,后端似乎崩溃了。我不确定这是否是问题所在,我只是在检查我能想到的所有可能性

顺便说一句:我使用sqlite,这是因为事务

Angular.component.js

import { Component, OnInit, AfterViewInit, ViewChild } from '@angular/core';
import { NgForm } from "@angular/forms";
import { HttpClient } from "@angular/common/http";


@Component({
  selector: 'app-register',
  templateUrl: './register.component.html',
  styleUrls: ['./register.component.scss']
})

export class RegisterComponent implements OnInit, AfterViewInit {
  formData = {} as any;
  isHide: boolean;
  constructor(
    private http: HttpClient,
  ) {
    this.isHide = true;
  }
  formErrors = {
    'email': '',
    'userName': '',
    'password1': '',
    'password2': '',
    'phone': ''
  };

  validationMessages = {
    'email': {
      'required': '邮箱必须填写.',
      'pattern': '邮箱格式不对',
    },
    'userName': {
      'required': '用户名必填.',
      'minlength': '用户名太短',
    },
    'password1': {
      'required': '请输入密码',
      'minlength': '密码太短',
    },
    'password2': {
      'required': '请重复输入密码',
      'minlength': '密码太短',
    },
    'phone': {
      'required': '手机号必须填写.',
      'pattern': '手机号格式不对',
    },
  };

  @ViewChild('registerForm') registerForm: NgForm;

  ngAfterViewInit(): void {
    this.registerForm.valueChanges.subscribe(data => this.onValueChanged(data));
  }

  onValueChanged(data) {
    if (this.formErrors) {
      for (const field in this.formErrors) {
        this.formErrors[field] = '';
        const control = this.registerForm.form.get(field);
        if (control && control.dirty && !control.valid) {
          const messages = this.validationMessages[field];
          if (control.errors) {
            for (const key in control.errors) {
              this.formErrors[field] += messages[key] + '';
            }
          }
        }
      }
    }
  }

  doJumpIndex() {
    console.log("zhuye");
  }

  doJumpLogin() {
    console.log("login");
  }
  doSubmit(obj: any) {
    if (!this.registerForm.valid) {
      this.onValueChanged(obj);
      return;
    }
    let url = 'http://localhost:8000/user/register';
    this.http.post(url, obj).subscribe(
      data => {
        console.log(data);
        if (true) {
            this.isHide = false;
        }
      },
      err => {
        console.log(err);
    });
  }

  ngOnInit() {
  }

}
以下代码是从

我的用户注册视图

class UserRegistrationAPIView(generics.CreateAPIView):
    permission_classes = (permissions.AllowAny,)
    serializer_class = serializers.UserRegistrationSerializer
    queryset = User.objects.all()
用户注册序列化程序

class UserRegistrationSerializer(serializers.ModelSerializer):
    email = serializers.EmailField(
        required=True,
        label="Email Address"
    )

    password1 = serializers.CharField(
        required=True,
        label="Password",
        style={'input_type': 'password'}
    )

    password2 = serializers.CharField(
        required=True,
        label="Confirm Password",
        style={'input_type': 'password'}
    )

    invite_code = serializers.CharField(
        required=False
    )

    class Meta(object):
        model = User
        fields = ['username', 'email', 'password1', 'password2', 'invite_code']

    def validate_email(self, value):
        if User.objects.filter(email=value).exists():
            raise serializers.ValidationError("Email already exists.")
        return value

    def validate_username(self, value):
        if User.objects.filter(username=value).exists():
            raise serializers.ValidationError("Username already exists.")
        return value

    def validate_invite_code(self, value):
        data = self.get_initial()
        email = data.get('email')
        if value:
            self.invitation = TeamInvitation.objects.validate_code(email, value)
            if not self.invitation:
                raise serializers.ValidationError("Invite code is not valid / expired.")
            self.team = self.invitation.invited_by.team.last()
        return value

    def create(self, validated_data):
        team = getattr(self, 'team', None)

        user_data = {
            'username': validated_data.get('username'),
            'email': validated_data.get('email'),
            'password': validated_data.get('password1')
        }

        is_active = True if team else False

        user = UserProfile.objects.create_user_profile(
            data=user_data,
            is_active=is_active,
            site=get_current_site(self.context['request']),
            send_email=True
        )

        if team:
            team.members.add(user)

        if hasattr(self, 'invitation'):
            TeamInvitation.objects.accept_invitation(self.invitation)

        TeamInvitation.objects.decline_pending_invitations(email_ids=[validated_data.get('email')])

        return validated_data
url.py

urlpatterns = [

    path('login', views.UserLoginAPIView.as_view(), name='login'),
    path('register', views.UserRegistrationAPIView.as_view(), name='register'),
    path('profile', views.UserProfileAPIView.as_view(), name='user_profile'),
    path('password_reset', views.PasswordResetAPIView.as_view(), name='password_change'),
    re_path(r'^verify/(?P<verification_key>.+)/$',
        views.UserEmailVerificationAPIView.as_view(),
        name='email_verify'),
    re_path(r'^reset/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$',
        views.PasswordResetConfirmView.as_view(),
        name='password_reset_confirm'),

]
urlpatterns=[
路径('login',views.UserLoginAPIView.as_view(),name='login'),
路径('register',views.UserRegistrationAPIView.as_view(),name='register'),
路径('profile',views.userprofileapieview.as_view(),name='user_profile'),
路径('password\u reset',views.passwordresetapieview.as\u view(),name='password\u change'),
重新设置路径(r'^verify/(?P.+)/$),
views.UserEmailVerificationAPIView.as_view(),
name='email_verify'),
重路径(r'^reset/(?P[0-9A-Za-z_ \-])/(?P[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$,
views.PasswordResetConfirmView.as_view(),
name='password\u reset\u confirm'),
]

在我看来,你的
doSubmit
角度函数可能会触发两次。从日志来看,它似乎发送了一个信息不正确的请求(第一个调用的长度为27字节,第二个(正确的一个)的长度为91字节)。第一个请求收到HTTP 500错误(服务器端错误)。i、 它在服务器上引起了一个错误

在您的本地测试服务器上,500错误不会使服务器崩溃,因为它只会记录错误并重新加载(因为测试服务器就是这样做的),但在您正确的服务器上,它正在崩溃

我要说的是,先看看doSubmit函数,确保它不会让任何不正确的值通过第一个
if(!this.registerForm.valid)
(例如,有时我发现Angular在第一次创建对象时会触发一些我没有预料到的函数)。其次,我将添加一些日志记录,以确定
UserRegistrationAPIView
的哪一部分失败(因为这是Django调用的第一个函数,并且在某个地方引发了未捕获的异常)


如果您检查主服务器日志,它们可能会告诉您引发500内部服务器错误的原因。(如果您正在运行apache服务器,则默认情况下保存在
/var/log/apache2/error.log
中)。

谢谢。现在我确信angular代码中有一个bug。我想您可以选择修复其中一个,但可能应该修复这两个。尝试并确定是什么导致视图抛出异常,如果您处理了该异常,那么Angular是否发送了额外的无效POST请求就无关紧要了。嗨!我解决了这个问题。我的注册页面将触发发送电子邮件,但我的服务器提供商(腾讯)阻止了25端口。再次感谢你的帮助!@user75559干得好,也许记录下你用来修复它的步骤,并将答案标记为正确,以防将来有人发现类似问题时发现此问题。