#前言:

在最近十天我会用Python做一个购物类项目,会用到Django+Mysql+Redis+Vue等。

今天主要负责项目部署和注册登录,若是大家基础有不懂的,小编前面已经关于Django博客都更新完了,大家可以自行查看。若是有需要更改的地方欢迎大家指正,同时也欢迎大家关注点赞收藏等待后续,小编会尽力更新优质博客。

在项目中有很多要用到的项目前的静态配置文件和前端文件等,我打包到我的网盘中,大家可以自行免费去提取:

链接: https://pan.baidu.com/s/1NkhfPVqiAiTY-BbhdKoqpA?pwd=g3ir

提取码: g3ir

网盘中这些直接拖拽进来就可以。

一、项目环境:

python 3.8.10
django 3.2
mysql 5.7.40
redis 

我用到的项目环境如上(版本可不一样,但是要兼容,可以自行调控)。

二、项目环境配置:

1、创建Django项目——ShopSystem

2、配置Mysql的连接引擎:
 

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'shop_13',
        'HOST':'127.0.0.1',
        'USER':'root',
        'PASSWORD':'填写自己数据库密码'
    }
}

3、配置静态文件项目检索路径:

#静态文件检索路径
STATIC_URL = '/static/'
STATICFILES_DIRS=[os.path.join(BASE_DIR,'static')]

4、配置内存型数据库 , 配置 Redis 的连接引擎:

# 配置 Redis 缓存数据库信息
CACHES = {
    # 默认使用的 Redis 数据库
    "default" : {
        # 配置数据库引擎
        "BACKEND" : "django_redis.cache.RedisCache",
        # 配置使用 Redis 的数据库名称
        "LOCATION" : "redis://127.0.0.1:6379/0",
        "OPTIONS" : {
            "CLIENT_CLASS" : "django_redis.client.DefaultClient"
        }
    },
    # 将 session 的数据保存位置修改到 Redis 中
    "session" : {
        # 配置数据库引擎
        "BACKEND" : "django_redis.cache.RedisCache",
        # 配置使用 Redis 的数据库名称
        "LOCATION" : "redis://127.0.0.1:6379/1",
        "OPTIONS" : {
            "CLIENT_CLASS" : "django_redis.client.DefaultClient"
        }
    },
}

# 修改 session 默认的存储机制
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
# 配置 session 要缓存的数据库引擎
SESSION_CACHE_ALIAS = "session"

三、响应首页:

1、创建应用:

创建一个名为:contents的应用

注意包括创建和注册。(很简单,若是不懂可自行翻阅我之前的博客详细学习)

2、路由分发:

为了路由不再繁琐,所以我们在项目中选择路由分发的模式来。

在settings.py文件中:

urlpatterns = [
    path('admin/', admin.site.urls),
    path('',include('contents.urls')),#点击IP直接响应,''不写东西
]

3、响应页面:

在应用视图文件中:

from django.shortcuts import render,HttpResponse
from django.views import View

class IndexView(View):
    '''
    响应首页
    '''
    def get(self,request):
        return render(request,'index.html')

在urls文件中:

from django.urls import path
from contents import views
urlpatterns=[
    #响应首页路由
    path('',views.IndexView.as_view()),#类视图别忘记as_view(),

]

四、用户注册:

1、创建应用:

创建应用:users

2、响应注册页面视图:

响应注册页面register。

from django.shortcuts import render,HttpResponse
from django.views import View
from users.forms import RegisterForm #导入Froms组件
# Create your views here.
class RegisterView(View):
    '''
    用户注册
    '''
    def get(self,request):
        return render(request,'register.html')

3、定义用户数据模型类:

使用 auth 模块实现保存用户数据 , 自定义认证模型类。

在models模块中:

from django.db import models
from django.contrib.auth.models import  AbstractUser
#注意先不迁移(因为要用到继承)
class User(AbstractUser):
    '''
    用户数据认证模型类
    '''
    models=models.CharField(max_length=11,unique=True)
    class Meta:
        db_table='user'

修改 Django 全局默认的认证模型类:

在settings文件中:

在最底下加上

# 配置自定义认证模型类
AUTH_USER_MODEL = 'users.User'

4、定义forms组件:

定义forms组件主要是用来校验后端数据是否合法

创建forms文件后在里面:

主要是用来判断用户名、密码、电话是否合法,验证码后面会单独列一个应用来操作。

from django import forms
import re
class RegisterForm(forms.Form):
    '''
    实现校验用户注册数据
    '''
    username=forms.CharField(min_length=5,max_length=15,
                             error_messages={
                                 "min_length":"用户名过短",
                                 "max_length":"用户名过长",
                                 "required":"用户名不允许为空",
                             })#与ajax的校验保持一致
    password=forms.CharField(min_length=6,max_length=20,
                             error_messages={
                                 "min_length":"密码过短",
                                 "max_length":"密码过长",
                                 "required":"密码不允许为空",
                             })
    password2 = forms.CharField(min_length=6,max_length=20,
                             error_messages={
                                 "min_length":"密码过短",
                                 "max_length":"密码过长",
                                 "required":"密码不允许为空",
                             })
    mobile= forms.CharField(min_length=11,max_length=11,
                             error_messages={
                                 "min_length":"手机号过短",
                                 "max_length":"手机号过长",
                                 "required":"手机号不允许为空",
                             })
    #钩子函数
    def clean_username(self):
        #正则时候也要保证都一致,与ajax里面的
        name=self.cleaned_data.get('username')
        if not re.match(r'^[A-Za-z0-9_]{5,15}$',name):
            self.add_error('username','用户名数据不合法')
        return name
    def clean(self):#全局钩子
        clean_data=super().clean()#这个意味着钩取上面定义username-mobile所有数据
        passwd=clean_data.get('password')
        passwd2=clean_data.get('password2')
        if passwd!=passwd2:
            raise forms.ValidationError('两次密码不一致')#抛出属性数据异常
        return clean_data

5、进行数据校验:

仍然是在类视图中,因为提交的是数据用的是POST数据,所以多加post函数用来校验。(这里是直接校验合不合法,但是与数据库连接和与验证码校验后要将其存入数据库,明天的博客我会更新)。

from django.shortcuts import render,HttpResponse
from django.views import View
from users.forms import RegisterForm #导入Froms组件
# Create your views here.
class RegisterView(View):
    '''
    用户注册
    '''
    def get(self,request):
        return render(request,'register.html')
    def post(self,request):
         register_form=RegisterForm(request.POST)
         # 获取用户提交数据,将数据传递给forms组件进行数据校验
         if register_form.is_valid():
             return HttpResponse('注册成功')
         else:
             return HttpResponse('注册失败')

6、分发路由:

在主路由与两边都得写清楚:

主:

from django.contrib import admin
from django.urls import path,include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('',include('contents.urls')),#点击IP直接响应,''不写东西
    path('',include('users.urls')),


]

分:

from django.urls import path
from users import views

urlpatterns=[
    #响应注册页面
path('register/',views.RegisterView.as_view(),name='register')#后面这点是反向解析
]

为什么路由要这么写,是因为要在前端页面反向解析出来,此时的主页前端页面中关于注册分发部分:主要看a标签内。

                <div v-else class="login_btn fl">
                    <span>|</span>
                    <a href="login.html">登录</a>
                    <span>|</span>
                    <a href="{% url 'register' %}">注册</a>
                </div>

五、验证码识别:

验证码识别其实是在注册里面的,但是比较繁琐,比较难,所以我单独列出来来彰显它的重要性。

1、创建应用:

创建verfications应用

2、创建图片验证码:

关于图片验证码的内容我在前面博客中讲解过也有代码,大家可以自行查看获取,也可以直接拖到Pycharm中使用它。

3、配置缓存验证码的Redis数据库:

注释都很重要

    #缓存验证码
    "ver_code": {
        # 配置数据库引擎
        "BACKEND": "django_redis.cache.RedisCache",
        # 配置使用 Redis 的数据库名称
        "LOCATION": "redis://127.0.0.1:6379/2",#缓存到二号数据库当中
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient"
        }
    }

4、响应实现图片验证码,并且保存到Redis数据库:

class ImageCodeView(View):
    '''
    生成图片验证码
    '''
    def get(self,request,uuid):
        #调用生成验证码
        image,text=create_image()

        #将验证码保存到Redis数据库当中
        redis_conn=get_redis_connection('ver_code')
        redis_conn.setex('image_%s'%uuid,400,text)#uuid是一个唯一标识,保存时间是400秒
        return HttpResponse(image,content_type='image/png')

5、修改前端页面对于标签内容:

关于很多变量名称,都是与Ajax相关练习的。

<li>
							<label>图形验证码:</label>
							<input type="text" name="image_code" id="pic_code" class="msg_input"
                            v-model="image_code"@blur="check_image_code">
							<img v-bind:src="image_code_url" alt="图形验证码" class="pic_code"
                            @click="generate_image_code">
							<span class="error_tip"v-show="error_image_code">请填写图形验证码</span>
						</li>

6、分发路由:

主:

from django.contrib import admin
from django.urls import path,include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('',include('contents.urls')),#点击IP直接响应,''不写东西
    path('',include('users.urls')),
    path('',include('verfications.urls')),

]

分:

from django.urls import path,re_path
from verfications import views
urlpatterns=[
    re_path(r'^image_code/(?P<uuid>[\w-]+)/$',views.ImageCodeView.as_view()),
#响应图片验证码
    
]

六、短信验证码:

关于短信验证码其实也是属于验证码识别的内容,但是比较难,所以我单独拿出来。

1、前期准备:

短信验证码和前面图片验证码创建应用以及配置Redis属于一起,不需要再重新创建。

2、安装注册环境:

首先安装:pip install ronglian-sms-sdk

其次在https://console.yuntongxun.com/member/main

这个网站注册好账号就可以免费发送短信。

3、网站讲解:

注册好前面那个网站后找到短信开发手册-SDK参考-Python SDK:

4、创建短信验证码:

这里面有详细教程,但是可以直接按照我的代码来:

from ronglian_sms_sdk import SmsSDK
import json
accId = '容联云通讯分配的主账号ID'
accToken = '容联云通讯分配的主账号TOKEN'
appId = '容联云通讯分配的应用ID'

#单例模式
class CCP:
    _instance = None

    def __new__(cls, *args, **kwargs):
        # new 静态类方法,给对象分配内存空间
        if cls._instance is None:
            # 如果 类属性的数据为 None,说明当前这个类没有实例化对象
            # 给对象创建一个新的对象内存空间
            cls._instance = super().__new__(cls, *args, **kwargs)
        # 这个 new 方法是必须要有返回值,返回的是对象的引用
        return cls._instance

    def send_message(self, mobile, datas):
        sdk = SmsSDK(accId, accToken, appId)
        tid = '1'
        resp = sdk.sendMessage(tid, mobile, datas)
        resp = json.loads(resp)
        # 判断短信验证码是否发送成功
        if resp['statusCode'] == "000000":
            # 短信验证码发送成功
            return 0
        else:
            return -1

send_code=CCP()

5、前端页面响应:

<li>
    <label>短信验证码:</label>
    <input type="text" name="sms_code" id="msg_code" class="msg_input"
           v-model="sms_code" @blur="check_sms_code">
    <a @click="send_sms_code" class="get_msg_code">获取短信验证码</a>
    <span class="error_tip" v-show="error_sms_code">请填写短信验证码</span>
</li>

6、定义发送验证码的视图:

在发送验证码前我们得有个思路:

1、校验图片验证码(是否正确且在有效期内)

2、图片验证码正确,删除书记库的图片验证码 生成短信验证码数据

3、调用短信验证码的功能

4、保存短信验证码

在此之前先导入一个文件,方便各种标注语言的使用。

class SmsCodeViwe(View):
    '''
    发送图片验证码
    1、校验图片验证码(是否正确且在有效期内)
    2、图片验证码正确,删除书记库的图片验证码
    生成短信验证码数据
    3、调用短信验证码的功能
    4、保存短信验证码
    '''

    def get(self,request,mobile):
        #接受参数,uuid,用户输入的图片验证码
        uuid=request.GET.get('uuid')
        image_code_clinet=request.GET.get('image_code')

        #校验请求中的数据是否完整
        if not all([uuid,image_code_clinet]):
            return HttpResponseForbidden('缺少必要的参数')

        #从Redis数据库中获取到该用户生成的图片验证码
        redis_conn=get_redis_connection('ver_code')
        image_code_server=redis_conn.get('image_%s'%uuid)
        #校验验证码是否在有效期内
        if image_code_server is None:
            return JsonResponse({'code':RETCODE.IMAGECODEERR,'errmsg':'图片验证码失效'})
        #判断图片验证码是否正确
        image_code_server=image_code_server.decode()
        if image_code_server.lower()!=image_code_clinet.lower():
            return JsonResponse({'code': RETCODE.IMAGECODEERR, 'errmsg': '图片验证码输入有误'})

        #图片验证码正确,发送短信验证码
        #生成短信验证码
        sms_code='%05d'%random.randint(0,99999)

        #保存短信验证码
        redis_conn.setex("code_%s" %mobile,400,sms_code)

        #发送短信验证码:
        send_code.send_message(mobile,(sms_code,5))
        return JsonResponse({'code': RETCODE.OK, 'errmsg': '短信验证码发送成功'})

7、前端页面响应:
 

<li>
    <label>短信验证码:</label>
    <input type="text" name="sms_code" id="msg_code" class="msg_input"
           v-model="sms_code" @blur="check_sms_code">
    <a @click="send_sms_code" class="get_msg_code">[[ sms_code_tip ]]</a>
    <span class="error_tip" v-show="error_sms_code">请填写短信验证码</span>
    <!-- 获取后端校验短信验证码的异常信息-->
    {% if sms_code_errmsg %}
    <span style="color: red">{{ sms_code_errmsg }}</span>                            
    {% endif %} 
</li>
<li class="reg_sub">
    <input type="submit" value="注 册">
    <!-- 获取后端校验表单数据的异常信息-->
    {% if forms_errmsg %}
    <span style="color: red">{{ forms_errmsg }}</span>
    {% endif %}
</li>

8、分发路由:

主路由与图片验证码共享一个。

分路由:

re_path(r'^username/(?P<username>[A-Za-z0-9_]{5,15})/count/$' , views.UsernameCountView.as_view()),

9、校验用户名重复:

class UsernameCountView(View):
    '''
    判断用户名是否重复
    '''
    def get(self , request , username):
        # 根据参数从数据库获取用户数据
        count = User.objects.filter(username=username).count()
        return JsonResponse({'code':200 , 'errmsg':'OK' , 'count':count})

#总结:

本篇博客为Python项目前期准备与用户注册部分,其中包括使用Mysql+Redis,以及图片验证码和信息验证码的创建识别,后续小编会更新项目其它内容,欢迎大家关注,同时也欢迎大家评论指正。

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐