10.用户登陆

1. index页面

在url.py文件下写入以下代码设置index

代码中的'hello.html'为你的index页面

from django.views.generic import TemplateView

urlpatterns = [
    url('^$', TemplateView.as_view(template_name='hello.html'), name="index"),
    ]

静态问件配置

在settings.py文件中最后一行修改成以下代码

STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]

2.登陆

基于类的书写

# _*_ coding: utf-8 _*_
from django.shortcuts import render
from django.contrib.auth import authenticate, login
from django.contrib.auth.backends import ModelBackend
from django.db.models import Q
from django.views.generic.base import View


from users.models import UserProfile
from .forms import LoginForm

# 登录
class LoginView(View):
    # 禁止get方法登录
    def get(self, request):
        return render(request, "login.html", {})

    # post方法登录
    def post(self, request):
        login_form = LoginForm(request.POST) # from表单 需要创建forms.py文件
        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 is not None:
                if user.is_active:
                    login(request, user)
                    return render(request, "index.html")
                else:
                    return render(request, "login.html", {"msg":"用户未激活!"})
            else:
                return render(request, "login.html", {"msg": "用户名或密码错误"})
        else:
            return render(request, "login.html", {"login_form": login_form})

在url.py中配置url

from users.views import LoginView

urlpatterns = [

    # 登陆
    url('^login/$', LoginView.as_view(), name="login"),
    # 注册
    url('^register/$', TemplateView.as_view(template_name='register.html'), name="register"),
    ]

==ps==:在写前端登陆注册页面时,form表单中需要加{% csrf_token %} 不然会报403错误

3. 重载auth方法

1.在settings.py中加入以下内容

AUTH_USER_MODEL = "users.UserProfile"

在views中加入以下代码

# _*_ coding: utf-8 _*_
from django.shortcuts import render
from django.contrib.auth import authenticate, login
from django.contrib.auth.backends import ModelBackend
from django.db.models import Q

from users.models import UserProfile


# 重载auth方法,用户名邮箱手机号都可以登录
class CustomBakend(ModelBackend):
    def authenticate(self, username=None, password=None, **kwargs):
        try:
            user = UserProfile.objects.get(Q(username=username) | Q(email=username) | Q(moblie=username))
            if user.check_password(password):
                return user
        except Exception as e:
            return None

4.登陆状态与未登录状态前端页面

{% if request.user.is_authenticated %}
                <!--登录后状态-->
                <div class="top">
                <div class="wp">
                    <div class="fl"><p>服务电话:<b>33333333</b></p></div>
                        <div class="personal">
                            <dl class="user fr">
                                <dd>{{request.user}}<img class="down fr" src="/static/images/top_down.png"/></dd>
                                <dt><img width="20" height="20" src="/static/media/image/2016/12/default_big_14.png"/></dt>
                            </dl>
                            <div class="userdetail">
                                <dl>
                                    <dt><img width="80" height="80" src="/static/media/image/2016/12/default_big_14.png"/></dt>
                                    <dd>
                                        <h2>django</h2>
                                        <p>{{request.user}}</p>
                                    </dd>
                                </dl>
                                <div class="btn">
                                    <a class="personcenter fl" href="usercenter-info.html">进入个人中心</a>
                                    <a class="fr" href="/logout/">退出</a>
                                </div>
                            </div>
                        </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 %}

5.重载auth方法使邮箱也能登陆

  1. 在setting中加入
# Application definition
AUTHENTICATION_BACKENDS = (
    'users.views.CustomBackend',
)
  1. 在view.py中写
from django.contrib.auth.backends import ModelBackend
from .models import UserProfile
from django.db.models import Q
# 重载auth方法使邮箱可以作为用户名登陆
class CustomBackend(ModelBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        try:
            # Q语法中 |代表或  ,代表且
            user = UserProfile.objects.get(Q(username=username) | Q(email=username))
            if user.check_password(password):
                return user
        except Exception as e:
            return None

6.用户登出

  1. view.py中写
from django.contrib.auth import authenticate, login, logout
from django.http import HttpResponse, HttpResponseRedirect
#from django.urls import reverse
from django.core.urlresolvers import reverse


# 登出
class LogoutView(View):
    def get(self, request):
        logout(request)
        return HttpResponseRedirect(reverse("index"))
  1. 在urls.py中写
url('^logout/$', Views.LogoutView.as_view(), name="logout"),
  1. 页面中使用
<a  href="/logout/">退出</a>