Every bady 瞧一瞧,看一看啊!
终于到了最激动人心的环节,从今天开始我们就要学习django的登录和注册了,是不是很激动(dog)在开始今天的笔记之前 我们还是要知道几个基本的概念。
但是……
这上面这四个问题都是一个单独的笔记,每一个都能说半天,今天就不在这里进行赘述了。
今天的任务就是把一个简单的登录代码写出来,然后对里面代码进行一次分析,这次还是草稿,后面可能还会对里面的代码就行修改,一切以最新的代码为准
老规矩 首先附上代码
"""moou URL Configuration The `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/2.2/topics/http/urls/ Examples: Function views 1. Add an import: from my_app import views 2. Add a URL to urlpatterns: path('', views.home, name='home') Class-based views 1. Add an import: from other_app.views import Home 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') Including another URLconf 1. Import the include() function: from django.urls import include, path 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ from django.contrib import admin from django.urls import path import xadmin from apps.users import views as Uview urlpatterns = [ path('admin/', xadmin.site.urls), path('',Uview.index,name='index'), path('login/',Uview.LoginView.as_view(),name='login') ] from django.conf.urls.static import static from moou import settings urlpatterns += static(settings.MEDIA_URL,document_root = settings.MEDIA_ROOT)
path('',Uview.index,name='index'), path('login/',Uview.LoginView.as_view(),name='login')
这两段代码就是分别指向了 index函数和登录函数
仔细看 第一个后面调用函数 直接就是模块名加对应的函数“Uview.index”
而第二个前面也是 不过这里的LoginView是一个类后面加了一个as_vies()
同样是指向某一个函数 但是为什么调用的方法不同。
why……?
这里的区别就是在开始讲的需要了解的几个知识中的一个
什么是CBV 什么是FBV
简单来说就是一个是用类来编写函数方法,一个是用方法来编写函数方法,具体的后面会详细写一张博客来好好讲讲。这里我想留个悬念
这里我是在users app下创建的view.py写的逻辑,其实在哪里写都行,不过这种涉及用户登录和注册的逻辑在users app下写更符合整体的规范。这些都是题外话(就是凑字数)
闲扯也扯完了 该上大戏了
# views.py from django.shortcuts import render from django.views import View from django.contrib.auth import authenticate, login # django自带登录 from django.http import HttpResponseRedirect from django.urls import reverse # Create your views here. def index(request): return render(request, 'index.html') class LoginView(View): def get(self, request, *args, **kwargs): return render(request, 'login.html') def post(self, request, *args, **kwargs): user_name = request.POST.get('username') password=request.POST.get('password') user = authenticate(username = user_name,password=password) if user is not None: '''查询到用户''' login(request,user) # 进行登录 return HttpResponseRedirect(reverse('index')) else: return render(request,'login.html',{'msg':'用户名或密码错误'})
这里的两个代码 一个是使用方法,一个是类。
首先index方法主要管的是页面的初始化就是返回网页的首页 ,没什么好讲的。
重点来了 看第二个 LoginView 这个类 里面总共有两个方法 一个get 和一个post 那个get我们先不管 我们首先管 这里的和 post 方法。
post方法的作用就是用来登录用户的, 用户在前端使用from表单 来进行登录
user_name = request.POST.get('username') password=request.POST.get('password')
获取输入的用户名和密码
user = authenticate(username = user_name,password=password)
这一段django自动判断输入的用户名和密码在不在数据库中我们不用在手动查看数据库了djagno已经自动帮咱们查询好了 牛不牛
if user is not None: '''查询到用户''' login(request,user) # 进行登录 return HttpResponseRedirect(reverse('index')) else: return render(request,'login.html',{'msg':'用户名或密码错误'})
这里就是最后一步 根据上面判断用户是否存在如果存在就登录,如果不存在返回到HTML页面同时返回错误信息。
这里你可能就有疑问了 同样是返回页面 为什么一个是使用render,一个是HttpResponseRedirect,Why?
这里其实使用render 也可以 不过会出现一个问题就是 他虽然返回了网页但是他浏览器的网址依旧还是/login/ ,有点小瑕疵。
如果使用HttpResponseRedirect这个就不会了 他通常是跟reverse 一起使用 reverse 里面跟我们在url.py**中后面定义那个方法名字,它会自动跳转到对应的url中。
首先 前段这写网页都是课程老师他们写好的 如一些js和css样式 我这跟着教程就直接套用老师的HTML 开始就是一些繁琐的工作替换HTML网页中的一些外部样式。
在之前的博客中我提到 在django中我们定义了static 这个文件里面专门用来存放外部样式,正常的一个导入外部样式的代码是
<link rel="stylesheet" type="text/css" href="../css/style.css">
而在django中就需要改为
<link rel="stylesheet" type="text/css" href="/static/css/style.css">
前面加上 /static
明白了这个我们就直接调用pycharm替换的快捷键 ctrl+R 进行替换,这一步过于繁琐我就没有截图演示。
不过注意一点 这里有一个media 文件夹 他本身应该是一个跟static平级的文件夹里面存放写用户上传的文件,不过在刚开始就把他放到static中 后面会进行更改这里不用太过在意。
因为这个代码量过多 我就只复制了登录部分
<form class="tab-form" action="{% url 'login' %}" method="post" autocomplete="off" id="form1"> <div class="form-group marb20 "> <input name="username" id="account_l" type="text" placeholder="手机号/邮箱" /> </div> <div class="form-group marb8 "> <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="立即登录 > " /> </form>
这登录部分并没有做过多的修改 只是在form表单的下面我加一个{% csrf_token %} 这里就是我在一开始的那四个问题中的 关于csrf是什么。这里就先再挖个坑(这都第几个坑了)
反正现在只要记得 在进行post请求的时候要么加{% csrf_token %} 要么在setting.py 把
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', # 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ]
中的
django.middleware.csrf.CsrfViewMiddleware
注释掉。
下面是在index.html里面主要做的修改
<div class="top"> <div class="wp"> <div class="fl"><p>服务电话:<b>33333333</b></p></div> <!--登录后跳转--> {% if request.user.is_authenticated %} <div class="personal"> <dl class="user fr"> <dd>bobby<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> {% else %} <a style="color:white" class="fr registerbtn" href="register.html">注册</a> <a style="color:white" class="fr loginbtn" href="{% url 'login' %}">登录</a> {% endif %} </div> </div>
这里主要用了两个知识点 一个是 request.user.is_authenticated
这个意思就是判断当前网站中是否登录,为什么前段会知道用户登录了??
请往这边看
'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ],
在setting.py中的TEMPLATES 里面有这样第一个键值对
context_processors 它里面就存放了django用户登录状态,一但用户成功登录,session 一存到电脑中,现在这个request就能在全部的网页中存在,并进行调用。
session是什么? 我在挖一个坑(这都第几个坑了,嘿嘿)
{% if 。。。 %} {% else %} {% endif %}
这个熟不熟悉 ,这个不就是if判断嘛 怎么在前段里面了?
对了 这就是一个if判断 这是django的前段渲染语句 关于django的前段渲染语句还有很多 后面我会再专门写一个文章进行介绍的。(得!又挖了一个坑)