Django中实现用户注册登录和个人资料设置后台代码实现 | 您所在的位置:网站首页 › 数据库用户登录界面代码怎么设置 › 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'] = 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测试一下 个人资料修改成功,再来获取一下个人资料看看有什么变化 成功获取到修改过后的个人资料。 大功告成,教程到此结束。 第一次写有什么不足之处还请指出。 |
CopyRight 2018-2019 实验室设备网 版权所有 |