强力Ddjango第六章1-3

[第一节] 首页和登录页的展现
1.首先将前端的html页面拷贝到项目的templates,静态文件拷贝到static下


image.png

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





    
    
    
    课程机构列表 - 慕学在线网
    
    
    

    
    



{% if request.user.is_authenticated %}

服务电话:888888

luky

django

bobby

{% else %}

服务电话:888888

注册 登录
{% endif %}
  • 专业权威

  • 课程最新

  • 名师授课

  • 数据真实

公开课程

名师授课
专业权威

查看更多课程 >

django入门

难度:初级 学习人数:3
慕课网 0

java入门

难度:中级 学习人数:0
北京大学 0

python入门

难度:中级 学习人数:0
南京大学 0

java入门2

难度:高级 学习人数:0
慕课网2 0

java入门3

难度:初级 学习人数:1
慕课网3 0

python入门2

难度:中级 学习人数:0
慕课网666 0

login.html





    
    
    
    慕学在线网登录
    
    


成功提交

您的需求提交成功!

邮件验证提示

我们已经向您的邮箱[email protected]发送了邮件,
为保证您的账号安全,请及时验证邮箱

去邮箱验证

没收到,您可以查看您的垃圾邮件和被过滤邮件,
也可以再次发送验证邮件

慕学在线网,在线学习平台!

重启项目 此时访问页面,可以看到正常的页面了。

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的登录部分


image.png

这里前端给我的是login.html,实际上这样是无法访问的,我们需要修改成以下代码

登录

此时重启,点击首页右上角的登录,即可跳转到login页面


image.png

[第二节] 登录页面的逻辑①
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

               

帐号登录

此时重启项目,访问登陆页面,随便输入用户密码点击 立即登陆会报错,这是 django的防御机制,需要验证csrf_token


image.png

4.在前端页面增加csrf_token,修改login.html

                       忘记密码?
                    
{% csrf_token %}

没有慕学在线网帐号?[立即注册]

5.功能验证

设置断点


image.png

输入用户名和密码后点击立即登录


image.png

查看 pygame的调试输出


image.png

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

    
{% if request.user.is_authenticated %}

服务电话:888888

luky

django

bobby

{% else %}

服务电话:888888

注册 登录
{% endif %}

重启项目,登录用户名密码,查看首页


image.png

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.验证
通过断点,重启项目,输入邮箱账号密码,验证登陆是否成功


image.png

然后查看pycharm,如图所示,已经进入Custom中,按F8走完流程


image.png

image.png

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里定义的错误输出


更改后的完整文件如下:





    
    
    
    慕学在线网登录
    
    


成功提交

您的需求提交成功!

邮件验证提示

我们已经向您的邮箱[email protected]发送了邮件,
为保证您的账号安全,请及时验证邮箱

去邮箱验证

没收到,您可以查看您的垃圾邮件和被过滤邮件,
也可以再次发送验证邮件

慕学在线网,在线学习平台!

重启项目,输入错误的登陆信息


image.png

你可能感兴趣的:(强力Ddjango第六章1-3)