login_required介绍
判断用户是否登录, 如果用户没有登录, 默认会跳转到'/accounts/login/', 并且URL会自动加上你请求的url作为登录后的跳转地址, 如:'/accounts/login/?next=/user/address/'登入完后会去请求'/user/address/', 如果登录了, 会正常执行
设置默认跳转URL
在settings.py中通过设置LOGIN_URL参数来设定
# 配置登录url地址 LOGIN_URL = '/user/login/'
函数视图使用
views.py
from django.contrib.auth.decorators import login_required
@login_required def Order(request): return render(request, 'user_center_order.html')
类视图使用
方法一: 将views.UserOrderViews.as_view()当做参数传入login_required
from django.contrib.auth.decorators import login_required from . import views app_name = 'user' urlpatterns = [ url(r'^login/', views.LoginView.as_view(), name='login'), url(r'^order/', login_required(views.UserOrderView.as_view()), name='order'), ]
方法二: 重写as_view方法, 类函数继承该父类
utils/mixin.py
from django.contrib.auth.decorators import login_required class LoginRequiredMixin(object): @classmethod def as_view(cls, **initkwargs): view = super(LoginRequiredMixin, cls).as_view(**initkwargs) return login_required(view)
from utils.mixin import LoginRequiredMixin
class UserOrderView(LoginRequiredMixin, View): def get(self, request): return render(request, 'user_center_order.html', {'msg': 'order'})
登录跳转逻辑
class LoginView(View): def get(self, request): ''' 判断COOKIE中是否保存用户名, 保存了用户名则传入用户名, 达到记住用户名的效果 :param request: :return: ''' back_dic = {'username': '', 'checked': ''} if 'username' in request.COOKIES: back_dic['username'] = request.COOKIES.get('username', '') back_dic['checked'] = 'checked' return render(request, 'login.html', back_dic) def post(self, request): ''' 登录验证 :param request: :return: ''' back_dict = {'code': 200, 'msg': ''} username = request.POST.get('username', '') password = request.POST.get('pwd', '') # 使用了login_required未登录会传入next参数, 没有传入则为index next_url = request.GET.get('next', reverse('goods:index')) if not (username and password): back_dict['msg'] = '数据不完整!' return redirect(request, 'login.html', back_dict) user = authenticate(request, username=username, password=password) if user is not None: # 判断是否激活 if user.is_active: login(request, user) # 跳转到next的路由 response = redirect(next_url) remember = request.POST.get('remember', '') # 判断是否记住用户名 if remember == 'on': response.set_cookie('username', username, 7 * 24 * 3600) else: response.delete_cookie('username') return response else: back_dict['msg'] = '账号未激活!' return render(request, 'login.html', back_dict) else: back_dict['msg'] = '用户名或密码不正确' return render(request, 'login.html', back_dict)
