Django REST framework 的TokenAuth认证及外键Serializer基本实现

 

一,Models.py中,ForeignKey记得要有related_name属性,已实现关联对象反向引用。

app_name = models.ForeignKey("cmdb.App",related_name='deploy_app', verbose_name="App")

 

二,Settings.py文件中,加入对Django REST framework的基本设置。

REST_FRAMEWORK = {

    'DEFAULT_PERMISSION_CLASSES': (

        'rest_framework.permissions.IsAuthenticated',

    ),

    'DEFAULT_AUTHENTICATION_CLASSES': (

        'rest_framework.authentication.TokenAuthentication',

    ),

    'PAGINATE_BY': 10

}

 

三,将变化合并入数据库。

python manage.py migrate
python manage.py makemigrations

 

四,为数据库中已有的用户生成token。

进入python manage.py shell

>>>from django.contrib.auth.models import User

>>>from rest_framework.authtoken.models import Token

>>>for user in User.objects.all():

       Token.objects.create(user=user)

            # Token.objects.get_or_create(user=user)

 

五,设置每次新生成用户时,自动生成token的signals。

 

Singals.py:

from django.db.models.signals import post_save

from django.dispatch import receiver

from rest_framework.authtoken.models import Token

from django.conf import settings

@receiver(post_save, sender=settings.AUTH_USER_MODEL)

def create_auth_token(sender, instance=None, created=False, **kwargs):

    if created:

        Token.objects.create(user=instance)

         __init__.py:

         

from .signals import create_auth_token

 

六,用户获取自己的token。

token_str = Token.objects.get(user=request.user).key

 

七,用户更新自己的token。

token_key = hashlib.sha1(os.urandom(24)).hexdigest()

Token.objects.filter(user_id=request.user.id).update(key=token_key)

 

八,序列化操作时,用serializers.ReadOnlyField方法实现外键引用的字段显示,用serializers.HyperlinkedRelatedField方法实现反向关联引用。

 

server_ip = serializers.ReadOnlyField(source='server_ip.name')

ip_subserver = serializers.HyperlinkedRelatedField(many=True, view_name='api:subserver-detail', read_only=True)

 

九,在views.py中,用get_queryset中的self.request来获取请求中的参数和用户名。

def get_queryset(self):

    print(self.request.META.get('HTTP_AUTHORIZATION', ''))

    print (self.request.user, '##################')

    print(self.request.auth, '##################')

    print(self.request.META.get('QUERY_STRING', ''))

    queryset = self.queryset.filter(username='kevin')

        return queryset

 

十,在urls.py中,定义好router中各个item的base_name,及获取token的url。

 

url(r'^api-token-auth/', rest_views.obtain_auth_token),

router = DefaultRouter()

router.register(r'subserver', api_views.SubserverViewSet, base_name="subserver")

 

十一,       用户Httpie测试

http POST 127.0.0.1:8000/api/api-token-auth/ username="kevin" password="xxx"

 

{

             "token": "108cf518faaf7a8dfed15906659e5a02f8baa612"

}

 

http GET http://127.0.0.1:8000/api/users/ "Authorization: Token 8d42afbba5cfb18fd3fe108a7df932b4243bf247"

 

时间: 2024-09-17 03:44:59

Django REST framework 的TokenAuth认证及外键Serializer基本实现的相关文章

DJANGO中正规的建立与USER外键的方式

以前都是直接与user 最近看书,上说settings.AUTH_USER_MODEL,这样好些...是为记. from django.db import models from django.conf import settings class Profile(models.Model): user = models.OneToOneField(settings.AUTH_USER_MODEL) date_of_birth = models.DateField(blank=True, null

entity framework-Enity framework 向一个有外键的table插入数据

问题描述 Enity framework 向一个有外键的table插入数据 Enity framework 怎么向一个有外键的table插入数据. 比如一个student表: Id(主键) Name ClassId(外键,Class表的主键) 一个Class表: Id(主键,student的外键) Name 当我用ef(版本3.5)插入一条student记录时,例如 (1,小明,一班)注:"一班"这个数据存在于class表中. 这时ef会先去class表中插入"一班"

django rest framework如何实现nest field显示,如何保存有外键的字段更新

一步一步深入了. 相关设置技巧如下: 直接nest field显示: class VersionPoolSerializer(serializers.ModelSerializer): site_name = serializers.ReadOnlyField(source='site_name.name') dep_version = DeployPoolSerializer(many=True, required=False, read_only=True) create_user = se

解决一个Django Rest Framework的JSON输出的小问题

  在服务器升级迁移过程中,遇到一个见了鬼的问题. 同样的一个API输出,在本机测试时和生产中一台机器上的输出为纯数据的json格式. 而在另一台生产机器上却为加了统计和跳转信息的另一种json格式. 由于前端用了vue.js作了数据的加载,如果同样的代码,那获取json中对象的信息显然就会发生问题. 解决BUG的时间来不及,也无法深入调试.可用以下代码,判断json中是否有存在对象来进行对象的赋值,可解决这个输出问题. 以后找时间还是深入研究一下这个DRF的输出机制吧. //此处兼容djang

如何在DJANGO里,向有外键(一对多和多对多)的DB里插入数据?

需要插入的数据表结构如下:   [python] view plaincopy   class UserInfo(models.Model):       user_id =models.AutoField(primary_key=True)       user_name=models.CharField(max_length=20,unique=True)        depart=models.ForeignKey(DepartmentInfo)       role=models.Ma

entity framework自动生成数据库外键“表名_外键”的解决方案

今天在尝试使用EF的Code First功能的时候,发现EF自动生成的数据库中表字段不是自己想要的,因为一般来讲,数据库表中的外键,我们希望它的名称跟它关联的表的主键名称相同.但是EF生成的外键字段却是"被关联的表名_主键名"(如图1所示).这个很奇怪. 图1    被关联的表名_主键名的字段 下面代码是数据库表对应的实体类代码. 1 public class UserInfo 2 { 3 [Key] 4 public int UserID { get; set; } 5 public

django作models的UPDATE时,注意有过滤外键的情况

就是如果要过滤的时候,存在外键,则需要取到原始字段的名称,不然就是ID. 原始名称以__(双下划线)引用. 如: def path2db(release_version, develop_version, servername, salt_path): print "begin update sql..................................." print release_version, develop_version, servername, salt_p

link环境下,如何使用codefirst查询多个类型的外键关联?

问题描述 link环境下,如何使用codefirst查询多个类型的外键关联? link环境下,如何使用codefirst查询多个类型的外键关联? 解决方案 不是很明白你在问什么 最好举个例子说明一下 codefirst是Entitiy Framework实现数据库操作的一种方式 解决方案二: http://www.cnblogs.com/libingql/p/3353112.html

mysql的外键与自增矛盾了

问题描述 mysql的外键与自增矛盾了 问题很简单:table A中的属性aid是自增的主键:table B中的属性bid是自增的主键,引用A中的aid作为外键.那么,B中的aid如果设为自增,B中就有两个自增,是不行的:如果不设为自增,又与A中的aid自增矛盾.请问这个问题怎么解决? 解决方案 原来是navicat软件的问题,直接用sql语句是没问题的 解决方案二: b.aid为什么要自增? 主键与外键 解决方案三: 它是引用A中的aid,设置要与a中的一样,要不会报错.