2014-04-12 10 views
13

मैं this tutorial अनुसरण कर रही हूं लेकिन इन समस्याओं का सामना करना पड़ रहा ठीक नहीं कर सकते: उपयोगकर्ता पंजीकरण के होने परDjango आराम फ्रेमवर्क उपयोगकर्ता पंजीकरण?

  1. , मैं api के लिए है कि उपयोगकर्ता के साथ प्रवेश नहीं कर सकते क्योंकि पासवर्ड टुकड़ों में बांटा नहीं है "गलत पासवर्ड प्रारूप या अज्ञात हैशिंग एल्गोरिदम। " व्यवस्थापक
  2. में मैं 'एपीआई/खातों के पोस्ट नहीं कर सकते या ब्राउज़ करने योग्य एपीआई में प्रपत्र देखने के लिए जब मैं api के लिए लॉग इन नहीं कर रहा हूँ

मेरे कोड:

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

class UserSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = User 
     fields = ('password', 'first_name', 'last_name', 'email') 
     write_only_fields = ('password',) 

    def restore_object(self, attrs, instance=None): 
     # call set_password on user object. Without this 
     # the password will be stored in plain text. 
     user = super(UserSerializer, self).restore_object(attrs, instance) 
     user.set_password(attrs['password']) #somehow not hashing 
     return user 
+1

डीआरएफ 3.0 में, 'write_only_fields = ('पासवर्ड',)' 'extra_kwargs परिवर्तित करने के लिए = { 'पासवर्ड': { 'write_only': यह सच है} ,} ' –

+1

एक और अच्छा समाधान: http://stackoverflow.com/questions/27468552/changing-serializer-fields-on-the-fly/#answer-27471503 –

उत्तर

1

कृपया ध्यान दें कि set_password() ऑब्जेक्ट को सहेजता नहीं है और चूंकि आपने पहले सुपर को कॉल किया है, इसलिए आपकी ऑब्जेक्ट पहले ही कच्चे पासवर्ड से सहेजी गई है।

बस पासवर्ड को सहेजने के लिए post_save() का उपयोग करें।

def post_save(self, obj, created=False): 
    """ 
    On creation, replace the raw password with a hashed version. 
    """ 
    if created: 
     obj.set_password(obj.password) 
     obj.save() 
+0

यह DRF 3.0.2 – wsgeorge

+3

में काम नहीं कर सकता है यह नहीं करता है डीआरएफ 3.x में काम – Divick

13

मैंने डीआरएफ 3.0.2 में स्वीकृत उत्तर की कोशिश की और यह काम नहीं किया। पासवर्ड धोया नहीं जा रहा था।

इसके बजाय, अपने मॉडल serializer में बनाने के विधि ओवरराइड

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

यह पासवर्ड हैश जब आप आराम ढांचे का उपयोग कर एक उपयोगकर्ता बनाने के लिए, नहीं post_save

+2

उपयोगकर्ता को 'user.objects.create_user (** validated_data)' उपयोगकर्ता को (हैश पासवर्ड के साथ) बनाने के लिए दो लाइनों में करने के बजाय यह आसान हो सकता है – aensm

-1

हम हल करने के लिए उपयोगकर्ता में एक संकेत लिख सकते हैं इस।

def create_hash(sender, instance=None, *args, **kwargs): 
passwd = instance.password 
instance.set_password(passwd) 


pre_save.connect(create_hash, sender=User) 
2

मैंने अपना खुद का निर्माण करने के लिए wsgeorge के समाधान का उपयोग किया है। एक खाली User वस्तु सिर्फ इसलिए मैं .set_password() उपयोग कर सकते हैं बनाई गई है:

उसके जवाब से
def create(self, validated_data): 
    user = User() 
    user.set_password(validated_data['password']) 
    validated_data['password'] = user.password 
    return super(UserSerializer, self).create(validated_data) 

अलग है, मैं अपने आप को बचाने के लिए उपयोगकर्ता नहीं है। मैं इसे super पर कॉल करने वाले मूल वर्ग को छोड़ देता हूं।

6

डीआरएफ 3.x के लिए एक और दृष्टिकोण:

from django.contrib.auth import get_user_model 
from django.contrib.auth.hashers import make_password 

    def create(self, validated_data):  
     if validated_data.get('password'): 
      validated_data['password'] = make_password(
       validated_data['password'] 
      ) 

     user = get_user_model().objects.create(**validated_data) 

     return user 
+0

आप सही हैं –

संबंधित मुद्दे