django测试笔记-1.用户模块(后端部分)
models模块的用户模块包括了一下几个部分
- 用户的id号(主关键字)
- 用户名的存储
- 用户的密码存储
- 用户的地址
- 用户的电话联系方式
- 用户的邮箱账号信息
- 用户的账号头像
用户模块的定义如下:
class user(models.Model):
userid=models.IntegerField()
username=models.CharField(max_length=20)
userpassword=models.CharField(max_length=20)
useraddress=models.CharField(max_length=250)
userphone=models.IntegerField(max_length=11)
userEmail=models.CharField(max_length=20)
userAvatar=models.CharField(max_length=255)
class Meta:
db_table='user'
下面是三个界面的加载问题了,
- 三个界面的的分别加载问题```python def index(request): return render(request,’index.html’)
def register(request): return render(request,’register.html’)
def Forgetpassword(request): return render(request, ‘Forget.html’)
<br />注意:我们在加载过程中会出出现django中html页面的css和js部分不能加载的问题,为了解决这一问题,我的解决方法是
- 找到主文件的**settings.py**
- 我们在最后的**STATIC_URL = '/static/'**之后添加如下操作:```python
STATICFILES_DIRS = [
(os.path.join(BASE_DIR, 'static'))
]
- 在主目录下新建static文件夹,并在其中添加
- css目录:用于存放css文件
- js目录:用于存放js文件
- 三个界面的功能实现
登陆界面
简单实现
def logins(request):
num1=request.GET.get("num1")
num2=request.GET.get("num2")
users=user.objects.filter(username=num1,userpassword=num2)
if users:
return HttpResponse("登陆成功")
else:
return HttpResponse("登陆失败")
解释:
- 得到两个框里的内容,并且去在数据库中去进行寻找,看到这里你应该会有一个疑问吧,就是如果存在两个张三呢,或者存在两个李四呢,先不用着急,请往下看。
- 当前端使用post方法进行传输时,请前端开发者不要忘记{% csrf_token %},及效果如下:
html <form class='form-login' action="/login/" method="post"> {% csrf_token %} <h2 class="text-center">欢迎登录</h2> <div class="form-group"> ...... </form>
这点很重要,请千万不要忘记了哦。
复杂实现
def login(request):
if request.method == "POST":
username = request.POST.get('username', None)
password = request.POST.get('password', None)
if username and password: # 确保用户名和密码都不为空
username = username.strip()
# 用户名字符合法性验证
# 密码长度验证
# 更多的其它验证.....
try:
user = models.User.objects.get(name=username)
except:
return render(request, 'login/login.html')
if user.password == password:
return redirect('/index/')
return render(request, 'login/login.html')
- 注意:
- 通过唯一的用户名,使用Django的ORM去数据库中查询用户数据,如果有匹配项,则进行密码对比,如果没有匹配项,说明用户名不存在。如果密码对比错误,说明密码不正确。
当然你也可以于此同时返回一个信息
def login(request):
if request.method == "POST":
username = request.POST.get('username', None)
password = request.POST.get('password', None)
message = "所有字段都必须填写!"
if username and password: # 确保用户名和密码都不为空
username = username.strip()
# 用户名字符合法性验证
# 密码长度验证
# 更多的其它验证.....
try:
user = models.User.objects.get(name=username)
if user.password == password:
return redirect('/index/')
else:
message = "密码不正确!"
except:
message = "用户名不存在!"
return render(request, 'login/login.html', {"message": message})
return render(request, 'login/login.html')
注意:
- 增加了message变量,用于保存提示信息。当有错误信息的时候,将错误信息打包成一个字典,然后作为第三个参数提供给render()方法。这样做可以保证可以让用户明白他出错的位置。
注册界面
简单实现:
def registers(request):
num1 = request.GET.get("num1")
num2 = request.GET.get("num2")
num3 = request.GET.get("num3")
users = user.objects.filter(username=num1)
if users:
return HttpResponse('用户名已存在!')
else:
User_User = user()
User_User.username=num1
User_User.userpassword=num2
User_User.userphone=num3
User_User.save()
return HttpResponse('用户注册成功')
注意:
- 记得我前面说过这么一个问题吗,就是,会不会存在两个张三的问题呢,我现在就来解决这个问题吧。在你插入的过程中我可以先在数据库中进行查询,当数据库中的数据都不匹配时,及没有重复的项时,你的这条数据才能被插入到数据库中。
- 当然如果我不想返回这样的字符串,我也可以这样做,及返回一个状态码,不同的状态码代表着不同的状态类型,比如说,我现在登陆成功了,我就可以让他返回一个200的状态码———
复杂实现
def register(request):
if request.session.get('is_login', None):
# 登录状态不允许注册。你可以修改这条原则!
return redirect("/index/")
if request.method == "POST":
register_form = RegisterForm(request.POST)
message = "请检查填写的内容!"
if register_form.is_valid(): # 获取数据
username =register_form.cleaned_data['username']
password1 = register_form.cleaned_data['password1']
password2 = register_form.cleaned_data['password2']
email =register_form.cleaned_data['email']
if password1 != password2: # 判断两次密码是否相同
message = "两次输入的密码不同!"
return render(request, 'login/register.html', locals())
else:
same_name_user = models.User.objects.filter(name=username)
if same_name_user: # 用户名唯一
message = '用户已经存在,请重新选择用户名!'
return render(request, 'login/register.html', locals())
same_email_user = models.User.objects.filter(email=email)
if same_email_user: # 邮箱地址唯一
message = '该邮箱地址已被注册,请使用别的邮箱!'
return render(request, 'login/register.html', locals())
# 当一切都OK的情况下,创建新用户
new_user = models.User.objects.create()
new_user.name = username
new_user.password = password1
new_user.email = email
new_user.sex = sex
new_user.save()
return redirect('/login/') # 自动跳转到登录页面
register_form = RegisterForm()
return render(request, 'login/register.html', locals())
注意;
- 从大体逻辑上,也是先实例化一个RegisterForm的对象,然后使用
is_valide()
验证数据,再从cleaned_data
中获取数据。
重点在于注册逻辑,首先两次输入的密码必须相同,其次不能存在相同用户名和邮箱,最后如果条件都满足,利用ORM的API,创建一个用户实例,然后保存到数据库内。 - 其中的RegisterForm为一个表单对象。你需要在使用之前一定要要先定义他。
- 从大体逻辑上,也是先实例化一个RegisterForm的对象,然后使用
我们在数据库中的密码如果我们不想存放明文怎么办呢
- 我们可以用哈希加密算法进行加密
- 具体实现请参照我的本人博客的图相关算法总结
我们还可以使用林一种解决方法,及使用自带的加密算法
当然在使用之前,我们要先进行导包
- 及
python from django.contrib.auth.hashers import make_password
- 及
在使用之后,我们就可以对我们进入数据库的数据进行加密了
password=make_password(password)
当我们进行加密之后,肯定要进行解密吧
check_password(密码,加密码)
- 我们可以用哈希加密算法进行加密
修改密码界面:
- 我们在使用中一定遇到过自己的密码不安全啊,或者自己去修改密码的经历吧,那请进入我们的第三个界面
def Forgetpasswords(request):
num1 = request.GET.get("num1")
num2 = request.GET.get("num2")
num3 = request.GET.get('num3')
users = user.objects.filter(username=num1, userpassword=num2)
if users:
userUser=user.objects.get(username=num1)
userUser.userpassword=num3
return HttpResponse('修改密码成功')
else:
return HttpResponse('账号或密码错误')
重置密码大概实现就是这样,如果像加一些别的功能,请调用已有的api吧。