zoukankan      html  css  js  c++  java
  • django rest_framework 实现用户登录认证

    django rest_framework 实现用户登录认证

    1、安装

    pip install djangorestframework

    2、创建项目及应用

     创建过程略

    目录结构如图

    3、设置settings.py

    设置数据库连接

    # MySQL  增加mysql 连接
    DATABASES = {
        'default':{
         'ENGINE':'django.db.backends.mysql',
         'HOST':'127.0.0.1',
         'PORT':'3306',
         'NAME':'dbname',  # 数据库名
         'USER':'username',
         'PASSWORD':'password',
         'OPTIONS':{
             'sql_mode': 'traditional'
         },
        }
    }

    添加应用

    # Application definition
    
    INSTALLED_APPS = [
         ...
        'rest_framework',
        'api',
    ]

     4、创建用户信息models,在models.py

    from django.db import models
    
    # Create your models here.
    
    class User(models.Model):
        username = models.CharField(max_length=32,unique=True)
        password = models.CharField(max_length=32)
    
        class Meta:
            db_table = 'user'
            verbose_name = verbose_name_plural = '用户信息表'
    
    class userToken(models.Model):
        username = models.OneToOneField(to='User',on_delete=models.DO_NOTHING)
        token = models.CharField(max_length=60)
    
        class Meta:
            db_table =  'user_token'
            verbose_name = verbose_name_plural = '用户token表'

    在项目下执行命令生成数据表

    python manage.py makemigrations 
    
    python manage.py migrate 

    5、在views.py 文件里,编写登录验证程序

    from django.shortcuts import render
    
    # Create your views here.
    
    import time
    from api import models
    from django.http import JsonResponse
    from rest_framework.views import APIView
    
    class AuthView(APIView):
    
        def post(self,request,*args,**kwargs):
    
            ret = {'code':1000,'msg':None}
            try:
                # 参数是datadict 形式
                usr = request.data.get('username')
                pas = request.data.get('password')
    
                # usr = request._request.POST.get('username')
                # pas = request._request.POST.get('password')
    
                # usr = request.POST.get('username')
                # pas = request.POST.get('password')
    
                print(usr)
                # obj = models.User.objects.filter(username='yang', password='123456').first()
                obj = models.User.objects.filter(username=usr,password=pas).first()
                print(obj)
                print(type(obj))
                print(obj.username)
                print(obj.password)
                if not obj:
                    ret['code'] = '1001'
                    ret['msg'] = '用户名或者密码错误'
                    return JsonResponse(ret)
                    # 里为了简单,应该是进行加密,再加上其他参数
                token = str(time.time()) + usr
                print(token)
                models.userToken.objects.update_or_create(username=obj, defaults={'token': token})
                ret['msg'] = '登录成功'
                #ret['token'] = token
            except Exception as e:
                ret['code'] = 1002
                ret['msg'] = '请求异常'
            return JsonResponse(ret)

    6、在urls.py设置访问路径

    from django.contrib import admin
    from django.urls import path
    from django.conf.urls import url
    
    from api.views import AuthView
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        url(r'^api/v1/auth/$', AuthView.as_view()),
    ]

    7、通过postman验证登录接口

     

     如图显示登录成功。

     遇到的坑:

    views获取Post参数的方式:

    # 如下有三种方式获取参数,有些文章介绍,必须使用第二种,
    # 其实不然,具体使用哪种要看参数的传入形式而定,建议使用第一种,
    #因为第一种支持key-value 和 json 格式 ,后面两种仅支持 key-value.
    
    usr = request.data.get('username')
    pas = request.data.get('password')
    
    # usr = request._request.POST.get('username')
    # pas = request._request.POST.get('password')
    
    # usr = request.POST.get('username')
    # pas = request.POST.get('password')

     postman 配置

     1、如图,如果没有选择设置content-type,则参数要选择 form-data,上面获取参数的方式 三种皆可。

     2、如果选择了content-type为application/json,则body 要选择raw ,如图

     

     而此时获取参数的方式只能选择第一种。

  • 相关阅读:
    python测试开发django-165.form表单序列化json的2种方式
    python测试开发django-164.bootstrap-table 单元格添加select下拉框
    python测试开发django-163.bootstrap-table 表格单元格行内编辑
    python测试开发django-162.ajax 提交表单,防重复提交(beforeSend)
    postman使用教程18-如何取出返回 cookie 中的 sessionId 值
    python测试开发django-161.Celery 定时任务保存到数据库 (djcelery)
    python测试开发django-160.Celery 定时任务 (beat)
    pytest文档77
    python测试开发django-159.Celery 异步与 RabbitMQ 环境搭建
    计算图像数据集的均值和方差(mean, std)用于transforms.Normalize()标准化
  • 原文地址:https://www.cnblogs.com/sq1995liu/p/12611571.html
Copyright © 2011-2022 走看看