Django REST Framework 用户登录认证完整教程

顾星河
顾星河
发布时间:2026-10-13 | 2人浏览过
原创

本文详细讲解如何使用Django REST Framework实现用户登录认证功能。内容涵盖项目创建、数据库配置、User模型设计、登录视图编写及URL路由设置。重点解析Postman中Content-Type对参数获取方式的影响,提供form-data与application/json两种场景下的代码适配方案,帮助开发者快速搭建安全的登录接口。

环境安装与项目初始化

首先,需要在环境中安装Django REST Framework库。


pip install djangorestframework

接下来,初始化Django项目并创建对应的应用模块。

执行创建项目的命令以建立基础目录结构。

在项目内部创建具体的应用模块,用于封装业务逻辑。

此时的项目目录结构应包含应用文件夹及相关配置文件。

数据库配置与应用注册

进入项目的settings.py文件,进行必要的配置修改。

在DATABASES配置项中指定MySQL数据库的连接信息,包括主机地址、端口、数据库名、用户名及密码,并设置sql_mode为traditional。


# 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'
  },
 }
}

在INSTALLED_APPS列表中注册新创建的应用以及rest_framework应用,确保框架功能生效。


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

数据模型设计与迁移

在models.py中定义用户信息模型,包含用户名和密码字段,并创建用户Token模型以存储关联的Token值。


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表'

在项目根目录下执行makemigrations和migrate命令,根据模型定义生成并应用数据库迁移脚本,创建对应的数据表。


python manage.py makemigrations 
python manage.py migrate 

登录视图逻辑实现

在views.py中编写登录验证逻辑,继承APIView类处理POST请求,验证用户名和密码,生成Token并返回结果。


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)

路由配置与接口测试

在urls.py中配置访问路径,将特定的API端点映射到登录视图类。


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()),
]

使用Postman工具发送POST请求,测试登录接口的连通性与功能。

接口返回成功状态码及消息,表明登录验证流程执行正常。

参数获取与Postman配置注意事项

在开发过程中可能遇到参数获取方式与Content-Type不匹配的问题,需特别注意配置。

Django视图获取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中配置请求头及Body参数时,需根据Content-Type的选择调整设置。

若未显式设置Content-Type或设置为application/x-www-form-urlencoded,参数应通过Form-Data形式提交,此时request.data、request._request.POST及request.POST三种获取方式均有效。

若将Content-Type设置为application/json,则Body部分必须选择Raw格式并输入JSON字符串。

在此种JSON格式下,仅request.data能正确解析参数,其他两种获取方式可能无法获取数据。

本文完整展示了从环境搭建到接口验证的全过程,旨在为Django开发者提供实用的登录认证实现参考。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表