Django之基于session和CBV模式装饰器实现用户认证

models.py

from django.db import models


# Create your models here.
class User(models.Model):
    name = models.CharField(max_length=32)
    pwd = models.CharField(max_length=32)

urls

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^login/', views.Login.as_view()),
    url(r'^order/', views.Order.as_view()),
]

login.html

<form action="" method="post">
    <p>用户名:<input type="text" name="name"></p>
    <p>密码:<input type="text" name="pwd"></p>
    <input type="submit" value="登录">
</form>

views

from django.shortcuts import render, HttpResponse, redirect

# Create your views here.
from django.views import View
from app01 import models


def login_auth(func):
    def inner(request, *args, **kwargs):
        url = request.get_full_path()
        session_name = request.session.get('name')
        print(session_name)
        if request.session.get('name'):
            res = func(request, *args, **kwargs)
            return res
        else:
            return redirect('/login/?next=%s' % url)

    return inner


class Login(View):
    def get(self, request, *args, **kwargs):
        return render(request, 'login.html')

    def post(self, request, *args, **kwargs):
        name = request.POST.get('name')
        pwd = request.POST.get('pwd')
        ret = models.User.objects.filter(name=name, pwd=pwd).first()
        if ret:
            request.session['id'] = ret.pk
            request.session['name'] = ret.name
            url = request.GET.get('next')
            if url:
                return redirect(url)
            else:
                return redirect('/order/')
        else:
            return HttpResponse('登陆失败')


from django.utils.decorators import method_decorator


class Order(View):
    @method_decorator(login_auth)
    def get(self, request):
        return HttpResponse('订单页面')

猜你喜欢

转载自www.cnblogs.com/liweiwei0307/p/10008497.html