tornado 相关说明

在 handlers 中创建个 auth.py 用来做用户登录,在这文件中创建个类,并逐步完善

在 tornado 中创建 login.html 文件,是个登录页面

{% extends 'base.html' %}
{% block title %}登录{% end %} {% block content %}
<h3>登录首页</h3>
<form action="/login" method="post" enctype="multipart/form-data">
<p>用户名:<input type="text" name="username" placeholder="请输入用户名" required=""></p>
<p>密 码:<input type="password" name="password" placeholder="请输入密码" required=""></p>
<button>登录</button>
</form> {% end %}

在 app.py 的路由配置中添加登录页面的

实现密码加密,

在 utlis 中创建个 auth.py 文件,这个auth 是用来做密码处理的,

import hashlib          # 对密码进行 md5 处理

def hashed(text):
"""哈西处理"""
return hashlib.md5(text.encode('utf8')).hexdigest() USER_DATA = {
'username':'abc',
'password':hashed('123')
} def authenticate(username, password):
"""
校验用户名,密码
:return True or False
"""
if username and password:
is_match = (username==USER_DATA['username'])and (hashed(password)==USER_DATA['password'])
return is_match
else:return False

所有 pip install 需要 workon env 之后执行

pip install pycket

pip install redis

python 与 redis 数据库连接,用 redis 存放相关信息

在 app.py 文件的配置中添加 cookie_secret = 字符串(随便填)

再加入如下字典

            pycket={
'engine': 'redis', # 引擎
'storage': {
'host': 'localhost', # 本地数据库
'port': 6379, # 端口
# 'password': '',
'db_sessions': 5, # redis db index
# 'db_notifications': 11,
'max_connections': 2 ** 30, # 最大连接数
},
'cookies': {
# 'expires': 30, # 过期时间 (秒)
'expires_days': 30, # 过期时间 (天)
},
}
# static_url_prefix = '/pics/',
)

  

  

在 handlers 的 auth.py 中的 导入 pycket

在 handlers 的 auth.py 中的  LoginHandler 改为多个继承

这样就添加了 cookie

拿信息

开始用户认证代码的完善,

在 main.py 中写个 AuthBaseHandler 多个继承的基础类,


这样在下面的  Handler 类中就可以直接继承这个类,实现用户认证

这样也可以对上述 login 代码进行优化,

如果要让一个页面只有在用户登录后才能查看,那就可以在这个方法的上边加个装饰器,

要让这个装饰器功能实现,还要在  app.py 文件的 配置中添加  login_url = '/login',

@tornado.web.authenticated

这时只有在用户登录后才能查看这个页面,

用户登出

在 handlers 的 auth.py 中添加用户退出登录类,

在 appp.py 的路由中添加路由

用户注册:
先要对数据库的连接

  创建个库:create database tor

SQLalchemy 版本迁移工具 alembic 使用

进入虚拟环境,安装用到的包

pip install pymysql

pip install sqlalchemy

pip install alembic

创建个包,名为 models

创建个 py 文件名为 db.py, 写数据库的连接信息

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker HOST = '127.0.0.1'
PORT = '3306'
DATABASE = 'tor'
USERNAME = 'admin'
PASSWORD = 'Root110qwe' # 指定数据库类型,驱动,
DB_URL = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(
USERNAME, PASSWORD, HOST, PORT, DATABASE
)
engine = create_engine(DB_URL)
DBSession = sessionmaker(bind=engine)
Base = declarative_base(engine)

 创建 account.py 文件

from datetime import datetime
from sqlalchemy import (Column,Integer, String, DateTime) from .db import Base class User(Base):
__tablename__ = 'users'
# 主键,自增长,
id = Column(Integer, primary_key=True, autoincrement=True)
# 唯一的,不可以为空
name = Column(String(100), unique=True, nullable=False)
# 密码 不是空的
password = Column(String(100), nullable=False)
# 创建时间
creatd = Column(DateTime, default=datetime.now) def __repr__(self):
return '<User(#{}: {})'.format(self.id, self.name)

  

  

alembic 初始化和配置

用 pychram  把文件下载回电脑,

可以提交下版本,

修改 alembic.ini 配置

连接数据库的 url

修改 env.py

告之 Base 类的位置,

完成 pip 安装之后

  • 在 shell 里面 cd 到项目根目录执行 alembic init alembic

  • 用 pycharm 把生成的文件 download 回来(包括 alembic 目录和 alembic.ini

  • 修改 alembic.ini 设置数据库连接。

    sqlalchemy.url = driver://user:pass@localhost/dbname

  • env.py 中设置,将target_metadata赋值成数据库的元数据(metadata) 如果执行 revision 有 import 报错,注意是否正确将当前项目目录添加到 sys.path 路径

基于数据库 model 定义进行更新

将 model 定义好,并确认在 env.py 里导入的 Base 类是在 model 定义的地方的

  • 配置完成执行( -m "注释信息",根据情况更改,会用到生成的py文件名字里)

    alembic revision --autogenerate -m "create_user_table"

  • 这里可以看到虚拟机目录在 alembic/versions 里生成了 py 文件,检查确认更新的内容,然后执行

    alembic upgrade head

  • 运行成功后,将会在这个表中生成一条记录,
  • 这样就会更新 mysql 数据库了

命令参考

查看记录和历史

alembic history

回退上一个升级的版本

alembic downgrade -1

查看生成的 py 文件

ls -l alembic/versions

其他操作

  • 删除 rm alembic/versions/xxx.py

常见问题

执行 alembic 报错,KeyError:'5b29018b55ba'

原因:该版本曾经upgrade执行过了,但是文件被删除,

解决办法:更新数据库 alembic_version 表记录

ERROR [alembic.util.messaging] Can't locate revision identified by 'a2de455a4f51'  FAILED: Can't locate revision identified by 'a2de455a4f51'

执行 alembic autogenerate 没有看到生成的 py 文件有数据库更新操作的代码

原因:Base import 不正确,或者 model 定义不正确

解决办法:检查 model 代码

数据库还没有执行 upgrade head 更新,不能执行 autogenerate

ERROR [alembic.util.messaging] Target database is not up to date.  FAILED: Target database is not up to date.

删除所有 py 文件之后的重新开始,最好把数据库的表也删除完

这样才能确保生成的py文件反应所有数据库变更

单独更改列名或一些列属性和表名等不能自动识别

需要注意

潭州课堂25班:Ph201805201 tornado 项目 第四课 增加用户注册登录(课堂笔记)的更多相关文章

  1. 潭州课堂25班:Ph201805201 tornado 项目 第八课 增加喜欢功能(课堂笔记)

    tornado 相关说明 新增一个页面,用来做图片收藏, 还要在 account.py 创建一个数据库表,记录用户喜欢的图片,哪些图片用户疯狂传奇 cd 到 项目目录下,执行数据库更新 alembic ...

  2. 潭州课堂25班:Ph201805201 tornado 项目 第五课 增加用户系统-用户中心(课堂笔记)

    tornado 相关说明 在 users 表中创建记录,做测试 在项目根目录下创建 test.py # -*- coding: utf-8 -*- # 斌彬电脑 # @Time : 2019/2/27 ...

  3. 潭州课堂25班:Ph201805201 tornado 项目 第十课 深入应用异步和协程(课堂笔记)

    tornado 相关说明 需求: 增加 /save 的 handler,实现异步保存指定 URL 图片的功能 从网页上得到一张图片地址,由这个地址将图片保存到服务器,并将相关数据保存到数据库 impo ...

  4. 潭州课堂25班:Ph201805201 tornado 项目 第七课 界面美化和静态文件处理(课堂笔记)

    tornado 相关说明 使用  Bootstrap 前端框架 可以在 bootCDN 这里找 jquery ,poppe.js 文件 美化项目 twittel 的开源项目, 在 static 目录下 ...

  5. 潭州课堂25班:Ph201805201 tornado 项目 第十一课 项目改进和优化(课堂笔记)

    使用  Bootstrap 前端框架 可以在 bootCDN 这里找 jquery ,poppe.js 文件 当聊天室发来一第图片链接时,自动保存图片到服务器,并保存相关信息到数据库,系统向该用户发出 ...

  6. 潭州课堂25班:Ph201805201 tornado 项目 第六课 用户和图片分享的集成(课堂笔记)

    tornado 相关说明 改善图片上传功能 ,生成唯一的 ID ,与路径拼接,生成 URL, 这里引用 uuid 的 python 库 在 photo.py 中创建个类,用来  辅助用户上传的图片,生 ...

  7. 潭州课堂25班:Ph201805201 tornado 项目 第三课 项目 图片上传,展示 (课堂笔记)

    tornado 相关说明 f增加图片上传功能, 在 main.py ,文件中创建个  UploadHandler 类,用来处理图片上传 上传图片之前,要先渲染这个页面,所以定个 get 方法,把这个页 ...

  8. 潭州课堂25班:Ph201805201 django 项目 第四课 项目搭建 课堂笔记)

    创建一用户,授予对这个 myblog 库的所有表的权限(.*),在任何 ip 地址中访问(@“%”), 刷新: 退出,用新创建的用户登录,并进入这个库, 在昨天创建的项目中,配置文件中 为了数据库的案 ...

  9. 潭州课堂25班:Ph201805201 django 项目 第二十课 数据库分析设计图 (课堂笔记)

    https://www.dbdesigner.net/

随机推荐

  1. 异常小结:上一张图搞清楚Java的异常机制

    下面是Java异常类的组织结构,红色区域的异常类表示是程序需要显示捕捉或者抛出的. Throwable Throwable是Java异常的顶级类,所有的异常都继承于这个类. Error,Excepti ...

  2. 判断三次URL可用性脚本

    #!/bin/bash check_url() { HTTP_CODE=$(curl -o /dev/ -s -) ];then continue fi } URL_LIST="www.ba ...

  3. Python中对文件和目录的操作

    用到的核心模块有:os   shutil 文件的创建:f = open("文件名", "w")  注:如果涉及到乱码问题需要在后面加上encoding=&quo ...

  4. SQL Server等待

    等待大概分为3类:资源等待.队列等待.外部等待 过滤掉系统相关的等待类型的语句.(查看常用的等待信息) SELECT wait_type , signal_wait_time_ms , wait_ti ...

  5. 腾讯云Ubuntu安装可视化桌面

    1.安装图形界面 sudo apt-get update 更新 1).sudo apt-get install xinit 2).sudo apt-get install gdm  ( 登陆窗口,用于 ...

  6. idea格式化代码无效Ctrl+Alt+L

    1.Idea格式化代码,无效,我的原因是热键冲突,我按Ctrl+Alt+L的时候,竟然弹出了锁QQ,果断关了QQ的热键,百度有的是网易啥的,具体情况具体分析吧.

  7. java抽象类详解

    前言 在没讲抽象类之前  我们先来看看 final关键字 final 修饰符 可以修饰 类.属性.方法 修饰类时  表示该类不能被继承   其他特征 跟普通的类一样 修饰 属性时 表示 改属性不能改变 ...

  8. 一起学Hadoop——使用自定义Partition实现hadoop部分排序

    排序在很多业务场景都要用到,今天本文介绍如何借助于自定义Partition类实现hadoop部分排序.本文还是使用java和python实现排序代码. 1.部分排序. 部分排序就是在每个文件中都是有序 ...

  9. python全栈开发day73-Django认证系统

    一.Form组件 day73 2018-08-10 1. 内容回顾 1. form表单组件 1. 常用字段 1. CharField() 2. ChoiceField() 2. 参数或配置 1. la ...

  10. get、post的区别

    Get.post请求的区别 前言 不论是get还是post方式,都是属于http协议,只是http的两种不同的传输方式,而http协议是基于TCP传输协议的,所以无论是get还是post,在传输层的意 ...