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

一、注册

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用自己的方法实现登陆注册)