配置用户认证登录
在每个URL中,也就是对应Views.py的每个class中都可以对用户是否登录进行判断,如果用户未登录就自动跳转到登录界面
语法为: if request.user.is_authenticated():
本章重点:
from django.contrib.auth import authenticate, login, logout
authenticate: Django的authenticate(username,password)实现用户名和密码的认证,而不用我们写逻辑去数据库中判断。
login: Django的login(request, user) 真正帮我们实现用户登录。
logout: Django的logout(request) 可以帮我们直接用户注销
View逻辑配置
class LoginView(View): """ 登录验证 """ def get(self, request): return render(request, "login.html", {}) def post(self, request): login_form = LoginForm(request.POST) if login_form.is_valid(): user_name = request.POST.get("username", "") pass_word = request.POST.get("password", "") user = authenticate(username=user_name, password=pass_word) if user: if user.is_active: login(request, user) return render(request, "index.html") else: return render(request, "login.html", {"msg": u"用户还未激活!"}) else: return render(request, "login.html", {"login_form": login_form, "msg": u"用户名或密码错误!"}) else: return render(request, "login.html", {"login_form": login_form})
配置 urls.py
添加index,login
from users.views import LoginView urlpatterns = [
url(r'^login/$', LoginView.as_view(), name="login"),
]
index页面代码,登录部分
这里需要注意使用 request.user.is_authenticated方法, 可以检查用户是否登录,然后进行逻辑判断
{% if request.user.is_authenticated %} <div class="top"> <div class="wp"> <div class="fl"><p>服务电话:<b>33333333</b></p></div> <!--登录后跳转--> ...... </div> </div> {% else %} <div class="top"> <div class="wp"> <div class="fl"><p>服务电话:<b>33333333</b></p></div> <a style="color:white" class="fr registerbtn" href="{% url "register" %}">注册</a> <a style="color:white" class="fr loginbtn" href="{% url "login" %}">登录</a> </div> </div> {% endif %}
login页面代码
<form action="{% url "login" %}" method="post" autocomplete="off"> <div class="form-group marb20 {% if login_form.errors.username %}errorput{% endif %}"> <label>用 户 名</label> <input name="username" id="account_l" value="{{ login_form.username.value }}" type="text" placeholder="手机号/邮箱" /> </div> <div class="form-group marb8 {% if login_form.errors.password %}errorput{% endif %}"> <label>密 码</label> <input name="password" id="password_l" value="{{ login_form.password.value }}" type="password" placeholder="请输入您的密码" /> </div> <div class="error btns login-form-tips" id="jsLoginTips">{% for key,error in login_form.errors.items %}{{ error }}{% endfor %}{{ msg }}</div> <div class="auto-box marb38"> <a class="fr" href="forgetpwd.html">忘记密码?</a> </div> <input class="btn btn-green" id="jsLoginBtn" type="submit" value="立即登录 > " /> {% csrf_token %} </form>
logoutView
这里利用 django.core.urlresolvers.reverse 实现 index页面反转,通过url将index页面跳转给用户。
如果直接使用return render(request, "index") url不会改变,还是在logout.
class LoginoutView(View): """ 用户注销 """ def get(self, request): logout(request) from django.core.urlresolvers import reverse return HttpResponseRedirect(reverse("index"))