Django中实现用户注册登录和个人资料设置后台代码实现
1.1 创建项目和app
话不多说开始动手
django-admin startproject login
python manage.py startapp user
1.2 设置时区和语言
Django默认使用美国时间和英语,在项目的settings文件中,如下所示:
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
我们把它改为亚洲/上海时间和中文
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = False
2.1数据库模型设计
作为一个用户登录和注册项目,需要保存的都是各种用户的相关信息。很显然,我们至少需要一张用户表User,在用户表里需要保存下面的信息:
昵称
密码
(我这里就简单写两个了,根据自身需要添加,嘻嘻)
进入login/models.py,代码如下
from django.db import models
class User(models.Model):
nickname = models.CharField(max_length=16, unique=True)
password = models.CharField(max_length=256)
report_password = models.CharField(max_length=245)
class Meta:
db_table = 'user'
各字段含义
name必填,最长不超过128个字符,并且唯一,也就是不能有相同姓名;
password必填,最长不超过256个字符(实际可能不需要这么长);
注意:这里的用户名指的是网络上注册的用户名,不要等同于现实中的真实姓名,所以采用了唯一机制。如果是现实中可以重复的人名,那肯定是不能设置unique的。
2.2设置数据库为Mysql
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'login',
'USER': 'root',
'PASSWORD': '123',
'HOST': 'localhost',
'PORT': 3306
}
}
进入项目文件夹下的init.py里面导入pymysql模块
import pymysql
pymysql.install_as_MySQLdb()
2.3 app注册和数据库迁移
INSTALLED_APPS = [
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.staticfiles',
'user',
]
model.py中的模型迁移到数据库
python manage.py makemigrations
python manage.py migrate
3.1开始写路由
将user模块中的views.py改名为apis.py
在login/urls.py中导入user模块中的api.py和写入四条路由
from django.urls import path
from user import apis as api
urlpatterns = [
path('api/user/register/', api.user_register),
path('api/user/login/', api.user_login),
path('api/user/get_profile/', api.get_profile),
path('api/user/set_profile/', api.set_profile),
]
3.2根据路由写视图函数
首先在user模块中新建一个logic.py的文件用于一些逻辑处理,首先写一个对用户提交的密码进行加密的函数
import hashlib
def hash_code(password):
h = hashlib.sha256()
h.update(bytes(password, encoding='utf-8'))
return h.hexdigest()
下面来写视图函数,在api.py文件中写入一个用户注册视图函数
from django.http import JsonResponse
from user.logic import hash_code
from user.models import User
def user_register(requests):
nickname = requests.POST.get('nickname')
password = requests.POST.get('password')
report_password = requests.POST.get('report_password')
encryption_password = hash_code(password)
encryption_report_password = hash_code(report_password)
if nickname and encryption_password == encryption_report_password:
User.objects.create(nickname=nickname, password=encryption_password, report_password=encryption_report_password)
return JsonResponse({'code': 0, 'msg': None})
elif encryption_password != encryption_report_password:
return JsonResponse({'code': 1, 'msg': '两次密码不一致'})
用postman测试工具测试一下:
先写一个错误的
提示两次密码不一致
来个正确的
返回0,表示用户注册成功
来看一下数据库
接下来写登录函数
def user_login(request):
nickname = request.GET.get('nickname')
password = request.GET.get('password')
encryption_password = hash_code(password)
try:
user = User.objects.get(nickname=nickname, password=encryption_password)
request.session['uid'] = user.id
return JsonResponse({'code': 0, 'msg': user.to_dict()})
except User.DoesNotExist:
return JsonResponse({'code': 2, 'msg': '用户不存在'})
这里使用request.session[‘uid’] = user.id来维持用户的登录状态
用postman来测试一下错误的
提示用户不存在
登录成功后要返回用户的信息,在user模块中model.py中新建一个函数返回用户信息
def to_dict(self):
return {
'id':self.id,
'nickname': self.nickname,
}
这里就返回用户的昵称了
在用postman测试一下
返回了用户的id和用户的nickname
3.3用户资料模型建立和视图函数
在原来的user模块中的model.py文件中新建profile模型将age默认设置为18同时将to_dict()函数写上
class Profile(models.Model):
age = models.IntegerField(default=18)
address = models.CharField(max_length=32)
text = models.TextField()
def to_dict(self):
return {
'id': self.id,
'age': self.age,
'address': self.address,
'test': self.text
}
class Meta:
db_table = 'profile'
接下来为user模型和profile模型建立一对一关系,这里不使用外键去约束
class User(models.Model):
nickname = models.CharField(max_length=16, unique=True)
password = models.CharField(max_length=256)
report_password = models.CharField(max_length=245)
def profile(self):
"""user和profile模型一对一关系建立"""
if not hasattr(self, '_profile'):
self._profile, _ = Profile.objects.get_or_create(id=self.id)
return self._profile
在apis.py中写入函数获取个人资料
def get_profile(request):
user = request.session.get('uid')
profile, _ = Profile.objects.get_or_create(id=user)
return JsonResponse({'code': 0, 'msg': profile.to_dict()})
用postman测试一下
已经将刚才登录的用户的个人资料返回回来的
下面开始写设置用户个人资料函数,在user模块中新建一个forms.py的文件,需要通过Django自带的forms对用户提交字字段进行清洗写入一下代码
from django import forms
from user.models import Profile
class ProfileForm(forms.ModelForm):
class Meta:
model = Profile
fields = ['age', 'address', 'text']
def clean_age(self):
cleaned_data = super().clean()
if cleaned_data['age'] <= 18 or cleaned_data['age'] >= 70:
raise forms.ValidationError('age不能小于18或大于70')
else:
return cleaned_data['age']
fields:中填入需要清洗的字段
clean_age这个行数中约束用户填的值
在apis.py中写入以下代码
def set_profile(request):
profile_form = ProfileForm(request.POST)
if not profile_form.is_valid():
raise JsonResponse({'code': 3, 'msg': '表单错误'})
data = {}
data.update(profile_form.clean())
user = request.session.get('uid')
Profile.objects.filter(id=user).update(**profile_form.cleaned_data)
return JsonResponse({'code': 0, 'msg': None})
用postman测试一下
个人资料修改成功,再来获取一下个人资料看看有什么变化
成功获取到修改过后的个人资料。
标签:profile,个人资料,用户注册,models,py,Django,user,password,nickname From: https://www.cnblogs.com/HeroZhang/p/17553044.html