用Python编写简单的注册和登录界面

本篇文章给大家谈谈python注册用户名和密码登录,以及python写简单的注册登录,希望对各位有所帮助,不要忘了收藏本站喔。

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个字符(实际可能不需要这么长);
  • 注意:这里的用户名指的是网络上注册的用户名,不要等同于现实中的真实姓名,所以采用了唯一机制不会c语言可以学python吗。如果是现实中可以重复的人名,那肯定是不能设置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测试一下

    个人资料修改成功,再来获取一下个人资料看看有什么变化

    成功获取到修改过后的个人资料。
    大功告成,教程到此结束。
    第一次写有什么不足之处还请指出。

    作者:2301_81900494

    物联沃分享整理
    物联沃-IOTWORD物联网 » 用Python编写简单的注册和登录界面

    发表回复