login_required 装饰器
1.直接调用
在路由中应用login_required装饰器user/urls.py
from django.conf.urls import url from user.views import RegisterView, ActiveView, LoginView, UserInfoView, UserOrderView, AddressView # 导入视图类 from django.contrib.auth.decorators import login_required # login_required登录验证装饰器 urlpatterns = [ # url(r'^register$', views.register, name='register'), # url(r'^register_handle$', views.register_handle, name='register_handle'), # url(r'^login$', views.login, name='login'), url(r'^register$', RegisterView.as_view(), name='register'), # 用户注册 url(r'^active/(.*)$', ActiveView.as_view(), name='active'), # 用户激活 url(r'^login$', LoginView.as_view(), name='login'), # 用户激活 url(r'^$', login_required(UserInfoView.as_view()), name='user'), # 用户激活 使用登录验证 url(r'^order$', UserOrderView.as_view(), name='order'), # 用户激活 url(r'^address$', AddressView.as_view(), name='address'), # 用户激活 ]
login_required()完成下面的事情:
- 如果用户没有登入,则重定向到settings.LOGIN_URL,并将当前访问的绝对路径传递到查询字符串中。例如:/accounts/login/?next=/polls/3/。
- 如果用户已经登入,则正常执行视图。视图的代码可以安全地假设用户已经登入。
settings.py中配置跳转得登录路由
# 登录地址 LOGIN_URL = '/user/login' # 如果没登录会跳转这里登录
如果登录了,跳转到先前访问得地址
class LoginView(View): '''登录''' def get(self, request): '''显示登录页面''' # 判断是否记住用户名 if 'username' in request.COOKIES: username = request.COOKIES.get('username') checked = 'checked' else: username= '' checked = '' # 使用模板 return render(request, 'login.html', {'username':username, 'checked':checked}) def post(self, request): '''登录校验''' # 接收数据 username = request.POST.get('username') password = request.POST.get('pwd') # print(username) # print(password) # 校验数据 if not all([username, password]): return render(request, 'login.html', {'errmsg':'数据不完整'}) user = authenticate(username=username, password=password) # 查找数据库,有的话返回user信息 没有的话返回None print(user.password) if user is not None: # 用户名和密码正确 # 验证是否激活 if user.is_active: # 用户已激活 # 记录用户登录状态 # print(user.is_active) flag = login(request, user) # django.contrib.auth中的login方法 # 跳转到首页 # response = redirect(reverse('goods:index')) # HttpResponseRedirct # 接收当前访问的地址 next_url = request.GET.get('next', reverse('goods:index')) # get() 第二个参数设置默认地址 # 登录校验 如果登录了 跳转到先前访问的地址 response = redirect(next_url) # 判断是否要记住用户名 remember = request.POST.get('remember') print(remember) if remember == 'on': # 记住用户名 response.set_cookie('username', username, max_age=7*24*3600) # 记录cookie else: response.delete_cookie('username') # 返回response return response else: return render(request, 'login.html', {'errmsg':'用户尚未激活'}) else: # 用户名或密码错误 return render(request, 'login.html', {'errmsg':'用户名或密码错误'})
2.封装方法 基于类视图使用Mixin
创建一个工具包utils
创建mixin.py文件 封装as_view() 方法的Mixin
from django.contrib.auth.decorators import login_required # 导入登录认证包 class LoginRequiredMinxin(object): @classmethod def as_view(cls, **initkwargs): view = super(LoginRequiredMinxin, cls).as_view(**initkwargs) return login_required(view)
需要登录认证得视图函数继承LoginRequiredMixin类即可
from utils.mixin import LoginRequiredMinxin # 用户信息中心 # /user class UserInfoView(LoginRequiredMinxin, View): def get(self, request): '''显示用户信息页面''' return render(request, 'user_center_info.html', {'page':'user'}) # 用户订单中心 # /user/order class UserOrderView(LoginRequiredMinxin, View): def get(self, request): '''显示用户信息页面''' return render(request, 'user_center_order.html', {'page':'order'}) # 用户地址 # /user/address class AddressView(LoginRequiredMinxin, View): def get(self, request): '''显示用户信息页面''' return render(request, 'user_center_site.html', {'page':'address'})
路由urls.py
url(r'^$', UserInfoView.as_view(), name='user'), # 用户激活 使用登录验证 url(r'^order$', UserOrderView.as_view(), name='order'), # 用户激活 url(r'^address$', AddressView.as_view(), name='address'), # 用户激活
基于类视图函数得简介:https://yiyibooks.cn/xx/django_182/topics/class-based-views/intro.html