tornado之人脸登录

image.png

image文件是因为这没摄像头用的照片替换的

首先要到百度云去找到人脸登录的东西

还要导入js

在manage.py文件中

import os

import tornado.web  # 生成应用
import tornado.ioloop   # 启动
from tornado.options import define, parse_command_line, options

from face.views import RegisterHandler, InitDbHandler, LoginHandler

define('port', default=8080, type=int)


def make_app():
    return tornado.web.Application(handlers=[
        (r'/register/', RegisterHandler),
        (r'/init_db/', InitDbHandler),
        (r'/login/', LoginHandler)
    ],
    template_path =os.path.join(os.path.dirname(os.path.abspath(__file__)), 'templates'),
        static_path=os.path.join(os.path.dirname(os.path.abspath(__file__)), 'static')
    )
    

if __name__ == '__main__':
    parse_command_line()
    app = make_app()
    app.listen(options.port)
    # 启动
    tornado.ioloop.IOLoop.current().start()

face文件夹

模型文件 models.py

from datetime import  datetime

from sqlalchemy import Column, Integer, String, DateTime

from utils.conn import Base


def init_db():
    # 模型映射成表,定义的
    Base.metadata.create_all()


class User(Base):

    id = Column(Integer, primary_key=True, autoincrement=True)
    username = Column(String(10), unique=True, nullable=False)
    realname = Column(String(10), unique=True, nullable=False)
    create_time = Column(DateTime, default=datetime.now)

    __tablename__ = 'user'

views.py文件


import tornado.web

from face.models import User
from utils.conn import Base, session
from utils.faceId import face_register, face_login


class RegisterHandler(tornado.web.RequestHandler):
    def get(self):
        error = ''
        self.render('register.html', error=error)

    # 提交照片,保存
    def post(self):
        # 注册功能
        # 获取数据
        face = self.get_argument('face_img')
        # print(face.split(',')[-1]) 取图片, 它是编码值
        img = face.split(',')[-1]
        username = self.get_argument('username')
        realname = self.get_argument('realname')
        if face and username and realname:
            # 人脸注册进去 - 用户模型
            user = User()
            user.username = username
            user.realname = realname
            session.add(user)
            session.commit()
            # 调用百度的人脸注册接口
            res = face_register(img, user.id)
            if res:
                # 注册成功,跳转登录
                self.redirect('/login/')
            else:
                session.delete(user)
                session.commit()
                self.redirect('/register/')
            # self.write('测试注册')
        else:
            error = '请填写完整的参数'
            self.render('register.html', error=error)


class InitDbHandler(tornado.web.RequestHandler):

    def get(self):
        # 将模型映射到数据库中
        # Base.metadata.create_all()

        self.write('创建表成功')


class LoginHandler(tornado.web.RequestHandler):

    def get(self):
        self.render('login,html')

    def post(self):
        face = self.get_argument('face_img')
        img = face.split(',')[-1]
        res = face_login(img)
        if res:
            self.write('登录成功')
        else:
            self.write('登录失败')

在templates文件中

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册</title>
    <script src="{{ static_url('js/ai.js') }}"></script>
    <script src="https://code.jquery.com/jquery-3.0.0.min.js

"></script>
</head>
<body>
    <input type="button" value="摄像" onchange="getMedia()">
    <video height="120px" autoplay="autoplay"></video>
    <!--画布-->
    <canvas id="canvas1" height="220px" width="200px"></canvas>
    <input type="button" value="拍照" onclick="getPhoto();">
    {{ error }}
    <form action="" method="post">
        <!--hidden是隐藏 获取拍照图片的类型值-->
        <input type="hidden" id="face" name="face_img">
          <p><input type="submit" name="提交"></p>
    </form>
</body>
</html>

register.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册</title>
    <script src="{{ static_url('js/ai.js') }}"></script>
    <script src="https://code.jquery.com/jquery-3.0.0.min.js

"></script>
</head>
<body>
    <input type="button" value="摄像" onchange="getMedia()">
    <img src="{{ static_url('image/qq1.jpg') }}" height="120px">
    <video height="120px" autoplay="autoplay"></video>
    <!--画布-->
    <canvas id="canvas1" height="220px" width="200px"></canvas>
    <input type="button" value="拍照" onclick="getPhoto();">
    {{ error }}
    <form action="" method="post">
        <!--hidden是隐藏 获取拍照图片的类型值-->
        <input type="hidden" id="face" name="face_img">
          <p>账号: <input type="text" name="username"></p>
          <p>真实姓名:<input type="text" name="realname"></p>
          <p><input type="submit" name="提交"></p>
    </form>
</body>
</html>

然后我们要连接到数据库,将图片保存到数据库中,以后登录时与数据库中的照片做对比

utils文件包中

conn.py文件中

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base # 生成base
from sqlalchemy.orm import sessionmaker

db_url = 'mysql+pymysql://root:root@127.0.0.1:3306/tornado9'

engine = create_engine(db_url)

Base = declarative_base(bind=engine)

DbSession = sessionmaker(bind=engine)
session = DbSession()

faceId.py文件中

from aip import AipFace

""" 你的 APPID AK SK """
APP_ID = '15750965'
API_KEY = 'R8vFwISg2pARS8SjFtPKZElB'
SECRET_KEY = 'kd3amWfp3Ywap02Fx3PElwKI2Fhmxdwn'

client = AipFace(APP_ID, API_KEY, SECRET_KEY)


def face_register(image, imageType='BASE64', groupId='user', userId=None):
    """
    调用百度的人脸注册接口
    :return:
    """
    """ 调用人脸检测 """
    res = client.addUser(image, imageType, groupId, userId)
    # print(res)
    if res['error_code']:
        # 注册失败
        return False
    # 注册成功
    return True


def face_login(image, imageType='BASE64', groupId='user'):

    res = client.search(image, imageType, groupId)
    # print(res)
    if res['error_code']:
        return False
    return True
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容

  • (一)、启动服务器 (二)、创建数据库表 或 更改数据库表或字段 Django 1.7.1及以上 用以下命令 1....
    夏天夏星阅读 5,637评论 0 17
  • 模块间联系越多,其耦合性越强,同时表明其独立性越差( 降低耦合性,可以提高其独立性)。软件设计中通常用耦合度和内聚...
    riverstation阅读 2,064评论 0 8
  • 此段内容简要来自自强学堂的教程详情请查询自强学堂 一、 后台的运作流程 接收request请求 处理数据 获取请求...
    coder_ben阅读 5,246评论 6 56
  • Django是一个用 Python 编写的 Web 框架。Web 框架是一种软件,基于web框架可以开发动态网站,...
    guanalex阅读 7,178评论 0 5
  • 爱情有如音乐,是两颗心的协奏曲,而不是一颗心的独奏曲,更不是三人以上的交响乐。 ...
    云舒笔记阅读 217评论 0 0