django测试笔记-1.用户模块(后端部分)

models模块的用户模块包括了一下几个部分

  • 用户的id号(主关键字)
  • 用户名的存储
  • 用户的密码存储
  • 用户的地址
  • 用户的电话联系方式
  • 用户的邮箱账号信息
  • 用户的账号头像

用户模块的定义如下:

  1. class user(models.Model):
  2. userid=models.IntegerField()
  3. username=models.CharField(max_length=20)
  4. userpassword=models.CharField(max_length=20)
  5. useraddress=models.CharField(max_length=250)
  6. userphone=models.IntegerField(max_length=11)
  7. userEmail=models.CharField(max_length=20)
  8. userAvatar=models.CharField(max_length=255)
  9. class Meta:
  10. 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’)

  1. <br />注意:我们在加载过程中会出出现django中html页面的css和js部分不能加载的问题,为了解决这一问题,我的解决方法是
  2. - 找到主文件的**settings.py**
  3. - 我们在最后的**STATIC_URL = '/static/'**之后添加如下操作:```python
  4. STATICFILES_DIRS = [
  5. (os.path.join(BASE_DIR, 'static'))
  6. ]
  • 在主目录下新建static文件夹,并在其中添加
    • css目录:用于存放css文件
    • js目录:用于存放js文件
      • 三个界面的功能实现
  • 登陆界面

    • 简单实现

        1. def logins(request):
        2. num1=request.GET.get("num1")
        3. num2=request.GET.get("num2")
        4. users=user.objects.filter(username=num1,userpassword=num2)
        5. if users:
        6. return HttpResponse("登陆成功")
        7. else:
        8. 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>
          这点很重要,请千万不要忘记了哦。
    • 复杂实现

        1. def login(request):
        2. if request.method == "POST":
        3. username = request.POST.get('username', None)
        4. password = request.POST.get('password', None)
        5. if username and password: # 确保用户名和密码都不为空
        6. username = username.strip()
        7. # 用户名字符合法性验证
        8. # 密码长度验证
        9. # 更多的其它验证.....
        10. try:
        11. user = models.User.objects.get(name=username)
        12. except:
        13. return render(request, 'login/login.html')
        14. if user.password == password:
        15. return redirect('/index/')
        16. return render(request, 'login/login.html')
        • 注意:
          • 通过唯一的用户名,使用Django的ORM去数据库中查询用户数据,如果有匹配项,则进行密码对比,如果没有匹配项,说明用户名不存在。如果密码对比错误,说明密码不正确。
    • 当然你也可以于此同时返回一个信息

        1. def login(request):
        2. if request.method == "POST":
        3. username = request.POST.get('username', None)
        4. password = request.POST.get('password', None)
        5. message = "所有字段都必须填写!"
        6. if username and password: # 确保用户名和密码都不为空
        7. username = username.strip()
        8. # 用户名字符合法性验证
        9. # 密码长度验证
        10. # 更多的其它验证.....
        11. try:
        12. user = models.User.objects.get(name=username)
        13. if user.password == password:
        14. return redirect('/index/')
        15. else:
        16. message = "密码不正确!"
        17. except:
        18. message = "用户名不存在!"
        19. return render(request, 'login/login.html', {"message": message})
        20. return render(request, 'login/login.html')
      • 注意:

        • 增加了message变量,用于保存提示信息。当有错误信息的时候,将错误信息打包成一个字典,然后作为第三个参数提供给render()方法。这样做可以保证可以让用户明白他出错的位置。
  • 注册界面

    • 简单实现:

        1. def registers(request):
        2. num1 = request.GET.get("num1")
        3. num2 = request.GET.get("num2")
        4. num3 = request.GET.get("num3")
        5. users = user.objects.filter(username=num1)
        6. if users:
        7. return HttpResponse('用户名已存在!')
        8. else:
        9. User_User = user()
        10. User_User.username=num1
        11. User_User.userpassword=num2
        12. User_User.userphone=num3
        13. User_User.save()
        14. return HttpResponse('用户注册成功')
      • 注意:

        • 记得我前面说过这么一个问题吗,就是,会不会存在两个张三的问题呢,我现在就来解决这个问题吧。在你插入的过程中我可以先在数据库中进行查询,当数据库中的数据都不匹配时,及没有重复的项时,你的这条数据才能被插入到数据库中。
        • 当然如果我不想返回这样的字符串,我也可以这样做,及返回一个状态码,不同的状态码代表着不同的状态类型,比如说,我现在登陆成功了,我就可以让他返回一个200的状态码———
    • 复杂实现

        1. def register(request):
        2. if request.session.get('is_login', None):
        3. # 登录状态不允许注册。你可以修改这条原则!
        4. return redirect("/index/")
        5. if request.method == "POST":
        6. register_form = RegisterForm(request.POST)
        7. message = "请检查填写的内容!"
        8. if register_form.is_valid(): # 获取数据
        9. username =register_form.cleaned_data['username']
        10. password1 = register_form.cleaned_data['password1']
        11. password2 = register_form.cleaned_data['password2']
        12. email =register_form.cleaned_data['email']
        13. if password1 != password2: # 判断两次密码是否相同
        14. message = "两次输入的密码不同!"
        15. return render(request, 'login/register.html', locals())
        16. else:
        17. same_name_user = models.User.objects.filter(name=username)
        18. if same_name_user: # 用户名唯一
        19. message = '用户已经存在,请重新选择用户名!'
        20. return render(request, 'login/register.html', locals())
        21. same_email_user = models.User.objects.filter(email=email)
        22. if same_email_user: # 邮箱地址唯一
        23. message = '该邮箱地址已被注册,请使用别的邮箱!'
        24. return render(request, 'login/register.html', locals())
        25. # 当一切都OK的情况下,创建新用户
        26. new_user = models.User.objects.create()
        27. new_user.name = username
        28. new_user.password = password1
        29. new_user.email = email
        30. new_user.sex = sex
        31. new_user.save()
        32. return redirect('/login/') # 自动跳转到登录页面
        33. register_form = RegisterForm()
        34. return render(request, 'login/register.html', locals())
      • 注意;

        • 从大体逻辑上,也是先实例化一个RegisterForm的对象,然后使用is_valide()验证数据,再从cleaned_data中获取数据。
          重点在于注册逻辑,首先两次输入的密码必须相同,其次不能存在相同用户名和邮箱,最后如果条件都满足,利用ORM的API,创建一个用户实例,然后保存到数据库内。
        • 其中的RegisterForm为一个表单对象。你需要在使用之前一定要要先定义他。
    • 我们在数据库中的密码如果我们不想存放明文怎么办呢

      • 我们可以用哈希加密算法进行加密
        • 具体实现请参照我的本人博客的图相关算法总结
      • 我们还可以使用林一种解决方法,及使用自带的加密算法

        • 当然在使用之前,我们要先进行导包

          • python from django.contrib.auth.hashers import make_password
        • 在使用之后,我们就可以对我们进入数据库的数据进行加密了

            1. password=make_password(password)
        • 当我们进行加密之后,肯定要进行解密吧

            1. check_password(密码,加密码)
    • 修改密码界面:

      • 我们在使用中一定遇到过自己的密码不安全啊,或者自己去修改密码的经历吧,那请进入我们的第三个界面
        1. def Forgetpasswords(request):
        2. num1 = request.GET.get("num1")
        3. num2 = request.GET.get("num2")
        4. num3 = request.GET.get('num3')
        5. users = user.objects.filter(username=num1, userpassword=num2)
        6. if users:
        7. userUser=user.objects.get(username=num1)
        8. userUser.userpassword=num3
        9. return HttpResponse('修改密码成功')
        10. else:
        11. return HttpResponse('账号或密码错误')

        重置密码大概实现就是这样,如果像加一些别的功能,请调用已有的api吧。