美文网首页
Django用自己的方法实现登陆注册

Django用自己的方法实现登陆注册

作者: kris_lp | 来源:发表于2018-05-07 21:10 被阅读0次

    一、注册

    1.创建用户model

    from django.db import models
    
    
    # Create your models here.
    class User(models.Model):
        u_name = models.CharField(max_length=20)
        u_password = models.CharField(max_length=255)
        u_ticket = models.CharField(max_length=20)
    
        class Meta:
            db_table = 'p427_user'
    

    2.创建url

    from django.conf.urls import url
    
    from axf_app import views
    
    urlpatterns = [
        url(r'^regist/', views.regist, name='regist'),
    ]
    

    3.创建views

    知识点:

    1.获取页面上传的文件
    request.FILES.get()

    def regist(request):
    
        if request.method == 'GET':
            return render(request, 'day6_regist.html')
    
        if request.method == 'POST':
            User.objects.create(
                u_name=request.POST.get('name'),
                u_password=request.POST.get('password'),
            )
            return HttpResponseRedirect('/uauth/login/')
    

    二、登陆

    1.创建url

    urlpatterns = [
        url(r'^login/', views.login, name='login'),
    ]
    

    2.创建views

    知识点:

    1.set_cookie()
    给浏览器的cookies绑定参数,如上把ticket绑定在cookies中,参数max_age 表示最大存货时间,单位时秒;也可以使用 expires,表示过期时间。

    def login(request):
    
        if request.method == 'GET':
            return render(request, 'day6_login.html')
    
        if request.method == 'POST':
            name = request.POST.get('name')
            if User.objects.filter(u_name=name).exists():
                user = User.objects.get(u_name=name)
                if user.u_password == request.POST.get('password'):
                    # ticket = 'dssfssfsf'
                    s = 'qwertyuiopasdfghjklzxcvbnm1234567890'
                    ticket = ''
                    for i in range(15):
                        # 获取随机字符串
                        ticket += random.choice(s)
                    now_time = int(time.time())
                    ticket = 'TK_' + ticket + str(now_time)
                    # response = HttpResponse('登陆成功')
                    response = HttpResponseRedirect('/stuapp/index/')
                    # max_age 存活时间 / ticket 保存的最长时间
                    response.set_cookie('ticket', ticket, max_age=1000)
                    user.u_ticket = ticket
                    user.save()
                    return response
                else:
                    return render(request, 'day6_login.html', {'password': '密码错误'})
            else:
                return render(request, 'day6_login.html', {'name': '用户名不存在'})
    

    3.中间件 — 判断用户是否登陆

    当用户登陆时,给用户生成一个ticket,同时存于页面和服务器。当用户做其他操作时(跳转页面),通过ticket的值判断用户是否登陆,只有登陆成功的用户才能进行一系列操作。
    比如进入淘宝页面,若想要查看购物车或订单都需要先验证用户是否登陆,若用户登陆成功,可查询该用户的数据,返回对应页面,若用户未登陆,跳转至登陆页面。

    from django.utils.deprecation import MiddlewareMixin
    from django.http import HttpResponseRedirect
    
    from uauth.models import User
    
    
    class AuthMiddleware(MiddlewareMixin):
    
        def process_request(self, request):
            # 统一验证是否登陆
            # return None 或者不写return 才会继续往下执行
            if request.path == '/uauth/login/' or request.path == '/uauth/regist/':
                return None
            ticket = request.COOKIES.get('ticket')
            if not ticket:
                return HttpResponseRedirect('/uauth/login/')
    
            users = User.objects.filter(u_ticket=ticket)
            if not users:
                return HttpResponseRedirect('/uauth/login/')
            # 在request中存储当前登陆的用户
            request.user = users[0]
    
    cookie知识点:

    a.页面保存cookie的ticket属性
    参数:
    max_age - 最大存货时间,单位:秒
    expires - 过期时间,是一个年月日时间


    15.png

    b.获取页面cookie的ticket值


    16.png

    c.删除页面cookie的ticket值


    17.png

    4.退出登陆

    用户退出登陆,删除页面和服务器中的ticket。由于用户每次重新登陆时都会生成新的ticket,并且更新服务器中ticket的内容,所以此处服务器中的ticket可以不用删除。

    def logout(request):
        if request.method == 'GET':
            response = HttpResponseRedirect('/uauth/login/')
            response.delete_cookie('ticket')
            return response
    

    相关文章

      网友评论

          本文标题:Django用自己的方法实现登陆注册

          本文链接:https://www.haomeiwen.com/subject/aofbrftx.html