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)
