[第一节] 首页和登录页的展现
1.首先将前端的html页面拷贝到项目的templates,静态文件拷贝到static下
2.修改urls.py 配置首页的访问
修改完毕后启动项目,可以访问到页面,但是CSS、JS、PIC等文件无法加载
# _*_ encoding:utf-8 _*_
__author__ = 'luky'
__date__ = '2018/4/27 15:46'
from django.conf.urls import url
# from django.contrib import admin
# TemplateView专门用于处理静态文件使用,TemplateView不需要写后台views 会自动调整到相应的.html页面上
from django.views.generic import TemplateView
import xadmin
urlpatterns = [
url(r'^xadmin/', xadmin.site.urls),
#调用 TemplateView的as_view方法,指定template_name的html页面
url('^$', TemplateView.as_view(template_name="index.html"), name="index")
]
3.修改settings.py定义static静态文件加载路径
在最下面添加:
STATIC_URL = '/static/'
STATIC_ROOT = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]
4.修改index.html和login.html的静态文件加载路径
将原静态路径(.../css和.../js和.../image)批量替换到/static/...下,修改完成的文件如下:
index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1" >
<title>课程机构列表 - 慕学在线网</title>
<link rel="stylesheet" type="text/css" href="/static/css/reset.css">
<link rel="stylesheet" type="text/css" href="/static/css/animate.css">
<link rel="stylesheet" type="text/css" href="/static/css/style.css">
<script src="/static/js/jquery.min.js" type="text/javascript"></script>
<script src="/static/js/jquery-migrate-1.2.1.min.js" type="text/javascript"></script>
</head>
<body>
<section class="headerwrap ">
<header>
<div class=" header">
{% if request.user.is_authenticated %}
<div class="top">
<div class="wp">
<div class="fl"><p>服务电话:<b>888888</b></p></div>
<!--登陆后跳转-->
<div class="personal">
<dl class="user fr">
<dd>luky<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>bobby</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>888888</b></p>
</div>
<a style="color:white" class="fr registerbtn" href="register.html">注册</a>
<a style="color:white" class="fr loginbtn" href="login.html">登录</a>
</div>
</div>
{% endif %}
<div class="middle">
<div class="wp">
<a href="index.html"><img class="fl" src="/static/images/logo.jpg"/></a>
<div class="searchbox fr">
<div class="selectContainer fl">
<span class="selectOption" id="jsSelectOption" data-value="course">
公开课
</span>
<ul class="selectMenu" id="jsSelectMenu">
<li data-value="course">公开课</li>
<li data-value="org">课程机构</li>
<li data-value="teacher">授课老师</li>
</ul>
</div>
<input id="search_keywords" class="fl" type="text" value="" placeholder="请输入搜索内容"/>
<img class="search_btn fr" id="jsSearchBtn" src="/static/images/search_btn.png"/>
</div>
</div>
</div>
<nav>
<div class="nav">
<div class="wp">
<ul>
<li class="active" ><a href="index.html">首页</a></li>
<li >
<a href="course-list.html">
公开课<img class="hot" src="/static/images/nav_hot.png">
</a>
</li>
<li >
<a href="teachers-list.html">授课教师</a>
</li>
<li ><a href="org-list.html">授课机构</a></li>
</ul>
</div>
</div>
</nav>
</div>
</header>
</section>
<!--crumbs start-->
<div class="banner">
<div class="wp">
<div class="fl">
<div class="imgslide">
<ul class="imgs">
<li>
<a href="http://www.imooc.com">
<img width="1200" height="478" src="/static/media/banner/2016/11/57a801860001c34b12000460.jpg" />
</a>
</li>
<li>
<a href="http://www.projectsedu.com">
<img width="1200" height="478" src="/static/media/banner/2016/11/57aa86a0000145c512000460.jpg" />
</a>
</li>
<li>
<a href="http://www.projectsedu.com">
<img width="1200" height="478" src="/static/media/banner/2016/11/57a801860001c34b12000460_z4Vb8zl.jpg" />
</a>
</li>
<li>
<a href="http://www.projectsedu.com">
<img width="1200" height="478" src="/static/media/banner/2016/11/57aa86a0000145c512000460_nMwvoQD.jpg" />
</a>
</li>
<li>
<a href="http://www.projectsedu.com">
<img width="1200" height="478" src="/static/media/banner/2016/11/57aa86a0000145c512000460_GXIBATC.jpg" />
</a>
</li>
</ul>
</div>
<div class="unslider-arrow prev"></div>
<div class="unslider-arrow next"></div>
</div>
</div>
</div>
<!--banner end-->
<!--feature start-->
<section>
<div class="wp">
<ul class="feature">
<li class="feature1">
<img class="pic" src="/static/images/feature1.png"/>
<p class="center">专业权威</p>
</li>
<li class="feature2">
<img class="pic" src="/static/images/feature2.png"/>
<p class="center">课程最新</p>
</li>
<li class="feature3">
<img class="pic" src="/static/images/feature3.png"/>
<p class="center">名师授课</p>
</li>
<li class="feature4">
<img class="pic" src="/static/images/feature4.png"/>
<p class="center">数据真实</p>
</li>
</ul>
</div>
</section>
<!--feature end-->
<!--module1 start-->
<section>
<div class="module">
<div class="wp">
<h1>公开课程</h1>
<div class="module1 eachmod">
<div class="module1_1 left">
<img width="228" height="614" src="/static/images/module1_1.jpg"/>
<p class="fisrt_word">名师授课<br/>专业权威</p>
<a class="more" href="course-list.html">查看更多课程 ></a>
</div>
<div class="right group_list">
<div class="module1_2 box">
<div class="imgslide2">
<ul class="imgs">
<li>
<a href="course-detail.html">
<img width="470" height="300" src="/static/media/courses/2016/12/python文件处理.jpg" />
</a>
</li>
<li>
<a href="course-detail.html">
<img width="470" height="300" src="/static/media/courses/2016/12/python面向对象.jpg" />
</a>
</li>
</ul>
</div>
<div class="unslider-arrow2 prev"></div>
<div class="unslider-arrow2 next"></div>
</div>
<div class="module1_3 box">
<a href="course-detail.html">
<img width="233" height="190" src="/static/media/courses/2016/11/mysql.jpg"/>
</a>
<div class="des">
<a href="course-detail.html">
<h2 title="django入门">django入门</h2>
</a>
<span class="fl">难度:<i class="key">初级</i></span>
<span class="fr">学习人数:3</span>
</div>
<div class="bottom">
<span class="fl" title="慕课网">慕课网</span>
<span class="star fr">0</span>
</div>
</div>
<div class="module1_4 box">
<a href="course-detail.html">
<img width="233" height="190" src="/static/media/courses/2016/11/57035ff200014b8a06000338-240-135.jpg"/>
</a>
<div class="des">
<a href="course-detail.html">
<h2 title="java入门">java入门</h2>
</a>
<span class="fl">难度:<i class="key">中级</i></span>
<span class="fr">学习人数:0</span>
</div>
<div class="bottom">
<span class="fl" title="北京大学">北京大学</span>
<span class="star fr">0</span>
</div>
</div>
<div class="module1_5 box">
<a href="course-detail.html">
<img width="233" height="190" src="/static/media/courses/2016/11/540e57300001d6d906000338-240-135.jpg"/>
</a>
<div class="des">
<a href="course-detail.html">
<h2 title="python入门">python入门</h2>
</a>
<span class="fl">难度:<i class="key">中级</i></span>
<span class="fr">学习人数:0</span>
</div>
<div class="bottom">
<span class="fl" title="南京大学">南京大学</span>
<span class="star fr">0</span>
</div>
</div>
<div class="module1_6 box">
<a href="course-detail.html">
<img width="233" height="190" src="/static/media/courses/2016/11/57035ff200014b8a06000338-240-135_dHfj8Nq.jpg"/>
</a>
<div class="des">
<a href="course-detail.html">
<h2 title="java入门2">java入门2</h2>
</a>
<span class="fl">难度:<i class="key">高级</i></span>
<span class="fr">学习人数:0</span>
</div>
<div class="bottom">
<span class="fl" title="慕课网2">慕课网2</span>
<span class="star fr">0</span>
</div>
</div>
<div class="module1_7 box">
<a href="course-detail.html">
<img width="233" height="190" src="/static/media/courses/2016/11/57035ff200014b8a06000338-240-135_0nFiBSI.jpg"/>
</a>
<div class="des">
<a href="course-detail.html">
<h2 title="java入门3">java入门3</h2>
</a>
<span class="fl">难度:<i class="key">初级</i></span>
<span class="fr">学习人数:1</span>
</div>
<div class="bottom">
<span class="fl" title="慕课网3">慕课网3</span>
<span class="star fr">0</span>
</div>
</div>
<div class="module1_8 box">
<a href="course-detail.html">
<img width="233" height="190" src="/static/media/courses/2016/11/540e57300001d6d906000338-240-135_MSIqfvw.jpg"/>
</a>
<div class="des">
<a href="course-detail.html">
<h2 title="python入门2">python入门2</h2>
</a>
<span class="fl">难度:<i class="key">中级</i></span>
<span class="fr">学习人数:0</span>
</div>
<div class="bottom">
<span class="fl" title="慕课网666">慕课网666</span>
<span class="star fr">0</span>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<section>
<div class="module greybg">
<div class="wp">
<h1>课程机构</h1>
<div class="module3 eachmod">
<div class="module3_1 left">
<img width="228" height="463" src="/static/images/module3_1.jpg"/>
<p class="fisrt_word">名校来袭<br/>权威认证</p>
<a class="more" href="org-list.html">查看更多机构 ></a>
</div>
<div class="right">
<ul>
<li class="">
<a href="org-detail-homepage.html">
<div class="company">
<img width="184" height="100" src="/static/media/org/2016/11/imooc.png"/>
<div class="score">
<div class="circle">
<h2>全国知名</h2>
</div>
</div>
</div>
<p><span class="key" title="慕课网">慕课网</span></p>
</a>
</li>
<li class="">
<a href="org-detail-homepage.html">
<div class="company">
<img width="184" height="100" src="/static/media/org/2016/11/bjdx.jpg"/>
<div class="score">
<div class="circle">
<h2>全国知名</h2>
</div>
</div>
</div>
<p><span class="key" title="北京大学">北京大学</span></p>
</a>
</li>
<li class="">
<a href="org-detail-homepage.html">
<div class="company">
<img width="184" height="100" src="/static/media/org/2016/11/qhdx-logo.png"/>
<div class="score">
<div class="circle">
<h2>全国知名</h2>
</div>
</div>
</div>
<p><span class="key" title="清华大学">清华大学</span></p>
</a>
</li>
<li class="">
<a href="org-detail-homepage.html">
<div class="company">
<img width="184" height="100" src="/static/media/org/2016/11/njdx.jpg"/>
<div class="score">
<div class="circle">
<h2>全国知名</h2>
</div>
</div>
</div>
<p><span class="key" title="南京大学">南京大学</span></p>
</a>
</li>
<li class="five">
<a href="org-detail-homepage.html">
<div class="company">
<img width="184" height="100" src="/static/media/org/2016/11/imooc_klgAUn5.png"/>
<div class="score">
<div class="circle">
<h2>全国知名</h2>
</div>
</div>
</div>
<p><span class="key" title="慕课网2">慕课网2</span></p>
</a>
</li>
<li class="">
<a href="org-detail-homepage.html">
<div class="company">
<img width="184" height="100" src="/static/media/org/2016/11/imooc_Gn1sRjp.png"/>
<div class="score">
<div class="circle">
<h2>全国知名</h2>
</div>
</div>
</div>
<p><span class="key" title="慕课网3">慕课网3</span></p>
</a>
</li>
<li class="">
<a href="org-detail-homepage.html">
<div class="company">
<img width="184" height="100" src="/static/media/org/2016/11/imooc_Y2Tonsq.png"/>
<div class="score">
<div class="circle">
<h2>全国知名</h2>
</div>
</div>
</div>
<p><span class="key" title="慕课网3">慕课网3</span></p>
</a>
</li>
<li class="">
<a href="org-detail-homepage.html">
<div class="company">
<img width="184" height="100" src="/static/media/org/2016/11/imooc_OO2ykYP.png"/>
<div class="score">
<div class="circle">
<h2>全国知名</h2>
</div>
</div>
</div>
<p><span class="key" title="慕课网4">慕课网4</span></p>
</a>
</li>
<li class="">
<a href="org-detail-homepage.html">
<div class="company">
<img width="184" height="100" src="/static/media/org/2016/11/imooc_V0TJOyb.png"/>
<div class="score">
<div class="circle">
<h2>全国知名</h2>
</div>
</div>
</div>
<p><span class="key" title="慕课网5">慕课网5</span></p>
</a>
</li>
<li class="five">
<a href="org-detail-homepage.html">
<div class="company">
<img width="184" height="100" src="/static/media/org/2016/11/imooc_qEaMov1.png"/>
<div class="score">
<div class="circle">
<h2>全国知名</h2>
</div>
</div>
</div>
<p><span class="key" title="慕课网666">慕课网666</span></p>
</a>
</li>
<li class="">
<a href="org-detail-homepage.html">
<div class="company">
<img width="184" height="100" src="/static/media/org/2016/12/bjdx.jpg"/>
<div class="score">
<div class="circle">
<h2>全国知名</h2>
</div>
</div>
</div>
<p><span class="key" title="慕学网">慕学网</span></p>
</a>
</li>
<li class="">
<a href="org-detail-homepage.html">
<div class="company">
<img width="184" height="100" src="/static/media/org/2016/12/imooc_Gn1sRjp.png"/>
<div class="score">
<div class="circle">
<h2>全国知名</h2>
</div>
</div>
</div>
<p><span class="key" title="python培训机构">python培训机构</span></p>
</a>
</li>
<li class="">
<a href="org-detail-homepage.html">
<div class="company">
<img width="184" height="100" src="/static/media/org/2016/12/bjdx_cCpdUw8.jpg"/>
<div class="score">
<div class="circle">
<h2>全国知名</h2>
</div>
</div>
</div>
<p><span class="key" title="vuejs培训">vuejs培训</span></p>
</a>
</li>
<li class="">
<a href="org-detail-homepage.html">
<div class="company">
<img width="184" height="100" src="/static/media/org/2016/12/imooc_klgAUn5.png"/>
<div class="score">
<div class="circle">
<h2>全国知名</h2>
</div>
</div>
</div>
<p><span class="key" title="nodejs培训">nodejs培训</span></p>
</a>
</li>
<li class="five">
<a href="org-detail-homepage.html">
<div class="company">
<img width="184" height="100" src="/static/media/org/2016/12/bjdx_bcd0m07.jpg"/>
<div class="score">
<div class="circle">
<h2>全国知名</h2>
</div>
</div>
</div>
<p><span class="key" title="慕学在线">慕学在线</span></p>
</a>
</li>
</ul>
</div>
</div>
</div>
</div>
</section>
<footer>
<div class="footer">
<div class="wp">
<ul class="cont">
<li class="logo"><a href=""><img src="/static/images/footlogo.png"/></a></li>
<li class="code"><img src="/static/images/code.jpg"/><p class="center">扫描关注微信</p></li>
<li class="third"><img class="fl" src="/static/images/tell.png"/><p class="tell">8888888</p><p class="time">周一至周日 9:00-18:00</p></li>
</ul>
</div>
<p class="line"></p>
<div class="wp clear">
<span class="fl">? 2016 www.projectsedu.com 慕学在线-在线学习交流平台 保留所有权利</span>
<span class="fr">copyright ? 2018 ICP备案证书号:蜀ICP备xxxxx号-1</span>
</div>
</div>
</footer>
<section>
<ul class="sidebar">
<li class="qq">
<a target="_blank" href="http://wpa.qq.com/msgrd?v=3&uin=2023525077&site=qq&menu=yes"></a>
</li>
<li class="totop"></li>
</ul>
</section>
<script src="/static/js/selectUi.js" type='text/javascript'></script>
<script src="/static/js/deco-common.js" type='text/javascript'></script>
<script type="text/javascript" src="/static/js/plugins/laydate/laydate.js"></script>
<script src="/static/js/plugins/layer/layer.js"></script>
<script src="/static/js/plugins/queryCity/js/public.js" type="text/javascript"></script>
<script src="/static/js/unslider.js" type="text/javascript"></script>
<script src="/static/js/plugins/jquery.scrollLoading.js" type="text/javascript"></script>
<script src="/static/js/deco-common.js" type="text/javascript"></script>
<script type="text/javascript" src="/static/js/index.js"></script>
</body>
</html>
login.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1" >
<title>慕学在线网登录</title>
<link rel="stylesheet" type="text/css" href="/static/css/reset.css">
<link rel="stylesheet" type="text/css" href="/static/css/login.css">
</head>
<body>
<div class="dialog" id="jsDialog">
<!--提示弹出框-->
<div class="successbox dialogbox" id="jsSuccessTips">
<h1>成功提交</h1>
<div class="close jsCloseDialog"><img src="/static/images/dig_close.png"/></div>
<div class="cont">
<h2>您的需求提交成功!</h2>
<p></p>
</div>
</div>
<div class="noactivebox dialogbox" id="jsUnactiveForm" >
<h1>邮件验证提示</h1>
<div class="close jsCloseDialog"><img src="/static/images/dig_close.png"/></div>
<div class="center">
<img src="/static/images/send.png"/>
<p>我们已经向您的邮箱<span class="green" id="jsEmailToActive">12@13.com</span>发送了邮件,<br/>为保证您的账号安全,请及时验证邮箱</p>
<p class="a"><a class="btn" id="jsGoToEmail" target="_blank" href="http://mail.qq.com">去邮箱验证</a></p>
<p class="zy_success upmove"></p>
<p style="display: none;" class="sendE2">没收到,您可以查看您的垃圾邮件和被过滤邮件,也可以再次发送验证邮件(<span class="c5c">60s</span>)</p>
<p class="sendE">没收到,您可以查看您的垃圾邮件和被过滤邮件,<br/>也可以<span class="c5c green" id="jsSenEmailAgin" style="cursor: pointer;">再次发送验证邮件</span></p>
</div>
</div>
</div>
<div class="bg" id="dialogBg"></div>
<header>
<div class="c-box fff-box">
<div class="wp header-box">
<p class="fl hd-tips">慕学在线网,在线学习平台!</p>
<ul class="fr hd-bar">
<li>服务电话:<span>33333333</span></li>
<li class="active"><a href="login.html">[登录]</a></li>
<li><a href="register.html">[注册]</a></li>
</ul>
</div>
</div>
</header>
<section>
<div class="c-box bg-box">
<div class="login-box clearfix">
<div class="hd-login clearfix">
<a class="index-logo" href="index.html"></a>
<h1>用户登录</h1>
<a class="index-font" href="index.html">回到首页</a>
</div>
<div class="fl slide">
<div class="imgslide">
<ul class="imgs">
<li><a href=""><img width="483" height="472" src="/static/images/mysql.jpg" /></a></li>
<li><a href=""><img width="483" height="472" src="/static/images/mysql.jpg" /></a></li>
<li><a href=""><img width="483" height="472" src="/static/images/mysql.jpg" /></a></li>
</ul>
</div>
<div class="unslider-arrow prev"></div>
<div class="unslider-arrow next"></div>
</div>
<div class="fl form-box">
<h2>帐号登录</h2>
<form action="login.html" method="post" autocomplete="off">
<input type='hidden' name='csrfmiddlewaretoken' value='mymQDzHWl2REXIfPMg2mJaLqDfaS1sD5' />
<div class="form-group marb20 ">
<label>用 户 名</label>
<input name="username" id="account_l" type="text" placeholder="手机号/邮箱" />
</div>
<div class="form-group marb8 ">
<label>密 码</label>
<input name="password" id="password_l" type="password" placeholder="请输入您的密码" />
</div>
<div class="error btns login-form-tips" id="jsLoginTips"></div>
<div class="auto-box marb38">
<a class="fr" href="forgetpwd.html">忘记密码?</a>
</div>
<input class="btn btn-green" id="jsLoginBtn" type="submit" value="立即登录 > " />
<input type='hidden' name='csrfmiddlewaretoken' value='5I2SlleZJOMUX9QbwYLUIAOshdrdpRcy' />
</form>
<p class="form-p">没有慕学在线网帐号?<a href="register.html">[立即注册]</a></p>
</div>
</div>
</div>
</section>
<script src="/static/js/jquery.min.js" type="text/javascript"></script>
<script src="/static/js/unslider.js" type="text/javascript"></script>
<script src="/static/js/login.js" type="text/javascript"></script>
</body>
</html>
重启项目 此时访问页面,可以看到正常的页面了。
5.编辑配置urls.py定义用户登陆页面的访问
在urlpatterns 里新增login.html页面的访问
#定义在根路径下以login/为结尾的话,就调用login.html页面,注意:不能写成'/login/$',根路径下的访问定义都不要加前面的斜杠
url('^login/$', TemplateView.as_view(template_name="login.html"), name="index")
6.配置login的调整,需要修改index.html的登录部分
这里前端给我的是login.html,实际上这样是无法访问的,我们需要修改成以下代码
<a style="color:white" class="fr loginbtn" href="/login/">登录</a>
此时重启,点击首页右上角的登录,即可跳转到login页面
[第二节] 登录页面的逻辑①
1.编辑views.py
# _*_ encoding:utf-8 _*_
__author__ = 'luky'
__date__ = '2018/4/27 15:46'
from django.shortcuts import render
'''
views处理用户的登陆,实际上就是写函数,通过函数实现后台逻辑
request 当我们配置了url,django就会自动生成第一个参数作为request
.method参数用于判断用户的动作时POST还是GET
'''
def login(request):
if request.method == "POST":
pass
elif request.method == "GET":
'''
render方法中:第一个变量是django传递的request,第二个变量是静态页面,
第三个变量是个字典,用于放置哪些需要放置在前端模板中的变量
'''
return render(request, "login.html", {})
2.更新urls.py
增加 views.py里编辑的方法login :from users.views import login
并修改 下面login的url:url('^login/$', login , name="index")
更新后的完整文件如下:
# _*_ encoding:utf-8 _*_
__author__ = 'luky'
__date__ = '2018/4/27 15:46'
from django.conf.urls import url
# from django.contrib import admin
# TemplateView专门用于处理静态文件使用,TemplateView不需要写后台views 会自动调整到相应的.html页面上
from django.views.generic import TemplateView
import xadmin
# 调用views.py里定义的login方法
from users.views import login
urlpatterns = [
url(r'^xadmin/', xadmin.site.urls),
#调用 TemplateView的as_view方法,指定template_name的html页面
url('^$', TemplateView.as_view(template_name="index.html"), name="index"),
#定义在根路径下以login/为结尾的话,就调用login.html页面,注意:不能写成'/login/$',根路径下的访问定义都不要加前面的斜杠
# url('^login/$', TemplateView.as_view(template_name="login.html"), name="index")
url('^login/$', login , name="index")
]
3、修改login.html
<h2>帐号登录</h2>
<!--from action=定义访问指向URL的地址,这里需要修改为/login/ input name=要与定义好的参数匹配,-->
<!--***请注意:下面代码是更新点***-->
<form action="/login/" method="post" autocomplete="off">
<input type='hidden' name='csrfmiddlewaretoken' value='mymQDzHWl2REXIfPMg2mJaLqDfaS1sD5' />
<div class="form-group marb20 ">
<label>用 户 名</label>
<!--***请注意:下面代码是更新点***-->
<input name="username" id="account_l" type="text" placeholder="手机号/邮箱" />
</div>
<div class="form-group marb8 ">
<label>密 码</label>
<!--***请注意:下面代码是更新点***-->
<input name="password" id="password_l" type="password" placeholder="请输入您的密码" />
</div>
<div class="error btns login-form-tips" id="jsLoginTips"></div>
<div class="auto-box marb38">
此时重启项目,访问登陆页面,随便输入用户密码点击 立即登陆会报错,这是 django的防御机制,需要验证csrf_token
4.在前端页面增加csrf_token,修改login.html
<a class="fr" href="forgetpwd.html">忘记密码?</a>
</div>
<input class="btn btn-green" id="jsLoginBtn" type="submit" value="立即登录 > " />
<input type='hidden' name='csrfmiddlewaretoken' value='5I2SlleZJOMUX9QbwYLUIAOshdrdpRcy' />
<!--***请注意:下面代码是更新点***-->
<!--增加csrf_token防止csrf攻击-->
{% csrf_token %}
</form>
<p class="form-p">没有慕学在线网帐号?<a href="register.html">[立即注册]</a></p>
</div>
</div>
5.功能验证
设置断点
输入用户名和密码后点击立即登录
查看 pygame的调试输出
6.获取用户输入的POST数据
修改views.py
# _*_ encoding:utf-8 _*_
__author__ = 'luky'
__date__ = '2018/4/27 15:46'
from django.shortcuts import render
# 加载django提供的用户名密码验证方法authenticate login
from django.contrib.auth import authenticate,login
'''
views处理用户的登陆,实际上就是写函数,通过函数实现后台逻辑
request 当我们配置了url,django就会自动生成第一个参数作为request
.method参数用于判断用户的动作时POST还是GET
def 时定义的函数名 一定不要与我们默认的函数名一样
'''
def user_login(request):
if request.method == "POST":
# 定义需要获取的用户名和密码,get里的值要与前端定义的一致
user_name = request.POST.get("username", "")
pass_word = request.POST.get("password", "")
#调用authenticate来验证用户名和密码
user = authenticate(username=user_name, password=pass_word)
#如果用户名和密码都获取到了,返回到首页
if user is not None:
#调用django.contrib.auth中的login方法
login(request, user)
return render(request, "index.html", {})
else:
return render(request, "login.html", {})
elif request.method == "GET":
'''
render方法中:第一个变量是django传递的request,第二个变量是静态页面,
第三个变量是个字典,用于放置哪些需要放置在前端模板中的变量
'''
return render(request, "login.html", {})
7.前端增加if else endif 来判断用户登录是否登录时所显示不同的代码。
修改index.html
<header>
<div class=" header">
<!--***请注意:下面代码是更新点***-->
{% if request.user.is_authenticated %}
<div class="top">
<div class="wp">
<div class="fl"><p>服务电话:<b>888888</b></p></div>
<!--登陆后跳转-->
<div class="personal">
<dl class="user fr">
<dd>luky<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>bobby</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>888888</b></p>
</div>
<a style="color:white" class="fr registerbtn" href="register.html">注册</a>
<a style="color:white" class="fr loginbtn" href="/login/">登录</a>
</div>
</div>
<!--***请注意:下面代码是更新点***-->
{% endif %}
重启项目,登录用户名密码,查看首页
8.想通过邮箱登陆,那么我们需要增加自定义验证功能
编辑setting.py 增加 变量AUTHENTICATION_BACKENDS
# Application definition
AUTHENTICATION_BACKENDS=(
'users.views.CustomBackend',
)
编辑views.py
# _*_ encoding:utf-8 _*_
__author__ = 'luky'
__date__ = '2018/4/27 15:46'
from django.shortcuts import render
# 加载django提供的用户名密码验证方法authenticate login
from django.contrib.auth import authenticate,login
# 加载django提供的ModelBackend方法,用于自定义认证
from django.contrib.auth.backends import ModelBackend
from django.db.models import Q
# 调用我们models.py里自己定义的用户表
from .models import UserProfile
'''
views处理用户的登陆,实际上就是写函数,通过函数实现后台逻辑
request 当我们配置了url,django就会自动生成第一个参数作为request
.method参数用于判断用户的动作时POST还是GET
def 时定义的函数名 一定不要与我们默认的函数名一样
'''
def user_login(request):
if request.method == "POST":
# 定义需要获取的用户名和密码,get里的值要与前端定义的一致
user_name = request.POST.get("username", "")
pass_word = request.POST.get("password", "")
#调用authenticate来验证用户名和密码
user = authenticate(username=user_name, password=pass_word)
#如果用户名和密码都获取到了,返回到首页
if user is not None:
#调用django.contrib.auth中的login方法
login(request, user)
return render(request, "index.html", {})
else:
return render(request, "login.html", {})
elif request.method == "GET":
'''
render方法中:第一个变量是django传递的request,第二个变量是静态页面,
第三个变量是个字典,用于放置哪些需要放置在前端模板中的变量
'''
return render(request, "login.html", {})
class CustomBackend(ModelBackend):
def authenticate(self, username=None, password=None, **kwargs):
try:
user = UserProfile.objects.get(Q(username=username)|Q(email=username))
#密码的存储的是密文,需要通过调用user.check_password方法验证
if user.check_password(password):
return user
except Exception as e:
return None
9.验证
通过断点,重启项目,输入邮箱账号密码,验证登陆是否成功
然后查看pycharm,如图所示,已经进入Custom中,按F8走完流程
10.显示错误信息
编辑views.py
# _*_ encoding:utf-8 _*_
__author__ = 'luky'
__date__ = '2018/4/27 15:46'
from django.shortcuts import render
# 加载django提供的用户名密码验证方法authenticate login
from django.contrib.auth import authenticate,login
# 加载django提供的ModelBackend方法,用于自定义认证
from django.contrib.auth.backends import ModelBackend
from django.db.models import Q
# 调用我们models.py里自己定义的用户表
from .models import UserProfile
'''
views处理用户的登陆,实际上就是写函数,通过函数实现后台逻辑
request 当我们配置了url,django就会自动生成第一个参数作为request
.method参数用于判断用户的动作时POST还是GET
def 时定义的函数名 一定不要与我们默认的函数名一样
'''
def user_login(request):
if request.method == "POST":
# 定义需要获取的用户名和密码,get里的值要与前端定义的一致
user_name = request.POST.get("username", "")
pass_word = request.POST.get("password", "")
#调用authenticate来验证用户名和密码
user = authenticate(username=user_name, password=pass_word)
#如果用户名和密码都获取到了,返回到首页
if user is not None:
#调用django.contrib.auth中的login方法
login(request, user)
return render(request, "index.html", {})
else:
#此处是更新部分
# 2{"msg":"用户名密码输入错误!"}定义数据库查询后验证的报错输。在login.html代码中加入
return render(request, "login.html", {"msg": "用户名密码输入错误!"})
elif request.method == "GET":
'''
render方法中:第一个变量是django传递的request,第二个变量是静态页面,
第三个变量是个字典,用于放置哪些需要放置在前端模板中的变量
'''
return render(request, "login.html", {})
class CustomBackend(ModelBackend):
def authenticate(self, username=None, password=None, **kwargs):
try:
user = UserProfile.objects.get(Q(username=username)|Q(email=username))
#密码的存储的是密文,需要通过调用user.check_password方法验证
if user.check_password(password):
return user
except Exception as e:
return None
修改login.html ,在div class =error 最后增加views.py里定义的错误输出
<div class="error btns login-form-tips" id="jsLoginTips" >{{ msg }}></div>
更改后的完整文件如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1" >
<title>慕学在线网登录</title>
<link rel="stylesheet" type="text/css" href="/static/css/reset.css">
<link rel="stylesheet" type="text/css" href="/static/css/login.css">
</head>
<body>
<div class="dialog" id="jsDialog">
<!--提示弹出框-->
<div class="successbox dialogbox" id="jsSuccessTips">
<h1>成功提交</h1>
<div class="close jsCloseDialog"><img src="/static/images/dig_close.png"/></div>
<div class="cont">
<h2>您的需求提交成功!</h2>
<p></p>
</div>
</div>
<div class="noactivebox dialogbox" id="jsUnactiveForm" >
<h1>邮件验证提示</h1>
<div class="close jsCloseDialog"><img src="/static/images/dig_close.png"/></div>
<div class="center">
<img src="/static/images/send.png"/>
<p>我们已经向您的邮箱<span class="green" id="jsEmailToActive">12@13.com</span>发送了邮件,<br/>为保证您的账号安全,请及时验证邮箱</p>
<p class="a"><a class="btn" id="jsGoToEmail" target="_blank" href="http://mail.qq.com">去邮箱验证</a></p>
<p class="zy_success upmove"></p>
<p style="display: none;" class="sendE2">没收到,您可以查看您的垃圾邮件和被过滤邮件,也可以再次发送验证邮件(<span class="c5c">60s</span>)</p>
<p class="sendE">没收到,您可以查看您的垃圾邮件和被过滤邮件,<br/>也可以<span class="c5c green" id="jsSenEmailAgin" style="cursor: pointer;">再次发送验证邮件</span></p>
</div>
</div>
</div>
<div class="bg" id="dialogBg"></div>
<header>
<div class="c-box fff-box">
<div class="wp header-box">
<p class="fl hd-tips">慕学在线网,在线学习平台!</p>
<ul class="fr hd-bar">
<li>服务电话:<span>33333333</span></li>
<li class="active"><a href="login.html">[登录]</a></li>
<li><a href="register.html">[注册]</a></li>
</ul>
</div>
</div>
</header>
<section>
<div class="c-box bg-box">
<div class="login-box clearfix">
<div class="hd-login clearfix">
<a class="index-logo" href="index.html"></a>
<h1>用户登录</h1>
<a class="index-font" href="index.html">回到首页</a>
</div>
<div class="fl slide">
<div class="imgslide">
<ul class="imgs">
<li><a href=""><img width="483" height="472" src="/static/images/mysql.jpg" /></a></li>
<li><a href=""><img width="483" height="472" src="/static/images/mysql.jpg" /></a></li>
<li><a href=""><img width="483" height="472" src="/static/images/mysql.jpg" /></a></li>
</ul>
</div>
<div class="unslider-arrow prev"></div>
<div class="unslider-arrow next"></div>
</div>
<div class="fl form-box">
<h2>帐号登录</h2>
<!--from action=定义访问指向URL的地址,这里需要修改为/login/ input name=要与定义好的参数匹配,-->
<form action="/login/" method="post" autocomplete="off">
<input type='hidden' name='csrfmiddlewaretoken' value='mymQDzHWl2REXIfPMg2mJaLqDfaS1sD5' />
<div class="form-group marb20 ">
<label>用 户 名</label>
<!--***请注意:下面代码是更新点***-->
<input name="username" id="account_l" type="text" placeholder="手机号/邮箱" />
</div>
<div class="form-group marb8 ">
<label>密 码</label>
<!--***请注意:下面代码是更新点***-->
<input name="password" id="password_l" type="password" placeholder="请输入您的密码" />
</div>
<div class="error btns login-form-tips" id="jsLoginTips" >{{ 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="立即登录 > " />
<input type='hidden' name='csrfmiddlewaretoken' value='5I2SlleZJOMUX9QbwYLUIAOshdrdpRcy' />
<!--***请注意:下面代码是更新点***-->
<!--增加csrf_token防止csrf攻击-->
{% csrf_token %}
</form>
<p class="form-p">没有慕学在线网帐号?<a href="register.html">[立即注册]</a></p>
</div>
</div>
</div>
</section>
<script src="/static/js/jquery.min.js" type="text/javascript"></script>
<script src="/static/js/unslider.js" type="text/javascript"></script>
<script src="/static/js/login.js" type="text/javascript"></script>
</body>
</html>
重启项目,输入错误的登陆信息