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 selenium文件上传方法汇总
Nov 19 Python
简单谈谈Python中的json与pickle
Jul 19 Python
神经网络理论基础及Python实现详解
Dec 15 Python
python使用Apriori算法进行关联性解析
Dec 21 Python
python学生信息管理系统(完整版)
Apr 05 Python
matplotlib实现区域颜色填充
Mar 18 Python
python opencv摄像头的简单应用
Jun 06 Python
Python使用sklearn库实现的各种分类算法简单应用小结
Jul 04 Python
pandas.DataFrame的pivot()和unstack()实现行转列
Jul 06 Python
python关闭占用端口方式
Dec 17 Python
jupyter 导入csv文件方式
Apr 21 Python
python中scrapy处理项目数据的实例分析
Nov 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 破解防盗链图片函数
2008/12/09 PHP
PHP判断上传文件类型的解决办法
2015/10/20 PHP
PHP的openssl加密扩展使用小结(推荐)
2016/07/18 PHP
php中preg_replace_callback函数简单用法示例
2016/07/21 PHP
利用PHP访问带有密码的Redis方法示例
2017/02/09 PHP
PHP有序表查找之插值查找算法示例
2018/02/10 PHP
php 利用socket发送GET,POST请求的实例代码
2020/07/04 PHP
js下拉菜单语言选项简单实现
2013/09/23 Javascript
jquery渐隐渐显的图片幻灯闪烁切换实现方法
2015/02/26 Javascript
JS实现淡蓝色简洁竖向Tab点击切换效果
2015/10/06 Javascript
JS实现的简洁纵向滑动菜单(滑动门)效果
2015/10/19 Javascript
详解Node.js中的事件机制
2016/09/22 Javascript
Javascript刷新页面的实例
2017/09/23 Javascript
vue实现压缩图片预览并上传功能(promise封装)
2019/01/10 Javascript
vue eslint简要配置教程详解
2019/07/26 Javascript
[03:14]DOTA2斧王 英雄基础教程
2013/11/26 DOTA
[03:03]2014DOTA2西雅图国际邀请赛 Alliance战队巡礼
2014/07/07 DOTA
Python中的random()方法的使用介绍
2015/05/15 Python
python 根据正则表达式提取指定的内容实例详解
2016/12/04 Python
python Flask实现restful api service
2017/12/04 Python
python循环定时中断执行某一段程序的实例
2019/06/29 Python
python爬虫-模拟微博登录功能
2019/09/12 Python
Python 静态方法和类方法实例分析
2019/11/21 Python
在Python中通过threshold创建mask方式
2020/02/19 Python
Python3中的f-Strings增强版字符串格式化方法
2020/03/04 Python
关于Python字符串显示u...的解决方式
2020/03/06 Python
Python数据结构dict常用操作代码实例
2020/03/12 Python
python中使用.py配置文件的方法详解
2020/11/23 Python
使用HTML5 Canvas API绘制弧线的教程
2016/03/22 HTML / CSS
TripAdvisor印尼站:全球领先的旅游网站
2018/03/15 全球购物
波兰购物网站:MALL.PL
2019/05/01 全球购物
英国礼品和生活方式品牌:Treat Republic
2020/11/21 全球购物
日期和时间问题
2015/01/04 面试题
企业消防安全制度
2014/02/02 职场文书
诚实守信道德模范事迹材料
2014/08/15 职场文书
老干部座谈会主持词
2015/07/03 职场文书