django -- 实现ORM登录

本文涉及的产品
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
简介: django -- 实现ORM登录

前戏


上篇文章写了一个简单的登录页面,那我们可不可以实现一个简单的登录功能呢?如果登录成功,给返回一个页面,失败给出错误的提示呢?

在之前学HTML的时候,我们知道,网页在往服务器提交数据的时候,都是在form表单里,并且要满足下面的几个条件:

1.form标签必须要有action和method属性,如果是文件上传还要加上下面的一句

<form action="www.baidu.com" enctype="multipart/form-data"></form>

2.所有获取用户的标签必须放在form表单中,必须要有name属性

3.必须要有submit按钮


Django必学三件套


Django 基础必会三件套,render,HttpResponse,redirect

from django.shortcuts import HttpResponse, render, redirect

HttpResponse:返回一个指定的字符串

render:返回一个HTML文件

redirect:跳转url,如果是同一个网站,可以省略域名,如果想跳转到其他网站,要写上全部的网址

知道了form表单提交数据的三个要素后,我们修改一下login.html文件

View Code

注意:action="/login/"要加/,要不然下面的错误时路径会是这样的:login/login

我们在去login函数里打印一下request.GET

def login(request):
    print(request.GET)
    return render(request,'login.html')

结果:

[02/Jul/2019 20:46:35] "GET /login/login?email=%40163.com&pwd=123 HTTP/1.1" 200 3532
<QueryDict: {'email': ['@163.com'], 'pwd': ['123']}>

可以看到,我们在登录页面输入的邮箱和密码都以字典的方式传给了后台,其中字典的key就是我们在html文件里对应标签的name属性,如果没有name属性,则为空

我们提交数据的时候,通常都是以post方法来提交的,get通常是用于获取数据的,那我们把login.html文件里的method=‘get’改为post,在来试一下

<form class="form-horizontal" action="login" method="post">

上面的错误信息告诉了我们:CSRF验证失败。请求中止。我们只需要把setting.py里的CSRF注释掉就可以了

'django.middleware.csrf.CsrfViewMiddleware' #注释掉这行

先去把login函数里的GET换成POST

print(request.POST),然后就可以正常访问了

那我们登录之后能不能给浏览器返回一个“登录成功”的提示呢?

index.html

View Code

先在view里创建一个index的函数

def index(request):
    return render(request,"index.html")

这里我们需要导入HttpResponse,然后再url.py新增index的路径

from . import views
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^login/', views.login),
    url(r'^index/', views.index),
]

在login函数里写如下代码

def login(request):
    if request.method == 'POST':
        email = request.POST.get('email')
        pwd = request.POST.get('pwd')
        if email == 'zouzou' and pwd == '123':
            return redirect('/index/')
            # return HttpResponse('ok')
    else:

这样我们如果输入的是zouzou和123,则会跳转到index页面,那如果我们需要错误的时候给我们提示怎么办呢?django提供了我们模版语言;{{变量名}},我们在login.html的button按钮下面加入如下代码

<button type="submit" id="b1" class="btn btn-block btn-primary">登录</button>
<p style="color: red;text-align: center">{{ error_msg}}</p>

在去修改login函数里的代码

def login(request):
    error_msg=''
    if request.method == 'POST':  #如果是post,表示提交数据
        email = request.POST.get('email')
        pwd = request.POST.get('pwd')
        if email == 'zouzou' and pwd == '123':
            #登录成功跳转到index页面
            return redirect('/index/')
            # return HttpResponse('ok')
        else:
            #登录失败,提示用户名密码错误
            error_msg = '邮箱或密码错误'
    #如果是GET,表示要获取这个页面
    return render(request,'login.html',{"error_msg":error_msg})

这样,我们输入正确的邮箱和密码就会跳转到index页面,错误的会提示


app


上面我们把login函数和index函数都放到了views.py文件里面。试想一下,如果我们的项目有成百上千个函数呢?放到一个py文件里是不是很麻烦。

python给我们提供了app的功能,我们可以把一个模块放到一个app里,可以有多个app,不同的功能放到不同的app里面。


创建app:

如下我们创建了一个叫“appTest01”的项目

python manage.py startapp appTest01

创建完app后,我们要告诉Django我们创建了一个叫“appTest01”的app,去setting.py里加上下面的代码。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'appTest01.apps.Apptest01Config', # 告诉django我们创建了一个叫appTest01的app
    # 'appTest01',  #  上面代码的简写方式
]

上面的设置好了之后,我们把之前在view.py里写的代码放到刚创建的appTest01下的view.py里面,然后去url.py里把导入的view.py改一下。启动我们的项目,访问登录页面,能正常访问就表示我们的设置是没有问题的


ORM


前面我们的邮箱和密码是写死的。我们可不可以从数据库里面读取数据做一个判断呢?这时我们就要用到ORM了,那什么是ORM呢?

ORM就是一群写代码的,懒的写sql语句,写了一个工具,自动生成sql语句

ORM:Object Relational Mapping(关系对象映射)

类名对应------------》数据库中的表名

类属性对应---------》数据库里的字段

类实例对应---------》数据库表里的一行数据 

ORM的优势

Django的orm操作本质上会根据对接的数据库引擎,翻译成对应的sql语句;所有使用Django开发的项目无需关心程序底层使用的是MySQL、Oracle、sqlite....,如果数据库移只需要更换Django的数据库引擎即可

ORM的缺点就是执行效率低


1.创建数据库


由于ORM没有没有创建数据库的方法,所以我们手动创建一个数据库:

create database mysite;


2.告诉Django连接哪个数据库


因为Django默认的数据库是sqlite3,我们要使用mysql,所以要告诉mysql,去setting.py里修改如下代码

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',  # 连接数据库的类型
        'NAME': 'mysite',  # 数据库名
        'HOST': '127.0.0.1',  # 数据库主机地址
        'PORT': 3306,  # 数据库的端口
        'USER': 'root',  # 登录数据库的用户名
        'PASSWORD': '123456',  # 登录数据库的密码
    }
}


3.用什么连接数据库


上面我们已经告诉了django连接哪个数据库,那用什么连?利用第三方的包,比如第三方包:pymysql和MySQLdb,因为MySQLdb不支持python3,所以我们使用pymysql来连接数据库,之前也写过pymysql连接mysql的文章

去和setting.py同级的__init__.py里告诉Django用pymysql模块代替默认的MySQLdb去连接MySQL数据库,写上如下代码

import pymysql
pymysql.install_as_MySQLdb()


4.创建数据表


数据库已经配置好了,也告诉了用什么连,然后我们使用ORM去创建一个数据表。

在appTest01/models.py的文件中创建类(只能在这里面创建),类必须继承models.Model

from django.db import models
# Create your models here.
class User(models.Model):
    id = models.AutoField(primary_key=True)   # 创建一个自增的id作为主键
    email = models.CharField(max_length=32)   # varchar(32)
    pwd = models.CharField(max_length=32)     # varchar(32)

代码解释:

我们创建了一个User的类,上面也说过,类名对应的数据库表,所以会给我们创建一个User的数据表。类下面的就是ORM的语法,创建了三个字段,分别是id(主键)和长度为varchar(32)的email和pwd字段


5.生成数据表


现在我们已经万事具备,只欠东风了,只要生成数据表就可以了,ORM提供了我们两条命令来生成数据表

1.

python manage.py makemigrations  #根据app下的migrations目录中的记录,检测当前model层代码是否发生变化

结果:

Migrations for 'appTest01':
  appTest01\migrations\0001_initial.py
    - Create model User

2.执行完下面的代码如果都显示OK就表示数据表创建成功了

python manage.py migrate  #把orm代码转换成sql语句去数据库执行

上面是对所有的 app 进行迁移,也可以针对某些单独的app进行迁移

# python manage.py makemigrations <appname>
# python manage.py migrate <appname>


使用pycharm连接mysql数据库


点击右边的DataBase


使用ORM查询数据


上面的apptest01_user是我们创建的表,其他的都是django默认帮我们创建的。我们往数据表里插几条数据

这样,数据我们有了,那我们怎么获取到数据库里的数据和用户输入的数据对比呢?ORM提供了我们一种User.objects.filter(email='', pwd='') 的方法来查询数据

注意:前面的Uer是我们的数据表名,email和pwd是我们数据表里的字段,那我们是不是可以修改一下登录函数了呢

from django.shortcuts import render,HttpResponse,redirect
from appTest01.models import User
def login(request):
    error_msg=''
    if request.method == 'POST':  #如果是post,表示提交数据
        ema = request.POST.get('email')
        password = request.POST.get('pwd')
        res = User.objects.filter(email=ema,pwd=password)
        print(res)
        if res:
            #登录成功跳转到index页面
            return redirect('/index/')
            # return HttpResponse('ok')
        else:
            #登录失败,提示用户名密码错误
            error_msg = '邮箱或密码错误'
    #如果是GET,表示要获取这个页面
    return render(request,'login.html',{"error_msg":error_msg})
def index(request):
    return render(request,"index.html")

如果查询到res的值就是

<QuerySet [<User: User object>]>

查询不到res的值就是

<QuerySet []>

如果要获取对应的值,可以用下面的方法

print(res[0].id,res[0].email,res[0].pwd)  # 获取到数据库里对应的字段

对象.属性《-----》数据表里具体字段的值


总结:


1. form表单提交数据的三个要素

  1.1. form标签必须要有action和method属性

  1.2. 所有获取用户输入的标签必须放在form表单中,必须要有name属性

  1.3. 必须要有submit按钮

2. Django 基础必会三件套

from django.shortcuts import HttpResponse, render, redirect

  2.1. HttpResponse      返回一个指定的字符串时

  2.2. render        返回一个HTML文件

  2.3. redirect      跳转

3. request相关的属性

  3.1. request.method --> 返回的是请求的方法(全大写):GET/POST ...

  3.2. request.GET --> 取得是URL里面的参数,类似于字典的数据结构

  3.3. request.POST --> post提交的数据,类似于字典的数据结构


4. Django的模板语言

{{ 变量名 }}

5. Django项目app --> 项目中又分了一级Python包,不同的功能放到不同的包里面

  5.1. 创建app

    python manage.py startapp app01

  5.2. 告诉Django创建了一个app

    在settings.py找那个的INSTALLED_APPS中添加新创建的app

6. Django中ORM的使用

  6.1. 用处

    6.1.1. 操作数据表

    6.2.2. 操作数据行

  6.2. 使用

    6.2.1. 手动创建一个数据库

      -> create database mysite;

    6.2.2. 告诉Django连哪个数据库

DATABASES = {
        'default': {
          'ENGINE': 'django.db.backends.mysql', # 连接数据库的类型
          'NAME': 'mysite', # 数据库名
          'HOST': '127.0.0.1', # 数据库主机地址
          'PORT': 3306, # 数据库的端口
          'USER': 'root',
          'PASSWORD': '123456',
          }
         }

  6.3. 用什么连数据库?

    利用第三方的包,比如第三方包:pymysql和MySQLdb

    告诉Django用pymysql模块代替默认的MySQLdb去连接MySQL数据库

    和settings.py同级的__init__.py文件,写上:

import pymysql
pymysql.install_as_MySQLdb()

  6.4. 在app/models.py的文件中创建类,只能在这里面创建

    类必须继承models.Model

  6.5. 两个命令

    6.5.1. python manage.py makemigrations --> 把models.py的变更记录一下,注意要保证数据库里的和ORM变更记录一样,否则会报错

    6.5.2. python manage.py migrate --> 把上面的变更记录翻译成SQL语句,去数据库执行

    6.5.3. ORM查询

      User.objects.filter(email='', pwd='')

    6.5.4.数据表名或结构变了都要重新执行一下6.5.1和6.5.2


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
SQL 安全 数据库
如何在Django中正确使用参数化查询或ORM来避免SQL注入漏洞?
如何在Django中正确使用参数化查询或ORM来避免SQL注入漏洞?
1002 173
|
SQL 定位技术 数据库
深入探索Django ORM:高效数据库操作的秘诀####
本文旨在为读者揭开Django ORM(对象关系映射)的神秘面纱,通过一系列生动的比喻和详实的案例,深入浅出地讲解其核心概念、工作原理及高级特性。我们将一起探讨如何利用Django ORM简化数据库交互,提升开发效率,同时确保数据的一致性和安全性。不同于传统的技术文档,本文将以故事化的形式,带领读者在轻松愉快的氛围中掌握Django ORM的精髓。 ####
|
SQL 监控 数据库
深入探索Django ORM:高效数据操作的秘诀与实践####
在当今的Web开发领域,提升数据访问层的效率是优化应用性能的关键。本文旨在通过剖析Django框架中的ORM(对象关系映射)机制,揭示其如何简化数据库交互,并探讨一系列高级技巧与策略,帮助开发者构建更高效、可维护的数据访问代码。我们不涉及安装步骤或基础概念,而是聚焦于实战经验分享,旨在为中高级开发者提供深度洞见。 ####
|
监控 数据可视化 前端开发
基于python django的电商数据分析系统,包括大屏和登录
本文介绍了一个基于Python Django框架开发的电商数据分析系统,该系统具备大屏展示功能和用户登录机制,旨在帮助电商企业实时监控和分析销售数据,支持多维度数据分析和趋势预测。
553 0
基于python django的电商数据分析系统,包括大屏和登录
|
数据采集 存储 数据可视化
基于python django的智联招聘数据采集与分析系统,有登录注册,可自主选择采集内容
本文介绍了一个基于Python Django框架的智联招聘数据采集与分析系统,该系统具备登录注册功能,允许用户自主选择采集内容,并通过对数据的分析和可视化展示,帮助企业和招聘者优化招聘策略。
521 1
基于python django的智联招聘数据采集与分析系统,有登录注册,可自主选择采集内容
|
数据采集 数据可视化 数据挖掘
基于python django的scrapy去哪儿网数据采集与分析,包括登录注册和可视化大屏,有md5加密
本文介绍了一个基于Python和Django框架,使用Scrapy进行去哪儿网数据采集与分析的项目,包括实现登录注册功能、MD5加密以及通过可视化大屏展示分析结果的综合系统。
309 1
基于python django的scrapy去哪儿网数据采集与分析,包括登录注册和可视化大屏,有md5加密
|
存储 NoSQL 中间件
【Django+Vue3 线上教育平台项目实战】登录功能模块之短信登录与钉钉三方登录
在当今的数字化时代,用户认证是任何在线服务安全性的基石。本文将简明扼要地介绍登录注册流程中的核心概念:HTTP无状态性、Session、Token与JWT,并详细阐述两种实用登录方式—— 手机号登录验证(借助容联云/云通讯服务) 与钉钉第三方登录。我们将探讨这些概念的基本原理,并深入解析两种登录方式的实现流程,旨在帮助开发者提升用户认证的安全性与便捷性。
【Django+Vue3 线上教育平台项目实战】登录功能模块之短信登录与钉钉三方登录
|
数据库 Python
Django ORM
【8月更文挑战第23天】
231 4
|
数据管理 数据挖掘 调度
Django后端架构开发:URLconf到ORM深度剖析
Django后端架构开发:URLconf到ORM深度剖析
220 1