十日Python项目——第一天(用户注册)
本篇博客介绍了Python创建项目的前期准备与用户注册部分,包括图片验证码和信息验证码的创建识别等优质内容,内容言简意赅,代码都有注释,快来一起阅读吧!
#前言:
在最近十天我会用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,以及图片验证码和信息验证码的创建识别,后续小编会更新项目其它内容,欢迎大家关注,同时也欢迎大家评论指正。

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