django+xadmin在线教育平台(十一)
6-1 首页和登录页面的配置
用户访问我们的根目录,我们需要把html文件返回给用户。因此我们第一步把html文件放入template目录。

在html中找到首页的html。拷贝到我们的template目录

新建static目录
用来存放css, js等静态文件

配置处理静态文件的url。
Django2.0.1版本下:
Mxonline3/urls.py:
from django.views.generic import TemplateView
urlpatterns = [
path('xadmin/', xadmin.site.urls),
# TemplateView.as_view会将template转换为view
path('', TemplateView.as_view(template_name= "index.html"), name= "index")
]
Django1.9.8版本下:
Mxonline2/urls.py:
from django.views.generic import TemplateView
urlpatterns = [
url(r'^xadmin/', xadmin.site.urls),
url('^$', TemplateView.as_view(template_name="index.html"), name="index")
]
此时运行访问就可以访问到我们的index页面,不过会没有样式。
设置static文件
# 说明静态文件放在哪个目录
STATIC_URL = '/static/'
STATICFILES_DIRS = (
os.path.join(BASE_DIR, "static"),
)
修改index页面中前端样式的引用地址

使用ctrl+f查找出所有../
,全部替换为/static/
然后点击运行,刷新页面可以看到我们的页面已经显示正常了。
拷贝登录页面到template

使用ctrl+f查找出所有../
,全部替换为/static/
将css,js,图片全部替换完。
url配置跳转登录页面
Mxonline2/urls.py:
# 登录页面跳转url
url('^login/$', TemplateView.as_view(template_name="login.html"), name="login")
Mxonline3/urls.py:
# TemplateView.as_view会将template转换为view
path('', TemplateView.as_view(template_name= "index.html"), name= "index"),
path('login/', TemplateView.as_view(template_name= "login.html"), name= "login")
在index页面,ctrl+f找到登录。将a标签中地址替换为login的url。

取消注释后,将login.html改为/login/

点击左侧减号收起。然后使用``将个人中心暂时注释。

可以看到登录注册,点击登录。
根路径下的所有url都不需要斜杠
此时我们的首页已经可以成功显示,通过首页点击登录也可以成功跳转登录页面
本小节完成对应commit:
6-1: 完成首页与登录页面配置,设置了STATICFILES_DIRS。注意:dirs是一个元组,不要少逗号。删除了前面上传头像等直接传到根目录的目录。
6-2 用户登录-1
配置url之前我们要书写好对应处理的view
Django的view实际就是一个函数,接收request请求对象,处理后返回response对象。
users/views.py:
# encoding: utf-8
# 当我们配置url被这个view处理时,自动传入request对象.
def login(request):
# 前端向后端发送的请求方式: get 或post
# 登录提交表单为post
if request.method == "POST":
pass
# 获取登录页面为get
elif request.method == "GET":
# render就是渲染html返回用户
# render三变量: request 模板名称 一个字典写明传给前端的值
return render(request, "login.html", {})
django1.9.8/urls.py
from users.views import user_login
# 登录页面跳转url login不要直接调用。而只是指向这个函数对象。
url('^login/$',login, name="login")
django2.0.1/urls.py:
from users.views import login
path('login/', login, name="login")
在两行返回语句的位置打上断点:

点击debug,进入首页后点击登录。可以看到

说明确实是通过get请求请求页面的。
通过值浏览器窗口可以看到这是一个<WSGIRequest: GET '/login/'>
对象

path:
是指向的地址。
f8
继续运行。跳转到登录页面。
6-3 用户登录2
html form基础知识
templates/login.html:
可以看到form表单中有input。点击提交会把值提交到后台。我们需要修改action让它指向我们的后台相应地址。


input中的name值会被传递到后台。回组成键值对形式。
submit类型的input

只保留post这里的断点。输入用户名密码。查看debug情况

403禁止访问
错误: html页面内必须加上crsf token
才能传值到后台。
我会随机的给前端发一串符号,你必须把这串符号带回来,我才允许你post。

from表单之前写上crsf token
此时我们查看前端页面:

可以看到html中登录下面有一个隐藏着的值:crsf token, 不会显示。
此时点击登录跳转到pass位置。


可以看到request中的POST中是一个queryset的对象。我们可以把它当成一个字典来用。
来取到前端的数据
if request.method == "POST":
# 取不到时为空,username,password为前端页面name值
user_name = request.POST.get("username", "")
pass_word = request.POST.get("password", "")
取到用户名和密码我们就要开始进行验证登录。使用Django自带的auth
方法。
from django.contrib.auth import authenticate, login
# 登录提交表单为post
if request.method == "POST":
# 取不到时为空,username,password为前端页面name值
user_name = request.POST.get("username", "")
pass_word = request.POST.get("password", "")
# 成功返回user对象,失败返回null
user = authenticate(username= user_name, password= pass_word)
# 如果不是null说明验证成功
if user is not None:
# login_in 两参数:request, user
# 实际是对request写了一部分东西进去,然后在render的时候:
# request是要render回去的。这些信息也就随着返回浏览器。完成登录
login(request, user)
# 跳转到首页 user request会被带回到首页
return render(request, "index.html")
# 没有成功说明里面的值是None,并再次跳转回主页面
else:
return render(request, "login.html", {})
authenticate调用只需要传入用户名和密码。成功会返回user对象,失败返回null
html中通过

设置成如果登录显示个人中心那段,未登录显示登录注册
打上断点

点击debug后可以看到

我们成功的取到了值。
Django默认我们使用用户名和密码来登录
成功的登录user值如下

但是继续执行报错:
login() takes exactly 1 argument (2 given)
这时因为我们处理登录的自定义函数也叫login。就直接调用了自身,而不是调用Django提供的login。所以我们一定不要把自定义view函数命名与Django提供的冲突
解决方案:将我们的login改为
def user_login(request):
并且前往urls.py中将login也一并改了
此时运行可以看到我们的个人中心已经出来了。
改造为使用邮箱用户名均可。Setting中重载变量
自定义authenticate方法
from django.contrib.auth.backends import ModelBackend
from .models import UserProfile
# 并集运算
from django.db.models import Q
# 实现用户名邮箱均可登录
# 继承ModelBackend类,因为它有方法authenticate,可点进源码查看
class CustomBackend(ModelBackend):
def authenticate(self, username=None, password=None, **kwargs):
try:
# 不希望用户存在两个,get只能有一个。两个是get失败的一种原因 Q为使用并集查询
user = UserProfile.objects.get(Q(username=username)|Q(email=username))
# django的后台中密码加密:所以不能password==password
# UserProfile继承的AbstractUser中有def check_password(self, raw_password):
if user.check_password(password):
return user
except Exception as e:
return None
Mxonline2/settings.py
# 设置邮箱和用户名均可登录
AUTHENTICATION_BACKENDS = (
'users.views.CustomBackend',
)

使用xadmin的退出,注销当前用户的退出。
此时我们可以通过邮箱和用户名都可以完成登录。
用户提示:return页面时提供它的错误信息

return render(request, "login.html", {"msg":"用户名或密码错误! "})
Html中如何取到这个值;
login html中这段是用来做错误提示的。

<div class="error btns login-form-tips" id="jsLoginTips">{{ msg }}</div>
验证:

本小节结束对应commit:
6-2&3 完成了用户登录,登录验证自定义:邮箱用户名均可。错误信息返回前端。设置登录显示个人中心判断,注意不要把自定义方法写成login。
原文学习来自简书,作者:天涯明月笙
链接:https://www.jianshu.com/p/4f132a18e8d1
django+xadmin在线教育平台(十一)的更多相关文章
- django+xadmin在线教育平台(一)
大家好,此教程为在慕学网的实战教程Python升级3.6 强力Django+杀手级Xadmin打造在线教育平台的学习笔记,不对望指正! 使用Django+Xadmin打造在线教育平台(Python2, ...
- django+xadmin在线教育平台(五)
3-3 django orm介绍与model设计 上节教程完成后代码(来学习本节前置条件): 对应commit: 留言板前端页面展示.本次内容截止教程3-2结束. 可能现在你还在通过手写sql语句来操 ...
- django+xadmin在线教育平台(四)
3-2 配置表单页面 必要的该说的,该了解的 前置条件: 你已经学习了前面教程.将项目的文件夹目录结构,setting配置等修改完毕与我保持一致. 本节通过Django快速的配置一个留言板页面来学习 ...
- django+xadmin在线教育平台(十)
剩余app model注册 courses注册 新建courses/adminx.py: # encoding: utf-8 __author__ = 'mtianyan' __date__ = '2 ...
- django+xadmin在线教育平台(六)
4-1 使用py3.6和django1.11开发系统前注意事项 直接通过Python3.6和django最新版本来开发我们的系统的一些注意事项. 原版本: Python 2.7 & djang ...
- django+xadmin在线教育平台(十七)
8-1 课程列表 拷贝课程列表页到template目录 创建课程相关的urls.py Mxonline2/urls.py中声明包含到course的url中: # 课程app的url配置 url(r&q ...
- django+xadmin在线教育平台(十六)
7-7 modelform 提交我要学习咨询1 对应表userask form会对字段先做验证,然后保存到数据库中. 可以看到我们的forms和我们的model中有很多内容是一样的.我们如何让代码重复 ...
- django+xadmin在线教育平台(十五)
7-4 课程机构列表页数据展示2 前去html中进行数据填充 mark 可以看到所有城市是通过a标签,当前选中城市为active. mark 之后把下面的写死的城市删除掉. mark 这时 ...
- django+xadmin在线教育平台(十四)
7-1 django templates模板继承1 机构可以筛选类别 机构可以根据所在地区进行分类 右侧我要学习功能: form表单提交 右下:授课机构排名 页面头部与底部为全局头和全局底部. Dja ...
随机推荐
- React.js 小书 Lesson4 - 前端组件化(三):抽象出公共组件类
作者:胡子大哈 原文链接:http://huziketang.com/books/react/lesson4 转载请注明出处,保留原文链接和作者信息. 为了让代码更灵活,可以写更多的组件,我们把这种模 ...
- Python文本数据分析与处理
Python文本数据分析与处理(新闻摘要) 分词 使用jieba分词, 注意lcut只接受字符串 过滤停用词 TF-IDF得到摘要信息或者使用LDA主题模型 TF-IDF有两种 jieba.analy ...
- 轮播图jq版
轮播图的需求 1:图片自己轮播,并且下面的tabs小图标跟着显示 2.鼠标hover到tabs上面显示对应的图片 3.点击左右按钮,显示下一张图片. <div id="oLunbo&q ...
- mapreduce总结
一.mapreduce简介 MapReduce是一种分布式计算模型,是hadoop的核心组件之一,是Google提出的,主要用于搜索领域,解决海量数据的计算问题. MR有两个阶段组成:Map和Redu ...
- 微信小程序电商实战-商品列表流式布局
今天给大家分享一下微信小程序中商品列表的流式布局方式,根据文章内容操作就可以看到效果哦~~~ 流式布局概念 流式布局也叫百分比布局 把元素的宽,高,margin,padding不再用固定数值,改用百分 ...
- 学习路线 roadmap
我的学习路线为HTML > CSS > Javsscript:Javascript是前端一切学习的基础.HTML和css一起学习. JavaScript基础: Js基础教程.js内置对象常 ...
- form中action属性后面?传递参数 获取不到
$p_id = $_REQUEST['p_id']; echo "<h1>您将更新商品编号为<span>$p_id</span>的商品信息 <a h ...
- 【干货】Html与CSS入门学习笔记9-11
九.盒模型 与元素亲密接触 1.盒模型 css将每个元素都看做一个盒子,包括以下属性: 内容区content area:包含内容,内容可以决定大小,也可以自行设定宽度和高度.元素的width属性指定的 ...
- Android5.0以后,materialDesign风格的加阴影和裁剪效果
5.0以后,materialDesign风格,出现了立体这种概念,高光,阴影,也就是Z轴,凸显层次:同时,裁剪view也变得方便简单了很多. 1,先说说阴影的实现. 方案1:在xml中设置 xml中设 ...
- Android GreenDao清空数据库的方法
最近在做项目的时候,为了方便测试人员测试,在应用中加入正式库和测试库切换的功能.为了防止正式库和测试库切换带来的数据冲突,切换的时候必须把当前的数据库清空.代码如下: package com.exam ...