【问题标题】:'Anonymous user' error after passing data with Angular to Rest使用 Angular 将数据传递给 Rest 后出现“匿名用户”错误
【发布时间】:2016-01-10 15:27:25
【问题描述】:

我是 Angular 和 Rest 的初学者,但我遇到了问题。我在 Django 模板中有一个表单,我想用 Angular 传递数据,用 Rest 接收它并处理它。 Angular 知道通过 url 将数据传递(发布)到:

url(r'^api/nowyPacjent/$', CreateNewPatient.as_view(), name="api_tempPatient"),

CreateNewPatient 类如下所示:

class CreateNewPatient(generics.ListCreateAPIView):
    model = TempPatient
    queryset = TempPatient.objects.all()
    serializer_class = CreateNewPatientSerializer

序列化器看起来像这样:

class CreateNewPatientSerializer(serializers.Serializer):
   name = serializers.CharField(max_length=30)
   surname = serializers.CharField(max_length=70)
   phone = serializers.CharField(max_length=15, required=False)
   age = serializers.IntegerField(max_value=99, min_value=1, required=False)
   company = serializers.PrimaryKeyRelatedField(many=False, queryset=Company.objects.all()) 
   therapyStart = serializers.DateField(required=False)

   def create(self, validated_data):
       if 'therapyStart' in validated_data:
           therapy_start = validated_data['therapyStart']
       else:
           therapy_start = datetime.date.today()

       if 'age' in validated_data:
           patient_age = validated_data['age']
       else:
           patient_age = 1;

       if 'phone' in validated_data:
           patient_phone = validated_data['phone']
       else:
           patient_phone = ''

    newTempPatient = TempPatient(
        name  = validated_data['name'],
        surname = validated_data['surname'],
        company = validated_data['company'],
        therapyStart = therapy_start,
        age = patient_age,
        phone = patient_phone
    )
    newTempPatient.save()
    newPatient = Patient(
        name=validated_data['name'],
        surname=validated_data['surname'], 
        phone=patient_phone, 
        age=patient_age
        )
    newPatient.save()
    user=None
    request = self.context.get('request')
    if request and hasattr(request,"user"):
        user=request.user
        newTherapyGroup = TherapyGroup.objects.create(
            start = therapy_start,
            patient = newPatient,
            therapist = Therapist.objects.get(user = user),
            company =  validated_data['company']
        )
        newTherapyGroup.save()
    return newTempPatient

一切都很好 - 在提交模板表单后,患者被创建 - 直到代码尝试从请求中获取登录用户(就在序列化程序的最后一个 if 语句之后)。然后我收到“AnonymousUser”错误,无法创建最终模型实例。我试图将数据传递给 Django 视图,然后使用 Rest 的序列化程序。但是,错误再次发生。我已经搜索了答案,但没有任何帮助。请注意,我不想对登录的用户进行身份验证,而是要获取有关他的数据。

我认为问题在于 Angular 在某种程度上松散了有关 CSRF 令牌和日志会话的信息,这就是这两个错误的原因(这只是我的假设)。

下面是 Angular 配置的样子。 NewPatientCtrl 负责提到的表单和模型是表单元素之一(它工作正常)。

angular.module('pacjent', ['ngMessages', 'ui.bootstrap', 'datetime'])
.constant('companyListApi','http://localhost:8000/finanse/api/list/')
.constant('tempPatientApi','http://localhost:8000/pacjent/api/nowyPacjent/')
.factory('ModelUtils', ModelUtils)
.factory('newPatientFormApi',newPatientFormApi )
.factory('companyApi', companyApi)
.factory('mySharedService', mySharedService)
.controller('PacjentCtrl', PacjentCtrl)
.controller('NewPatientCtrl', NewPatientCtrl)
.controller('ModalInstanceCtrl', ModalInstanceCtrl)
.config(function($interpolateProvider, $httpProvider) {
    $interpolateProvider.startSymbol('{[{');
    $interpolateProvider.endSymbol('}]}');
    $httpProvider.defaults.xsrfCookieName = 'csrftoken';
    $httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';
})

有趣的是,这段代码在我同事的系统(Windows 7、Chrome)上完美运行——用户数据被完美收集。但是,我已经在我的 PC 上的三个不同系统(Windows 7 x64、Xubuntu 14.04、Ubuntu 14)和几个浏览器(Firefox、Chromium)上对其进行了测试,并且出现了同样的错误。

非常感谢您的任何 cmets 和建议。对于任何非专业的陈述也很抱歉。

【问题讨论】:

    标签: angularjs django rest


    【解决方案1】:

    正是因为这一行:

    user=request.user
    # ...
    therapist = Therapist.objects.get(user = user),
    

    你正试图从你的数据库中获取一个治疗师,你的 ORM 中有一个 Anynomous 用户——这意味着一个没有登录的用户。

    您的支票中需要is_authenticated()

    if request and hasattr(request,"user") and request.user.is_authenticated():
        user=request.user
        newTherapyGroup = TherapyGroup.objects.create(
            start = therapy_start,
            patient = newPatient,
            therapist = Therapist.objects.get(user=user),
            company =  validated_data['company']
        )
        newTherapyGroup.save()
    

    【讨论】:

    • 是的,这是真的。我以前就注意到了。但是,问题是登录的用户实际上是经过身份验证的,所以它不应该是“匿名的”。就像我提到的那样,我的同事为同一个用户运行此代码并且它有效。从请求中收到的用户不是“匿名”,而是真正登录的用户。在我的系统中,我不知道为什么,请求在使用 Angular 传递数据时丢失了有关登录用户的所有数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    • 2012-12-24
    • 2018-09-18
    • 1970-01-01
    • 2013-01-29
    相关资源
    最近更新 更多