• 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 ,如图

     

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

  • 相关阅读:
    JavaScrip--JS面向对象
    JavaScrip-Screen对象
    JavaScrip--Location对象
    安卓奇葩问题之:运行OK,打包安装崩溃(原因是:代码不规范导致编译出错)
    安卓奇葩问题之.so库加载不了
    Fresco简单的使用—SimpleDraweeView
    安卓奇葩问题之SQLite条件查找不到数据
    打包时动态指定一些值
    安卓开发:DateUtils
    SAX解析xml文件
  • 原文地址:https://www.cnblogs.com/BlueSkyyj/p/11193982.html
Copyright © 2020-2023  润新知