Django打造在线教育平台_day_4: 页面(首页、登陆)配置与登陆功能实现

1、文件目录分析css

MxOnline/urls.py:连接入口,关联到对应的views.py中的一个类(函数),访问的连接就对应一个类
templates:存放html文件夹
user(app)/adminx.py:后台文件
user(app)/form.py:表单,用户在浏览器上输入提交,对数据的验证工做以及输入框的生成工做
user(app)/models.py:与数据库操做相关,存入或者读取数据时使用。
user(app)/views.py:处理用户发出的请求,从urls.py中对应而来,经过渲染templates中的网页能够为用户显示页面内容。

2、配置首页与登陆页面html

一、把index.html(首页)与login.html(登陆)文件复制到项目templates目录下前端

三、在urls.py文件夹中配置index.html(首页)与login.html(登陆)数据库

from django.conf.urls import url
from django.views.generic import TemplateView
import xadmin

from users.views import LoginView
urlpatterns = [
    url(r'^$', TemplateView.as_view(template_name='index.html'), name='index'),  # 首页
    url(r'^login/$', LoginView.as_view(), name='login'),  # 登陆页面
]

四、在settings.py文件中配置静态文件路径django

#在文件最后添加
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),  #配置css\js\images\media文件路径
)

#实现自定义登陆功能(用户名和邮箱均可以登陆)
AUTHENTICATION_BACKENDS = (
    'users.views.CustomBackend',
)

五、修改index.htm与login.htmll文件:后端

<html>
    {% load staticfiles %} # 添加,让连接修改起做用
    <link rel="stylesheet" type="text/css" href="{% static 'css/reset.css' %}">  #修改前:../css/reset.css
  <div class="close jsCloseDialog"><img src="{% static 'images/dig_close.png' %}"/></div> #修改css\js\images\media
  <form action= {%url 'index(login)'%}>
  ......
  <div class= "{%if login_form.errors.username(password) %} errorput {%endif%}"></div> #输入框错误高亮显示
  <div id="jsLoginTips">{% for key,error in login_form.errors.items%}{{ error }}{% endfor %}{{ msg }}</div> # 错误提示
  {% csrf_token %} # 解决:禁止访问,CSRF验证失败,相应中段的错误
  </form>
  
{% if request.user.is_authenticated %} #登陆成功,显示我的中心
  <div class="personal">......</div>
{% else %} # 不然显示登陆页面
  <a style="color:white" class="fr registerbtn"href="register.html">注册</a>
  <a style="color:white" class="fr loginbtn" href="{% url 'login' %}">登陆</a>
{% endif %} 
</html>

2、登陆功能实现浏览器

 

一、功能分析app

  表单输入验证form.py函数

  后端验证views.pypost

  用户名和邮箱登陆views.py

三、在form.py文件中实现表单输入验证

from django import forms

class LoginForm(forms.Form):
    """表单输入预检查功能(在连接数据库以前)"""
    # username\password两个变量与相应htmlform表单中的name要彻底同样,否则功能无效
    username = forms.CharField(required=True)  # required=True输入不能为空
    password = forms.CharField(required=True, min_length=8)  # 最小长度8

四、在views.py文件中实现后端验证与用户(邮箱登陆)

from django.db.models import Q
from django.views.generic.base import View
from django.contrib.auth.hashers import make_password  # 对密码加密模块
from .models import UserProfile

class CustomBackend(ModelBackend):
    """自定义邮箱与帐户登陆"""
    def authenticate(self, username=None, password=None, **kwargs):
        try:
            user = UserProfile.objects.get(Q(username=username)|Q(email=username))  # 用户名与Email验证
            if user.check_password(password):  # 验证密码
                return user
        except Exception as e:
            return None


class LoginView(View):
    """登陆功能"""
    def get(self, request):
        # get请求直接返回页面
        return render(request, "login.html", {})

    def post(self, request):
        login_form = LoginForm(request.POST)
        if login_form.is_valid():
            # 输入经过LoginForm验证,连接数据库验证
            # 取用户输入值
            user_name = request.POST.get('username', '')
            pass_word = request.POST.get('password', '')

            # 向数据库发起验证请求用户名和密码是否正确
            # 正确会返回一个对象, 不正确会返回None
            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:
            # 输入没经过LoginForm验证,返回错误缘由给前端
            return render(request, "login.html", {'login_form': login_form})
相关文章
相关标签/搜索