实现内容
- 自定义用户类
- 添加一个myid
- 可以正常实现数据库
- 可以正常注册用户
- 可以正常登录用户
- 可以得到是否登录或现在用户信息
- 根据myid进行登录
实现步骤
环境搭建
# 初始搭建开发环境
mkdir drf_learn4
cd drf_learn4/
virtualenv venv
source venv/bin/activate
pip install --upgrade pip
pip install django
pip install djangorestframework
pip install -U black
pip freeze >requirements.txt
django-admin startproject myproject .
python manage.py startapp myapp
# 创建数据库并测试
python manage.py makemigrations myapp
python manage.py migrate
python manage.py runserver
1. setting配置 : 在setting中添加app,并填写自己定义的类,删除Csrf中间件
# myproject/settings.py
# 1
INSTALLED_APPS = [
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
"myapp",
]
# 2
MIDDLEWARE = [
"django.middleware.security.SecurityMiddleware",
"django.contrib.sessions.middleware.SessionMiddleware",
"django.middleware.common.CommonMiddleware",
# "django.middleware.csrf.CsrfViewMiddleware",
"django.contrib.auth.middleware.AuthenticationMiddleware",
"django.contrib.messages.middleware.MessageMiddleware",
"django.middleware.clickjacking.XFrameOptionsMiddleware",
]
# 3
AUTH_USER_MODEL = 'myapp.myuser'
2. 配置模型
# myapp/models.py
from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.
class myuser(AbstractUser):
fuckid = models.CharField(max_length=30)
pass
3. 配置视图
# myapp/views.py
import json
from traceback import print_tb
from urllib import request
from django.contrib.auth import authenticate, login, logout
from django.http import HttpResponse
from django.shortcuts import render
from myapp.models import myuser
# Create your views here.
def regoneuser(request):
reguser = myuser.objects.create_user(
username="xiesi123",
email="[email protected]",
password="jS_123456",
fuckid="hello",
)
return HttpResponse(reguser.id)
def get_user_info(request):
if request.user.is_authenticated:
return HttpResponse(str(request.user.id) + ":" + request.user.username)
else:
return HttpResponse("no user")
def myapplogin(request):
username = request.POST["username"]
password = request.POST["password"]
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
# Redirect to a success page.
return HttpResponse("suc : " + str(user.id))
else:
# Return an 'invalid login' error message.
return HttpResponse("fail")
def myapplogout(request):
logout(request)
return HttpResponse("logout")
def myapploginbyfuckid(request):
m_user = myuser.objects.get(fuckid="hello")
login(request, m_user)
return HttpResponse(m_user.id)
4. 配置路由
# myproject/urls.py
from django.contrib import admin
from django.urls import path
from myapp import views
urlpatterns = [
path("admin/", admin.site.urls),
path("regoneuser/", views.regoneuser, name="regoneuser"),
path("get_user_info/", views.get_user_info, name="get_user_info"),
path("myapplogin/", views.myapplogin, name="myapplogin"),
path("myapplogout/", views.myapplogout, name="myapplogout"),
path("myapploginbyfuckid/", views.myapploginbyfuckid, name="myapploginbyfuckid"),
]
运行测试
1. 注册账号
2. 获取账号,当前为未登录状态所以无账号
3. 登录账号
4. 得到当前用户
5. 登出账号
6. 获取当前账号得到已登出
7. 通过fuckid登录
8. 获取当前账号
参考文档
自定义用户的官方文档
https://docs.djangoproject.com/zh-hans/4.1/topics/auth/customizing/#substituting-a-custom-user-model
django字段参数解析
https://docs.djangoproject.com/zh-hans/4.0/ref/models/fields/
创建账号
https://docs.djangoproject.com/zh-hans/4.1/topics/auth/default/
用户认证
https://docs.djangoproject.com/zh-hans/4.1/topics/auth/default/#django.contrib.auth.authenticate