django的登录注册系统的示例代码


Posted in Python onMay 14, 2018

摘要

django框架本身自带有登录注册,也可以自己写登录注册,下面将介绍这这2种方式实登录注册

一、自己写登录注册登出

1.注册regist

注册采用的是form表单,提交到数据库,在登录的时候,查询数据看,看用户有没有注册,如果用户没有注册,则返回注册页面注册

(1)models.py文件里创建相关的字段: 用户名字/用户密码/cookies携带的ticket

from django.db import models

# Create your models here.

class Users(models.Model):
  u_name = models.CharField(max_length=10)
  u_password = models.CharField(max_length=255)
  u_ticket = models.CharField(max_length=30, null=True)

  class Meta:
    db_table = 'day51_user'

(2)urls.py 配置相关路由

from django.conf.urls import url
from uauth import views
urlpatterns = [
  url(r'^regist/', views.regist),
  url(r'^login/', views.login),
  url(r'^logout', views.logout)
]

(3)views.py 书写regist方法

导入相关的包,在regist,login,logout都会使用到

import random
import time
from django.contrib import auth
from django.contrib.auth.hashers import make_password,check_password
from django.contrib.auth.models import User
from django.http import HttpResponseRedirect, HttpResponse
from django.shortcuts import render
from django.core.urlresolvers import reverse
# Create your views here.
from uauth.models import Users

如果用户请求regist方法,则直接跳转到相关的html页面。

如果用户在html页面点击了post按钮,对密码进行加密后,将数据提交到数据库,并返回登录login页面。

获得post提交的表单文字,使用request.POST.get(' ')

def regist(request):
  if request.method == 'GET':
    return render(request, 'day6_regist.html')
  if request.method == 'POST':
    # 注册
    name = request.POST.get('name')
    password = request.POST.get('password')
    # 对密码进行加密
    password = make_password(password)
    Users.objects.create(u_name=name, u_password=password)
    return HttpResponseRedirect('/uauth/login/')

编写regist的提交表单, method方法选择'POST'

文件目录在templates下[图片上传中...(image.png-cc7763-1526105439415-0)]

{%csrf_token%}是针对提交的时候csrf跨域错误

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>注册页面</title>
</head>
<body>
<form action="" method="POST">
  {% csrf_token %}
  注册姓名:<input type="text" name="name">
  注册密码:<input type="password" name="password">
  <input type="submit" value="提交">
</form>
</body>
</html>

2.登录login

(1)配置路由urls.py, 与注册的时候一样的操作

(2)配置views.py, 编写login方法

如果是GET请求,则跳转到登录的html界面中

def login(request):
  if request.method == 'GET':
    return render(request, 'day6_login.html')

如果是POST请求,则将获得的用户密码与数据库的用户密码进行比较。如果相同,就赋值一个ticker到浏览器上,将ticket存入数据库中,这样后续的浏览器操作只需判断ticket是否正确就好,如果错误,返回登录界面

知识点

绑定cookie命令: set_cookie

查询一个用户是否存在:exists()

def login(request):
  if request.method == 'GET':
    return render(request, 'day6_login.html')

  if request.method == 'POST':
    # 如果登录成功,绑定参数到cookie中,set_cookie
    name = request.POST.get('name')
    password = request.POST.get('password')
    # 查询用户是否在数据库中
    if Users.objects.filter(u_name=name).exists():
      user = Users.objects.get(u_name=name)
      if check_password(password, user.u_password):
        # ticket = 'agdoajbfjad'
        ticket = ''
        for i in range(15):
          s = 'abcdefghijklmnopqrstuvwxyz'
          # 获取随机的字符串
          ticket += random.choice(s)
        now_time = int(time.time())
        ticket = 'TK' + ticket + str(now_time)
        # 绑定令牌到cookie里面
        # response = HttpResponse()
        response = HttpResponseRedirect('/stu/index/')
        #max_age 存活时间(秒)
        response.set_cookie('ticket', ticket, max_age=10000)
        # 存在服务端
        user.u_ticket = ticket
        user.save() #保存
        return response
      else:
        # return HttpResponse('用户密码错误')
        return render(request, 'day6_login.html', {'password': '用户密码错误'})
    else:
      # return HttpResponse('用户不存在')
      return render(request, 'day6_login.html', {'name': '用户不存在'})

登录相关的html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>登录页面</title>
</head>
<body>
<form action="" method="POST">
  {% csrf_token %}
  登录姓名:<input type="text" name="name">
  登录密码:<input type="password" name="password">
  <input type="submit" value="提交">
</form>
</body>
</html>

相关的数据库

django的登录注册系统的示例代码

补充说明:如何在主页中判断ticket

知识点:获得浏览器cookie携带的ticket: request.COOKIES.get('ticket')

这只能判断一个网页需不需要进行判断验证,如果需要很多网页进行验证,这是需要采用中间件,这个稍候会涉及到

def index(request):
  if request.method == 'GET':
    # 获取所有学生信息
    ticket = request.COOKIES.get('ticket')
    if not ticket:
      return HttpResponseRedirect('/uauth/login/')
    if Users.objects.filter(u_ticket=ticket).exists():
      stuinfos = StudentInfo.objects.all()
      return render(request, 'index.html', {'stuinfos': stuinfos})
    else:
      return HttpResponseRedirect('/uauth/login/')

3.登出系统

实现登出目的,选择删除数据库中的ticket:delete_cookie

登出过后,自动跳转到登录界面

def logout(request):
  if request.method == 'GET':
    # response = HttpResponse()
    response = HttpResponseRedirect('/uauth/login/')
    response.delete_cookie('ticket')
    return response

4.中间件middleware

应用:在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法。

中间件的5个方法:

process_request(self,request) :当用户发起请求的时候会依次经过所有的的中间件,这个时候的请求是process_request :

process_view(self, request, callback, callback_args, callback_kwargs) :进入views函数, 执行process_view

process_template_response(self,request,response) : 只有当views函数中返回的对象中具有render方法,是就会直接process_template_responseprocess

process_exception(self, request, exception) : 当views的函数中出现错误时,就会执行process_exception方法

process_response(self, request, response)

:views函数处理后,在依次穿过中间件,这个时候是process_response,最后返回给请求者

中间件的运行流程

django的登录注册系统的示例代码

5. 使用中间件完成登录的验证

中间件return None 或什么都不返回的时候表示什么都不做,跳过这一个过程

配置中间件,实现登录的验证

(1)配置settings.py

1) 在主工程文件下创建一个utils文件,

在utils里: a. 创建中间件文件(名字自己取) b.创建一个工程文件 __init__.py

django的登录注册系统的示例代码

2)settings.py配置

在MIDDILEWARE里添加相关的文件路径

django的登录注册系统的示例代码

3) 配置相关的中间件文件

from django.http import HttpResponseRedirect
from django.utils.deprecation import MiddlewareMixin

from uauth.models import Users
from stu.models import Countaddstu


class AuthMiddleware(MiddlewareMixin):
  def process_request(self, request):
    # 统一验证登录
    # return none 或者 不写return才会继续往下执行, 不需要执行
    if request.path == '/uauth/login/' or request.path == '/uauth/regist/':
      return None
    ticket = request.COOKIES.get('ticket')
    if not ticket:
      return HttpResponseRedirect('/uauth/login/')

    users = Users.objects.filter(u_ticket=ticket)
    if not users:
      return HttpResponseRedirect('/uauth/login/')
# 将user赋值在request请求的user上,以后可以直接判断user有没有存在
# 备注,django自带的有user值
    request.user = users[0]

6. 至此,自己建造的登录验证系统已经完成

二、 django自带的登录验证系统

自带的登录验证系统中不需要自己手动的设置ticket

1.settings.py文件中配置没登录的跳转页面

LOGIN_URL = '/uauth/dglogin'

2.urls.py中配置相关路由

from django.conf.urls import url
from uauth import views
urlpatterns = [
  url(r'dglogin/', views.dglogin),
  url(r'^dgregist/', views.dgregist),
  url(r'^dglogout/', views.dglogout)
]

3. views.py导入相关的库文件

from django.contrib import auth
from django.contrib.auth.hashers import make_password, check_password
from django.contrib.auth.models import User
from django.http import HttpResponseRedirect, HttpResponse
from django.shortcuts import render

4.views.py文件中书写注册dgregist方法

from django.contrib.auth.models import User
def dgregist(request):
  if request.method == 'GET':
    return render(request, 'day6_regist.html')
  if request.method == 'POST':
    name = request.POST.get('name')
    password = request.POST.get('password')
    User.objects.create_user(username=name, password=password)
    return HttpResponseRedirect('/uauth/dglogin/')

5. views.py文件中书写注册dglogin方法

def dglogin(request):
  if request.method == 'GET':
    return render(request, 'login.html')
  if request.method == 'POST':
    name = request.POST.get('name')
    password = request.POST.get('password')
    # 验证用户名和密码,通过的话,返回User对象
    user = auth.authenticate(username=name, password=password)
    if user:
  
      auth.login(request, user)
      return HttpResponseRedirect('/stu/index/')
    else:
      return render(request, 'index.html')

6. 在app的urls.py中设置验证require

from django.conf.urls import url
from django.contrib.auth.decorators import login_required
from stu import views
urlpatterns = [
  url(r'addstu/', login_required(views.addStu), name='add'),
  url(r'index/', login_required(views.index)),
]

7.登出dglogout

def dglogout(request):

  if request.method == 'GET':
    auth.logout(request)
    return HttpResponseRedirect('/uauth/dglogin')

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
用Python计算三角函数之acos()方法的使用
May 15 Python
Python中MySQL数据迁移到MongoDB脚本的方法
Apr 28 Python
Python中enumerate()函数编写更Pythonic的循环
Mar 06 Python
Python设计模式之模板方法模式实例详解
Jan 17 Python
基于python实现高速视频传输程序
May 05 Python
python3中替换python2中cmp函数的实现
Aug 20 Python
python实现在多维数组中挑选符合条件的全部元素
Nov 26 Python
python标识符命名规范原理解析
Jan 10 Python
了解一下python内建模块collections
Sep 07 Python
python批量合成bilibili的m4s缓存文件为MP4格式 ver2.5
Dec 01 Python
Python爬虫之Selenium设置元素等待的方法
Dec 04 Python
Python中使用Selenium环境安装的方法步骤
Feb 22 Python
django允许外部访问的实例讲解
May 14 #Python
运行django项目指定IP和端口的方法
May 14 #Python
python使用Flask操作mysql实现登录功能
May 14 #Python
查看Django和flask版本的方法
May 14 #Python
Python处理中文标点符号大集合
May 14 #Python
python numpy格式化打印的实例
May 14 #Python
Python常见字典内建函数用法示例
May 14 #Python
You might like
PHP iconv 解决utf-8和gb2312编码转换问题
2010/04/12 PHP
PHP中的Memcache详解
2014/04/05 PHP
php常用的工具开发整理
2019/09/26 PHP
在html页面中包含共享页面的方法
2008/10/24 Javascript
apycom出品的jQuery精美菜单破解方法
2011/02/18 Javascript
JS中获取数据库中的值的方法
2013/07/14 Javascript
探讨JQUERY JSON的反序列化类 using问题的解决方法
2013/12/19 Javascript
浅谈jQuery异步对象(XMLHttpRequest)
2014/11/17 Javascript
firefox浏览器用jquery.uploadify插件上传时报HTTP 302错误
2015/03/01 Javascript
javascirpt实现2个iframe之间传值的方法
2016/06/30 Javascript
微信js-sdk地理位置接口用法示例
2016/10/12 Javascript
微信小程序 购物车简单实例
2016/10/24 Javascript
javascript中mouseenter与mouseover的异同
2017/06/06 Javascript
Angularjs为ng-click事件传递参数
2017/06/15 Javascript
JS 正则表达式验证密码、邮箱格式的实例代码
2018/10/28 Javascript
关于layui flow loading占位图的实现方法
2019/09/21 Javascript
JS实现排行榜文字向上滚动轮播效果
2019/11/26 Javascript
Node使用koa2实现一个简单JWT鉴权的方法
2021/01/26 Javascript
vue集成一个支持图片缩放拖拽的富文本编辑器
2021/01/29 Vue.js
Python语言编写电脑时间自动同步小工具
2013/03/08 Python
Python随机生成带特殊字符的密码
2016/03/02 Python
Python判断文件和字符串编码类型的实例
2017/12/21 Python
对python中Librosa的mfcc步骤详解
2019/01/09 Python
Python TKinter如何自动关闭主窗口
2020/02/26 Python
python搜索算法原理及实例讲解
2020/11/18 Python
用Python实现童年贪吃蛇小游戏功能的实例代码
2020/12/07 Python
CSS3自定义滚动条样式的示例代码
2017/08/21 HTML / CSS
瑞典最大的儿童用品网上商店:pinkorblue.se
2021/03/09 全球购物
园长自我鉴定
2013/10/06 职场文书
半年思想汇报
2013/12/30 职场文书
求职信怎么写
2014/05/23 职场文书
2014年高中生自我评价范文
2014/09/26 职场文书
2015年管理人员工作总结
2015/05/13 职场文书
2015重阳节敬老活动总结
2015/07/29 职场文书
初一军训感言
2015/08/01 职场文书
Lakehouse数据湖并发控制陷阱分析
2022/03/31 Oracle