Django REST Framework 用户登录认证完整教程
本文详细讲解如何使用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开发者提供实用的登录认证实现参考。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













