2014-11-22 2 views
3

사용자가 API를 통해 새 사용자 계정을 만들 수 있도록 DRF를 사용하려고합니다. 나는 Django Rest Framework 추가 필드가있는 사용자 등록

  • 모든 POST'd 필드
  • 내가 원하는 검증 할 필요가 DRF의 토큰 기능을 사용하여 사용자 토큰을 반환해야 성공 창조에 표준

    1. 다를 수 있습니다 몇 가지 요구 사항이 있습니다 프로필 모델에 저장 될 사용자 전화 번호를 POST 할 수 있어야합니다.
    2. 이름, 성, 이메일 주소와 전화 번호는

    지금까지 나는이 함께했다 필드

  • 을 요구해야하지만 나는 '열'USER_ID는 'null 일 수 없습니다 "라는 오류 메시지가 무엇입니까

    보기

    @api_view(['POST']) 
    @permission_classes((AllowAny,)) 
    def register_user(request): 
        serialized = UserSerializer(data=request.DATA) 
        if serialized.is_valid(): 
         user = User.objects.create_user(
          email = serialized.init_data['email'], 
          username = serialized.init_data['username'], 
          password = serialized.init_data['password'], 
          first_name = serialized.init_data['first_name'], 
          last_name = serialized.init_data['last_name'] 
         ) 
    
         phone_number = request.DATA["phone_number"] 
         #save phone_number to profile model here 
    
         return Response(serialized.data['token'], status=status.HTTP_201_CREATED) 
        else: 
         return Response(serialized._errors, status=status.HTTP_400_BAD_REQUEST) 
    

    시리얼

    class UserSerializer(serializers.ModelSerializer): 
        token = serializers.SerializerMethodField('get_token') 
    
        class Meta: 
         model = User 
         fields = ('password', 'username', 'first_name', 'last_name', 'email', 'token', 'phone_number') 
    
    
        def get_token(self, obj): 
         token = Token.objects.create(user=obj) 
         return token.key 
    

    내 질문에 내가이 작업을 어떻게합니까

    1. 입니까?
    2. 전화 번호, 성명, 성, 이메일에 대해 별도의 확인이 필요합니까? 필요 여부 또는 모델에서 처리해야합니까?
    3. 전화 번호 POST를 처리하는 올바른 방법입니까?
    4. 안전한가요? 그렇지 않다면 어떻게하면 더 안전하게 만들 수 있습니까?

    스택 트레이스

    Django Version: 1.6.8 
    Python Version: 2.7.5 
    Installed Applications: 
    ('django.contrib.sites', 
    'django.contrib.admin', 
    'django.contrib.admin', 
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
    'my_app', 
    'allauth', 
    'allauth.account', 
    'allauth.socialaccount', 
    'allauth.socialaccount.providers.facebook', 
    'debug_toolbar', 
    'rest_framework', 
    'rest_framework.authtoken', 
    'django_extensions') 
    Installed Middleware: 
    ('django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.common.CommonMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.middleware.clickjacking.XFrameOptionsMiddleware', 
    'debug_toolbar.middleware.DebugToolbarMiddleware') 
    
    
    Traceback: 
    File "/home/vagrant/envs/my/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response 
        112.      response = wrapped_callback(request, *callback_args, **callback_kwargs) 
    File "/home/vagrant/envs/my/lib/python2.7/site-packages/django/views/decorators/csrf.py" in wrapped_view 
        57.   return view_func(*args, **kwargs) 
    File "/home/vagrant/envs/my/lib/python2.7/site-packages/django/views/generic/base.py" in view 
        69.    return self.dispatch(request, *args, **kwargs) 
    File "/home/vagrant/envs/my/lib/python2.7/site-packages/rest_framework/views.py" in dispatch 
        403.    response = self.handle_exception(exc) 
    File "/home/vagrant/envs/my/lib/python2.7/site-packages/rest_framework/views.py" in dispatch 
        400.    response = handler(request, *args, **kwargs) 
    File "/home/vagrant/envs/my/lib/python2.7/site-packages/rest_framework/decorators.py" in handler 
        50.    return func(*args, **kwargs) 
    File "/home/vagrant/projects/my_project/my/my_app/api/views.py" in register_user 
        60.   return Response(serialized.data['token'], status=status.HTTP_201_CREATED) 
    File "/home/vagrant/envs/my/lib/python2.7/site-packages/rest_framework/serializers.py" in data 
        572.     self._data = self.to_native(obj) 
    File "/home/vagrant/envs/my/lib/python2.7/site-packages/rest_framework/serializers.py" in to_native 
        351.    value = field.field_to_native(obj, field_name) 
    File "/home/vagrant/envs/my/lib/python2.7/site-packages/rest_framework/fields.py" in field_to_native 
        1041.   value = getattr(self.parent, self.method_name)(obj) 
    File "/home/vagrant/projects/my_project/my/my_app/api/serializers.py" in get_token 
        19.   token = Token.objects.create(user=obj) 
    File "/home/vagrant/envs/my/lib/python2.7/site-packages/django/db/models/manager.py" in create 
        157.   return self.get_queryset().create(**kwargs) 
    File "/home/vagrant/envs/my/lib/python2.7/site-packages/django/db/models/query.py" in create 
        322.   obj.save(force_insert=True, using=self.db) 
    File "/home/vagrant/envs/my/lib/python2.7/site-packages/rest_framework/authtoken/models.py" in save 
        33.   return super(Token, self).save(*args, **kwargs) 
    File "/home/vagrant/envs/my/lib/python2.7/site-packages/django/db/models/base.py" in save 
        545.      force_update=force_update, update_fields=update_fields) 
    File "/home/vagrant/envs/my/lib/python2.7/site-packages/django/db/models/base.py" in save_base 
        573.    updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields) 
    File "/home/vagrant/envs/my/lib/python2.7/site-packages/django/db/models/base.py" in _save_table 
        654.    result = self._do_insert(cls._base_manager, using, fields, update_pk, raw) 
    File "/home/vagrant/envs/my/lib/python2.7/site-packages/django/db/models/base.py" in _do_insert 
        687.        using=using, raw=raw) 
    File "/home/vagrant/envs/my/lib/python2.7/site-packages/django/db/models/manager.py" in _insert 
        232.   return insert_query(self.model, objs, fields, **kwargs) 
    File "/home/vagrant/envs/my/lib/python2.7/site-packages/django/db/models/query.py" in insert_query 
        1514.  return query.get_compiler(using=using).execute_sql(return_id) 
    File "/home/vagrant/envs/my/lib/python2.7/site-packages/django/db/models/sql/compiler.py" in execute_sql 
        903.    cursor.execute(sql, params) 
    File "/home/vagrant/envs/my/lib/python2.7/site-packages/debug_toolbar/panels/sql/tracking.py" in execute 
        174.   return self._record(self.cursor.execute, sql, params) 
    File "/home/vagrant/envs/my/lib/python2.7/site-packages/debug_toolbar/panels/sql/tracking.py" in _record 
        104.    return method(sql, params) 
    File "/home/vagrant/envs/my/lib/python2.7/site-packages/django/db/backends/util.py" in execute 
        69.    return super(CursorDebugWrapper, self).execute(sql, params) 
    File "/home/vagrant/envs/my/lib/python2.7/site-packages/django/db/backends/util.py" in execute 
        53.     return self.cursor.execute(sql, params) 
    File "/home/vagrant/envs/my/lib/python2.7/site-packages/django/db/backends/mysql/base.py" in execute 
        129.     six.reraise(utils.IntegrityError, utils.IntegrityError(*tuple(e.args)), sys.exc_info()[2]) 
    File "/home/vagrant/envs/my/lib/python2.7/site-packages/django/db/backends/mysql/base.py" in execute 
        124.    return self.cursor.execute(query, args) 
    File "/home/vagrant/envs/my/lib/python2.7/site-packages/MySQLdb/cursors.py" in execute 
        205.    self.errorhandler(self, exc, value) 
    File "/home/vagrant/envs/my/lib/python2.7/site-packages/MySQLdb/connections.py" in defaulterrorhandler 
        36.  raise errorclass, errorvalue 
    
    Exception Type: IntegrityError at /api/user/register/ 
    Exception Value: (1048, "Column 'user_id' cannot be null") 
    
    +0

    당신이 당신의 오류에 대한 역 추적을 포함 할 수 있습니다? –

    +0

    @KevinBrown 지금 – CraigH

    +0

    추가 오류를 해결 했습니까? – Weit

    답변

    1

    내가 장고 REST 프레임 워크와 클래스 기반 뷰를 사용하는 것이 좋습니다 것입니다. 함수 기반 뷰에서 누락 된 많은 추가 기능을 제공하며 더 많은 기능을 지원합니다. 이 경우에는 이 덜 중요하지만입니다. 이것은 Django REST Framework가 테이블에 가져 오는 대부분의 것을 피하는 매우 기본적인 상황입니다.

    전화 번호, 성명, 성, 이메일에 대해 별도의 확인이 필요합니까? 모델이 필요하거나 모델에서 처리해야합니까?

    당신이 serializer.is_valid 전화

    , 검사는 모델에 필요에 따라 지정되는 모든 필드가 포함되어 있는지 확인하는 것이다. 시도해보십시오. 일어나지 않는 경우 empty=False이 필드에 지정되어 있지 않은지 확인하십시오. 이 문제를 해결할 수있는 위치에 없다면, 시리얼 라이저의 필드를 오버라이드하고 거기에 required=True을 설정할 수 있습니다.

    이 방법이 전화 번호의 POST를 처리하는 올바른 방법입니까?

    시리얼 라이저는 serializer.save()을 호출하여 자동으로 사용자를 생성 할 수 있습니다. create_user 관리자에서 사용자 정의 로직을 사용해야하는 경우 save을 사용할 수 없습니다.

    안전한가요? 그렇지 않다면 어떻게하면 더 안전하게 만들 수 있습니까?

    장고는 여기에 많은 도움이되므로 코드가 현재 매우 잘 보입니다. 고려해야 할 한 가지는 serializer의 init_datarequest.DATA의 것과 동일하다는 것입니다. 어떤 검증이 장고 ORM에 더 친절하게 데이터를 수정 한 수 있으므로 당신은 아마 대신 serializer.object.username처럼 (serializer.object에서 검증 된 데이터에 액세스해야합니다.

    관련 문제