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测试一下
在这里插入图片描述
个人资料修改成功,再来获取一下个人资料看看有什么变化
在这里插入图片描述
成功获取到修改过后的个人资料。
大功告成,教程到此结束。
第一次写有什么不足之处还请指出。

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我可以为你解答这个问题。首先,你需要在 Django 创建一个应用程序,然后在该应用程序创建登录和注册视图(views)、模板(templates)和表单(forms)。 下面是一个简单的示例,演示如何在 Django 实现登录和注册功能。 1. 创建应用程序 在 Django 创建一个名为 "accounts" 的应用程序,可以使用以下命令: ``` python manage.py startapp accounts ``` 2. 创建注册表单 在 "accounts/forms.py" 文件创建一个名为 "RegistrationForm" 的表单,以便用户可以注册新账户。示例代码如下: ```python from django import forms from django.contrib.auth.models import User class RegistrationForm(forms.ModelForm): username = forms.CharField(label='Username', max_length=30) email = forms.EmailField(label='Email') password = forms.CharField(label='Password', widget=forms.PasswordInput) password2 = forms.CharField(label='Confirm password', widget=forms.PasswordInput) class Meta: model = User fields = ['username', 'email', 'password'] def clean_password2(self): cd = self.cleaned_data if cd['password'] != cd['password2']: raise forms.ValidationError('Passwords do not match.') return cd['password2'] ``` 3. 创建注册视图 在 "accounts/views.py" 文件创建一个名为 "register" 的视图,以便用户可以提交注册表单。示例代码如下: ```python from django.shortcuts import render from django.contrib.auth.decorators import login_required from .forms import RegistrationForm def register(request): if request.method == 'POST': form = RegistrationForm(request.POST) if form.is_valid(): new_user = form.save(commit=False) new_user.set_password(form.cleaned_data['password']) new_user.save() return render(request, 'registration/register_done.html', {'new_user': new_user}) else: form = RegistrationForm() return render(request, 'registration/register.html', {'form': form}) ``` 4. 创建登录视图 在 "accounts/views.py" 文件创建一个名为 "login" 的视图,以便用户可以提交登录表单。示例代码如下: ```python from django.shortcuts import render from django.contrib.auth import authenticate, login from django.http import HttpResponseRedirect from django.urls import reverse def login_view(request): if request.method == 'POST': username = request.POST['username'] password = request.POST['password'] user = authenticate(request, username=username, password=password) if user is not None: login(request, user) return HttpResponseRedirect(reverse('home')) else: return render(request, 'registration/login.html', {'error_message': 'Invalid login'}) else: return render(request, 'registration/login.html') ``` 5. 创建模板 在 "accounts/templates/registration" 目录创建以下模板: - "register.html":注册表单页面 - "register_done.html":注册成功页面 - "login.html":登录表单页面 6. 注册应用程序 在 "settings.py" 文件注册 "accounts" 应用程序: ```python INSTALLED_APPS = [ # ... 'accounts', ] ``` 7. 同步数据使用以下命令同步数据库: ``` python manage.py makemigrations python manage.py migrate ``` 现在,当用户访问注册页面时,将显示注册表单。当用户提交表单时,将保存新用户并显示 "注册成功" 页面。并且,当用户访问登录页面时,将显示登录表单。当用户提交表单时,将验证用户凭据并将其重定向到主页。 在 Django ,可以使用内置的 "admin" 应用程序轻松地管理数据库。要使用 "admin" 应用程序,请在 "admin.py" 文件注册模型。例如,要注册 "User" 模型,请在 "accounts/admin.py" 文件添加以下代码: ```python from django.contrib import admin from django.contrib.auth.models import User admin.site.register(User) ``` 这样,就可以在 "admin" 后台管理 "User" 模型了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值