tornado 08 数据库-ORM-SQLAlchemy-表关系和简单登录注册

tornado 08 数据库-ORM-SQLAlchemy-表关系和简单登录注册

引言

#在数据库,所谓表关系,只是人为认为的添加上去的表与表之间的关系,只是逻辑上认为的关系,实际上数据库里面的表之间并没有所谓的表关系

一、一对一表关系

  Module

#需要先创建对应的Module,这里采用之前建立好的User和UserDetails

relationship
from sqlalchemyorm import relationship #在Userdatails中添加如下代码:
userdetail = relationship('User',backref='details',uselist=False,cascade='all')#使用 
row = session.query(User).get(1)
rows.details

  relationship

    userdetail = relationship('User',backref = 'details',uselist=False,cascade='all') #在使用relationship的时候上面必须要有ForeignKey
#类名 User,表示关联的Module
# 在子类中通过relationship里面的backref向父类User加上details这个属性
#uselist=False 代表relationship不再表示一对多关系了,表示一对一的关系了
#cascade表示自动关系处理,就和mysql中的ON DELETE 类似
#cascade所有的可选字符串项:1、all,所有操作都会自动处理到关联对象上;2、save_update,关联对象自动添加到会话;3、delete,关联对象自动从会话中删除;4、delete-orphan,属性中去掉关联对象,则会话中会自动删除关联对象;5、merge,session.merge()是会处理关联对象;6、refresh-expire,session.expire()时会处理关联对象;7、expunge,session.expunge()时会处理关联对象#自动添加属性
#在刚才这里,User里面本来是没有details这个属性的,但是在UserDetails里面添加relationship之后,User实例会自动添加上details属性#relationship
#表关系是逻辑关系,但是mysql中并没有直接说明表关系的东西,外键约束是一个表现形式,外键是一种表之间的约束,可以用来表示这种关系
#在SQLAlchemy里面,这个relationship代表了一对多的关系,当然我们可以通过参数改变关系,它默认为是一对多的关系,而这个关系是SQLAlchemy里面的,和数据库并没有什么关系,但是relationship是和外键一起使用的

#在relationship.py中输入一下代码from connect import session
from user_modules import User,UserDetailsrows = session.query(User).get(2) #获得id为2的数据信息
print(rows)
print(rows.username)
print(rows.details)rows = session.query(UserDetails).get(1)
print(rows)
print(rows.userdetail) #只要确定好一对一的关系,子类的userdetail和父类的details属性都可以得到对应的数据

二、多对多关系

#用户与服务器之间的关系可以看成是一对多的关系,但是用户转载的关系就可以看成是多对多的关系,如何在SQLAlchemy表示多对多的关系呢
#在user_modules.py里面添加,记得要导入Table模块
from sqlalchemy import Tableuser_article = Table('user_article',Base.metadata,Column('user_id',Integer,ForeignKey('user.id'),primary_key=True),Column('article_id',Integer,ForeignKey('article.id'),primary_key=True)) #中间表写法class Article(Base): #文章Module__tablename__ = 'article'id = Column(Integer,primary_key=True,autoincrement=True)content = Column(String(500),nullable=True)create_time = Column(DateTime,default=datetime.now)article_user = relationship('User',backref='article',secondary=user_article)#跟上面的区别在于没有uselist,secondary参数传入中间表def __repr__(self):return 'Article(id=%s,content=%s,create_time=%s)'%(self.id,self.content,self.create_time)

三、包管理

#把Module写好以后,该如何导入呢
#在模块中直接导入:
from data.user_modules import User #从data包下面的user_modules.py里面导入User
#这就会涉及到包管理#包的概念
#把很多模块放到一个文件夹里面,就可以形成一个包#包管理
#当把很多模块放在文件夹中的时候,为了方便引用包中的模块,引入包管理__init__.py
#在包管理中,加入此模块,则包名可以直接通过属性访问的方式,访问此模块内的对象,此模块不加上可能不会报错,但是规范是要加上,文件内容可以为空#相对路径导入
#在包管理中,可以通过.(一个点)和..(两个点)分别来导入同层和上一层的模块
#相对路径导入#引入作用
#在包中,如果包中模块要导入同一包中的其他模块,就必须使用此方法导入#使用方法
from .module(..module) import obj (as new_name)#引入以后的影响
#当一个模块中出现此导入方式,则该模块不能被直接运行,直接被导入

四、简单的登录

import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
from tornado.options import define,options
import time
import util.ui_methods
import util.ui_modules
from data.user_modules import User #导入module包
define('port',default=8080,help = 'run port',type=int)
def haha():return 'this is hahahaah'class LoginHandler(tornado.web.RequestHandler):def get(self, *args, **kwargs):self.render('lesson2.html')def post(self, *args, **kwargs):user = self.get_arguments('name')password = self.get_argument('password','')username =User.by_name(user)if username and password == username[0].password:self.render('login_07.html',username = username)else:self.write('用户名或密码错误')application = tornado.web.Application(handlers=[(r'/login',LoginHandler),],template_path = 'templates',static_path= 'static',autoescape = None,ui_methods=util.ui_methods,ui_modules=util.ui_modules,debug=True)if __name__ == '__main__':tornado.options.parse_command_line()http_server = tornado.httpserver.HTTPServer(application)http_server.listen(options.port)tornado.ioloop.IOLoop.instance().start()
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><link rel="stylesheet" href="css/bootstrap.css"><style>* {margin: 0;padding: 0;}</style>
</head>
<body>{% if username %}欢迎用户{{ username }}登录<br><img src="{{ static_url('images/1.jpg')}}" width="250" height="250"><br>{% else %}您还没有登录{% end %}
</body>
</html>
#在user_module.py里面导入
from .connect import Base,session#在User类里面写入
    @classmethoddef by_name(cls,name):return  session.query(cls).filter(cls.username==name).all() #通过装饰器来获取类名

 

转载于:https://www.cnblogs.com/xuchengcheng1215/p/9028537.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/278015.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

白白的(baibaide)

白白的&#xff08;baibaide&#xff09; 有一个长度为 $n$ 的序列 $a_1, a_2, \dots, a_n$&#xff0c;一开始每个位置都是白色。如果一个区间中每个位置都是白色&#xff0c;则称这是一个白白的区间。如果一个白白的区间向左或向右延长后都不是白白的区间了&#xff0c;则称这…

使用Adaptive cards来构建Teams app的界面

Teams app的task module十分好用&#xff0c;当用户点击了一个卡片上的按钮是可以在Teams里弹出一个对话框&#xff0c;对话框的内容可以是开发人员自己的一个网页页面&#xff0c;或者是adaptive card。 在我的LuckyDraw bot里&#xff0c;我比较了这两种的优势和劣势&#xf…

Boosting(提升方法)之GBDT

一、GBDT的通俗理解 提升方法采用的是加法模型和前向分步算法来解决分类和回归问题&#xff0c;而以决策树作为基函数的提升方法称为提升树&#xff08;boosting tree&#xff09;。GBDT(Gradient Boosting Decision Tree)就是提升树算法的一种&#xff0c;它使用的基学习器是C…

CC攻击原理及防范方法

一、 CC攻击的原理&#xff1a; CC攻击的原理就是攻击者控制某些主机不停地发大量数据包给对方服务器造成服务器资源耗尽&#xff0c;一直到宕机崩溃。CC主要是用来消耗服务器资源的&#xff0c;每个人都有这样的体验&#xff1a;当一个网页访问的人数特别多的时候&#xff0c…

分享到Teams

在今年三月份末&#xff0c;Teams的官方文档推出了一个新功能&#xff1a;将网页&#xff08;一个URL&#xff09;分享到Teams里。 也就是说开发人员现在可以很方便的开发一个页面&#xff0c;页面里有一个Teams的图标&#xff0c;当访问此页面的最终用户点击这个图标后可以将…

MySQL命令行查询乱码解决方法

转自Agoly的博客&#xff0c;原文链接https://www.cnblogs.com/qmfsun/p/4846467.html 感谢博主Agoly这篇文章说的很详细很透彻。 MySQL会出现中文乱码的原因不外乎下列几点&#xff1a;1.server本身设定问题&#xff0c;例如还停留在latin1 2.table的语系设定问题(包含charact…

『流畅的Python』第1~4章笔记_数据结构、编码

由于1~4章内容零散且基础&#xff0c;所以统计一下涉及到的内容&#xff0c;记录一下&#xff0c;方便查阅&#xff08;第一张图右键新页面打开即可看到清晰大图&#xff09;

docker 安装ELK

参考文档&#xff1a; Docker ELK使用文档&#xff1a;http://elk-docker.readthedocs.io/ 1.拉取镜像 查看 Docker Hub 的镜像 docker search elk 拉取镜像 sudo docker pull sebp/elk 2.启动容器 docker run -p 5601:5601 -p 9200:9200 -p 5044:5044 -p 4560:4560 -it --na…

在Teams Hackathon上介绍LuckyDraw

很荣幸有机会在今天的Teams Hackathon上介绍LuckyDraw这个teams app。 因为到场的都是各路开发高手&#xff0c;所以当时在准备这个ppt的时候特别增加了难度等级&#xff0c;哈哈。 从如何构建云原生的Teams app&#xff0c;到IaC&#xff0c;重点讲了如何开发一个面向全球用户…

Word 2010 制作文档结构之图标自动编号设置

注意&#xff1a; 使用图片自动编号时&#xff0c;如果文档标题使用的样式是通过“将所选内容保存为新快速样式”所生成的样式&#xff0c;则图片自动编号不会生效 因此设置标题样式时&#xff0c;不要 新建样式&#xff0c;直接使用word预设的“标题 1”样式和“标题 2”样式即…

在Teams中对网站的URL特殊解析

Teams中有一个不太被大家注意的扩展点&#xff0c;名字叫Link unfurling&#xff0c;就是对于一些特殊域名的URL进行特别的解释。 可能这么说&#xff0c;大家还是无法理解&#xff0c;我们看一下下面这个图&#xff0c;当用户在message输入框中输入了一窜url后&#xff0c;Te…

Wireshark 在Windows下的安装

1、wireshark官网地址&#xff1a;https&#xff1a;//www.wireshark.ort/ 下载抓包驱动&#xff1a;windows使用winpcap&#xff0c;Linux使用libcap2、安装下载好的wireshark程序包&#xff1a;3、安装winpcap插件&#xff1a;4、安装USBPcap插件&#xff1a;5、安装完成&…

OSChina 周三乱弹 —— 爸爸说,这个是从他硬盘里掉出来的

2019独角兽企业重金招聘Python工程师标准>>> Osc乱弹歌单&#xff08;2018&#xff09;请戳&#xff08;这里&#xff09; 【今日歌曲】 焕焕 &#xff1a;分享郑秀文的单曲《唉声叹气》 《唉声叹气》 手机党少年们想听歌&#xff0c;请使劲儿戳&#xff08;这里&am…

LuckyDraw app被评为Microsoft365 App Award

今天查了一下LuckyDraw app&#xff0c;突然发现我上半年开发的Teams app: LuckyDraw&#xff0c;竟然多了一个勋章图标&#xff0c;点进去一看是微软给我的app评了一个”Microsoft 365 App Award”。Super surprise!!&#x1f60d;&#x1f60d;&#x1f60d; 看来我必须要抓…

Teams架构剖析(2019年版本)

在上个月刚刚结束的Ignite大会上&#xff0c;Teams产品的架构师Bill Bliss给大家奉上了最新的Teams的架构设计&#xff0c;之前2017年和2018年微软的技术大会上都Teams架构的分享&#xff0c;但是今年大神把Teams架构讲得很深入&#xff0c;覆盖面很广。我这里就挑一些&#xf…

pycharm工具下代码下面显示波浪线的去处方法

近期安装了python后&#xff0c;发现使用pycharm工具打开代码后发现代码下边会有波浪线的显示&#xff1b;但是该代码语句确实没有错误&#xff0c;通过查询发现了两种方法去掉该波纹的显示&#xff0c;下面就具体说明一下&#xff1a; 方法一&#xff1a; 打开pycharm在右下方…

js面向对象与PHP面向对象总结

js面向对象&#xff1a; 1.什么是对象&#xff1f; 对象&#xff1a;任何实体都是对象&#xff0c;拥有属性和方法两大特征 属性&#xff1a;描述事物的特点&#xff1b; 方法&#xff1a;实物拥有的行为&#xff1b; 2.在JS里 Person.name"zhang" Person.fnfunction…

Dubbo原理与框架设计

Dubbo是常用的开源服务治理型RPC框架&#xff0c;在之前osgi框架下不同bundle之间的方法调用时用到过。其工作原理和框架设计值得开源技术爱好者学习和研究。 一、Dubbo的工作原理 调用关系说明 服务容器负责启动&#xff0c;加载&#xff0c;运行服务提供者。服务提供者在启动…

面向全球用户的Teams app之Culture计量单位和禁忌篇

我在前一篇文章里分享了Global Ready的app时会遇到的不同文化对于数字方面的挑战。这篇我继续分享不同文化对于计量单位和禁忌方面的挑战。 我们先来看一个例子&#xff0c;假如有一个teams bot&#xff0c;它告诉你一些动物的速度&#xff0c;比如它告诉你&#xff1a; 猎豹能…

【我的Android进阶之旅】Android自定义Lint实践

背景 2017年8月份的时候&#xff0c;我在公司开始推广Lint、FindBugs等静态代码检测工具。然后发现系统自带的Lint检测的Issue不满足我们团队内部的特定需求&#xff0c;因此去自定义了部分Lint规则。这个检测运行了大半年&#xff0c;运行良好&#xff0c;团队的代码规范也有了…