最新要闻
- 女主不够性感吗?《生化危机4重制版》发售两周狂卖超400万份:Steam好评如潮
- Intel中国特供i5-13490F/i7-13790F闪电降价:性价比更神了!
- 天天看热讯:男人多次失恋后和娃娃订婚 还“生”了三个孩子
- 当年找抖音赔30亿的腾讯视频 这会儿怎么来世纪大和解了?
- 电视接口盘点 HDMI 2.1真的是刚需吗?
- 天天观点:罪恶都市任务攻略_侠盗飞车罪恶都市任务做完了怎么办
- 环球短讯!HRB500钢筋符号_HRB500的钢筋符号是什么 属于几级钢筋
- 比亚迪海豹、长安深蓝SL03获央视第三届《中国汽车风云盛典》评委会大奖
- 诈骗网红梅尼耶的MCN被申请破产引热议 多位女网红等都受害:网友吐槽行业乱
- 世界即时看!女子开宝马占用商场特斯拉专用车位 被特斯拉怒堵2天
- 热文:构造柱的作用是什么_构造柱的作用
- 焦点热讯:网友称余额宝页面显示乱码 支付宝回应:正在修复 不影响资金安全
- 《龙马精神》电影中真打实摔 成龙:我69岁动作比你还快
- 热点!说十个需要送老婆礼物的节日
- 大阳睿能全新动力首款车型H12下线:电机1700W 续航150公里
- 249元 小米米家自动真空封口机发布:-70KPa大吸力
广告
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
回顾、信号、flask-script、sqlalchemy介绍和快速使用、创建操作数据表
(资料图片仅供参考)
回顾
# 3 local对象-并发编程中的一个对象,它可以保证多线程并发访问数据安全 -本质原理是:不同的线程,操作的是自己的数据 -不支持协程 # 4 自己定义local,支持线程和协程# 注意点一: try: # 只要解释器没有装greenlet,这句话就会报错 # 一旦装了,有两种情况,使用了协程和没用协程,无论使用不使用,用getcurrent都能拿到协程id号 from greenlet import getcurrent as get_ident except Exception as e: from threading import get_ident# 注意点二:重写类的 __setattr__和__getattr__ 对象.属性 取值 不存在会触发 __getattr__ 对象.属性 设置值 不存在时会触发 __setattr__ # 注意点三:由于重写了__setattr__和__getattr__类内部使用 self.storage 会递归 使用类调用对象的方法,它就是普通函数,有几个值传几个值 object.__setattr__(self, "storage", {}) 等同于:self.storage={} 等价于:setattr(self,"storage", {}) 会递归 # 5 flask是如何实现这个local类的 def __setattr__(self, name, value): ident = self.__ident_func__() storage = self.__storage__ try: storage[ident][name] = value except KeyError: storage[ident] = {name: value} def __getattr__(self, name): try: return self.__storage__[self.__ident_func__()][name] except KeyError: raise AttributeError(name) def __getattr__(self, k): ident = get_ident() return self.storage[ident][k] def __setattr__(self, k, v): ident = get_ident() #如果用协程,这就是协程号,如果是线程,这就是线程号 if ident in self.storage: #{"协程id号":{arg:1},"协程id号":{arg:2},"协程id号":{arg:3}} self.storage[ident][k] = v else: self.storage[ident] = {k: v} # 6 偏函数 :提前传值,返回一个对象,后期可以调用这个对象,传入后续的值# 7 请求上下文源码分析(ctx 对象),整个flask的执行流程-一旦请求来了----》会执行 Flask类的对象app()---》触发Flask __call__--->self.wsgi_app(environ, start_response) -Flask类wsgi_app 方法 大约 2417行 def wsgi_app(self, environ, start_response): #1 返回了一个ctx,请求上下文对象,RequestContext 的对象,里面有session,request ctx = self.request_context(environ) try: try: # 2 ctx.push---->RequestContext的push---》382行 # _request_ctx_stack.push(self)--self是ctx---》是全局变量 # 是LocalStack()的对象 ctx.push() # 匹配路由执行视图函数,请求扩展 response = self.full_dispatch_request() except Exception as e: error = e response = self.handle_exception(e) except: # noqa: B001 error = sys.exc_info()[1] raise # 把结果返回给wsgi服务器 return response(environ, start_response) finally: if self.should_ignore_error(error): error = None # 把当前放进去的ctx剔除,当次请求结束了 ctx.auto_pop(error)-是LocalStack()的对象 的push ,传入了ctx def push(self, obj): # self._local是 Flask自己定义的兼容线程和协程的Local #self._local中反射 stack,会根据不同线程或协程,返回不同线程的stack #rv是None的 rv = getattr(self._local, "stack", None) if rv is None: # rv=[] # self._local.stack=rv #self._local={"协程id号1":{stack:[]},"协程id号2":{stack:[]}} self._local.stack = rv = [] rv.append(obj) #self._local={"协程id号1":{stack:[ctx,]},"协程id号2":{stack:[]}} return rv 在视图函数中:request = LocalProxy(partial(_lookup_req_object, "request")) print(request.method) # 执行requets对象的 __getattr__ LocalProxy的__getattr__-->核心: return getattr(self._get_current_object(), name) self._get_current_object() 是 ctx中的真正request对象,那method,自如就拿到当次请求的method def _get_current_object(self): if not hasattr(self.__local, "__release_local__"): #object.__setattr__(self, "_LocalProxy__local", local),初始化传入的 # local 是 partial(_lookup_req_object, "request") # # getattr(_lookup_req_object("request"), "method") # getattr(当次请求的reuqest, "method") return self.__local() # self中的 __local,隐藏属性 try: return getattr(self.__local, self.__name__) except AttributeError: raise RuntimeError("no object bound to %s" % self.__name__) def _lookup_req_object(name): # 这里把当前线程下 的ctx取出来了 top = _request_ctx_stack.top if top is None: raise RuntimeError(_request_ctx_err_msg) return getattr(top, name) # 去ctx中反射request,返回的就是当次请求的requets # django flask 同步框架,部署的时候,使用uwsgi部署,uwsgi是进程线程架构,并发量不高# 可以通过uwsgi+gevent,部署成异步程序
信号
# Flask框架中的信号基于blinker(安装这个模块),其主要就是让开发者可是在flask请求过程中定制一些用户行为 flask 和django都有#观察者模式,又叫发布-订阅(Publish/Subscribe) 23 种设计模式之一pip3.8 install blinker# 信号:signial 翻译过来的,并发编程中学过 信号量Semaphore# 比如:用户表新增一条记录,就记录一下日志 方案一:在每个增加后,都写一行代码 ---》后期要删除,比较麻烦 方案二:使用信号,写一个函数,绑定内置信号,只要程序执行到这,就会执行这个函数# 内置信号:flask少一些,django多一些request_started = _signals.signal("request-started") # 请求到来前执行request_finished = _signals.signal("request-finished") # 请求结束后执行 before_render_template = _signals.signal("before-render-template") # 模板渲染前执行template_rendered = _signals.signal("template-rendered") # 模板渲染后执行 got_request_exception = _signals.signal("got-request-exception") # 请求执行出现异常时执行 request_tearing_down = _signals.signal("request-tearing-down") # 请求执行完毕后自动执行(无论成功与否)appcontext_tearing_down = _signals.signal("appcontext-tearing-down")# 应用上下文执行完毕后自动执行(无论成功与否) appcontext_pushed = _signals.signal("appcontext-pushed") # 应用上下文push时执行appcontext_popped = _signals.signal("appcontext-popped") # 应用上下文pop时执行message_flashed = _signals.signal("message-flashed") # 调用flask在其中添加数据时,自动触发# 使用内置信号的步骤 1 写一个函数 2 绑定内置信号 3 等待被触发from flask import Flask, render_template,signals,sessionfrom flask.signals import _signalsapp = Flask(__name__)app.debug = Trueapp.secret_key = "SSSSSSSSSSSSS"# 定义信号session_set = _signals.signal("session_set")# 写一个函数def test1(*args,**kwargs): print(args) print(kwargs) print("session设置了")# 绑定自定义的信号session_set.connect(test1)@app.route("/")def hhhh(): session["lqz"] = "lqz" session_set.send("lqz") # 触发信号执行 return "hello world"@app.route("/index")def index(): return render_template("index.html", name="lqz")if __name__ == "__main__": app.run()# django中使用信号https://www.cnblogs.com/liuqingzheng/articles/9803403.html
django中信号
Model signals pre_init # django的modal执行其构造方法前,自动触发 post_init # django的modal执行其构造方法后,自动触发 pre_save # django的modal对象保存前,自动触发 post_save # django的modal对象保存后,自动触发 pre_delete # django的modal对象删除前,自动触发 post_delete # django的modal对象删除后,自动触发 m2m_changed # django的modal中使用m2m字段操作第三张表(add,remove,clear)前后,自动触发 class_prepared # 程序启动时,检测已注册的app中modal类,对于每一个类,自动触发Management signals pre_migrate # 执行migrate命令前,自动触发 post_migrate # 执行migrate命令后,自动触发Request/response signals request_started # 请求到来前,自动触发 request_finished # 请求结束后,自动触发 got_request_exception # 请求异常后,自动触发Database Wrappers connection_created # 创建数据库连接时,自动触发# django中使用内置信号1 写一个函数 def callBack(*args, **kwargs): print(args) print(kwargs) 2 绑定信号 #方式一 post_save.connect(callBack) # 方式二 from django.db.models.signals import pre_save from django.dispatch import receiver @receiver(pre_save) def my_callback(sender, **kwargs): print("对象创建成功") print(sender) print(kwargs) 3 等待触发
flask-script
# django中,有命令 python manage.py runserver#flask启动项目,像djagno一样,通过命令启动(版本必须匹配)Flask==2.2.2Flask_Script==2.0.3#借助于:flask-script 实现 安装:pip3.8 install flask-script 修改代码: from flask_script import Manager manager=Manager(app) manager.run() 用命令启动 python manage.py runserverfrom flask import Flaskfrom flask_script import Managerapp = Flask(__name__)app.debug =Truemanager = Manager(app)@app.route("/")def index(): return "index"if __name__ == "__main__": # app.run() manager.run()# 自定制命令 #1 简单自定制命令 @manager.command def custom(arg): # 命令的代码,比如:初始化数据库, 有个excel表格,使用命令导入到mysql中 print(arg) #2 复杂一些的自定制命令 @manager.option("-n", "--name", dest="name") @manager.option("-u", "--url", dest="url") def cmd(name, url): # python run.py cmd -n lqz -u xxx # python run.py cmd --name lqz --url uuu print(name, url)# django 中如何自定制命令
sqlalchemy快速使用
# flask 中没有orm框架,对象关系映射,方便我们快速操作数据库# flask,fastapi中用sqlalchemy居多# SQLAlchemy是一个基于Python实现的ORM框架。该框架建立在 DB API之上,使用关系对象映射进行数据库操作,简言之便是:将类和对象转换成SQL,然后使用数据API执行SQL并获取执行结果# 安装pip3.8 install sqlalchemy#了解SQLAlchemy本身无法操作数据库,其必须以来pymsql等第三方插件 pymysql mysql+pymysql://:@/[?] cx_Oracle oracle+cx_oracle://user:pass@host:port/dbname[?key=value&key=value...] 更多:http://docs.sqlalchemy.org/en/latest/dialects/index.html
原生操作的快速使用
先不是orm 而是原生sql第一步:导入from sqlalchemy import create_engine# 第二步:生成引擎对象engine = create_engine( "mysql+pymysql://root@127.0.0.1:3306/cnblogs", max_overflow=0, # 超过连接池大小外最多创建的连接 pool_size=5, # 连接池大小 pool_timeout=30, # 池中没有线程最多等待的时间,否则报错 pool_recycle=-1 # 多久之后对线程池中的线程进行一次连接的回收(重置))# 第三步:使用引擎获取连接,操作数据库conn = engine.raw_connection()cursor=conn.cursor()cursor.execute("select * from aritcle")print(cursor.fetchall())
创建操作数据表
# 第一步:导入from sqlalchemy import create_engineimport datetimefrom sqlalchemy.ext.declarative import declarative_basefrom sqlalchemy import Column, Integer, String, Text, ForeignKey, DateTime, UniqueConstraint, Index# 第二步:执行declarative_base,得到一个类Base = declarative_base()# 第三步:继承生成的Base类class User(Base): # 第四步:写字段 id = Column(Integer, primary_key=True) # 生成一列,类型是Integer,主键 name = Column(String(32), index=True, nullable=False) # name列varchar32,索引,不可为空 email = Column(String(32), unique=True) # datetime.datetime.now不能加括号,加了括号,以后永远是当前时间 ctime = Column(DateTime, default=datetime.datetime.now) # extra = Column(Text, nullable=True) # 第五步:写表名 如果不写以类名为表名 __tablename__ = "users" # 数据库表名称 # 第六步:建立联合索引,联合唯一 __table_args__ = ( UniqueConstraint("id", "name", name="uix_id_name"), # 联合唯一 Index("ix_id_name", "name", "email"), # 索引 )class Book(Base): __tablename__ = "books" id = Column(Integer, primary_key=True) name = Column(String(32))# 第七步:把表同步到数据库中# 不会创建库,只会创建表engine = create_engine( "mysql+pymysql://root@127.0.0.1:3306/aaa", max_overflow=0, # 超过连接池大小外最多创建的连接 pool_size=5, # 连接池大小 pool_timeout=30, # 池中没有线程最多等待的时间,否则报错 pool_recycle=-1 # 多久之后对线程池中的线程进行一次连接的回收(重置))# 把表同步到数据库 (把被Base管理的所有表,都创建到数据库)Base.metadata.create_all(engine)# 把所有表删除# Base.metadata.drop_all(engine)
关键词:
-
【天天报资讯】K8S圣经12:SpringCloud+Jenkins+ K8s Ingress 自动化灰度发布
文章很长,持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠...
来源: -
回顾、信号、flask-script、sqlalchemy介绍和快速使用、创建操作数据表
==回顾== 3local对象-并发编程中的一个对象,它可以保证多线程并发访问数据安全-本质原理是:不...
来源: 【天天报资讯】K8S圣经12:SpringCloud+Jenkins+ K8s Ingress 自动化灰度发布
回顾、信号、flask-script、sqlalchemy介绍和快速使用、创建操作数据表
今日快看!ASP.NET Core MVC 从入门到精通之初窥门径
女主不够性感吗?《生化危机4重制版》发售两周狂卖超400万份:Steam好评如潮
Intel中国特供i5-13490F/i7-13790F闪电降价:性价比更神了!
天天看热讯:男人多次失恋后和娃娃订婚 还“生”了三个孩子
当年找抖音赔30亿的腾讯视频 这会儿怎么来世纪大和解了?
电视接口盘点 HDMI 2.1真的是刚需吗?
天天观点:罪恶都市任务攻略_侠盗飞车罪恶都市任务做完了怎么办
环球短讯!HRB500钢筋符号_HRB500的钢筋符号是什么 属于几级钢筋
热头条丨【调试】ftrace(三)trace-cmd和kernelshark
全球观天下!集成Unity3D到iOS应用程序中
环球视点!OpenCV获取相机旋转矩阵和平移矩阵
海信电视精简系统
【全球聚看点】试验设计课程作业
比亚迪海豹、长安深蓝SL03获央视第三届《中国汽车风云盛典》评委会大奖
诈骗网红梅尼耶的MCN被申请破产引热议 多位女网红等都受害:网友吐槽行业乱
世界即时看!女子开宝马占用商场特斯拉专用车位 被特斯拉怒堵2天
世界速递!2023.4.7【模板】快速沃尔什变换FWT
今日报丨面试题百日百刷-HBase HRegionServer宕机如何处理
第135篇:Three.js基础入门
每日消息!交易商协会评估更新定向债务融资工具专项机构投资人名单
美国3月非农就业人口增幅降至23.6万 失业率为3.5%
热文:构造柱的作用是什么_构造柱的作用
焦点热讯:网友称余额宝页面显示乱码 支付宝回应:正在修复 不影响资金安全
《龙马精神》电影中真打实摔 成龙:我69岁动作比你还快
热点!说十个需要送老婆礼物的节日
焦点观察:火热出炉 秘汁全鸡的数字新“味”
大阳睿能全新动力首款车型H12下线:电机1700W 续航150公里
249元 小米米家自动真空封口机发布:-70KPa大吸力
全球快资讯丨世界各地小孩的玩具对比:不止文化与财富的差距
当前动态:马斯克开源推特算法反被指责:隐藏重要细节、与承诺不符
【当前独家】《王者荣耀》S31赛季4月13日上线 新英雄姬小满来了
深圳开放大学优秀学生李德炎:保持学习状态,争做行业模范
天天快看点丨自动旋转ROS小车(rviz+urdf+xacro)(附加python操作键盘控制小车运动)
每日资讯:java -- Math、BigInteger、BigDecimal类和基本类型的包装类、正则表达式
【快播报】黑田东彦“卸任”言论释放宽松信号 日债收益率曲线平坦化下移
速递!定价全球最低!国产科幻FPS《边境》国区售价68元起
天天观热点:孟羽童已不是董明珠秘书引热议 本人回应:很享受格力市场营销工作
今日看点:米粉换上Redmi Note 12 Turbo:陪伴他5年的小米6正式退役
天天即时看!网友看电影觉得难看成功退一半费用 影城:散场20分钟内可办理
电动自行车调速器网上公开售卖!专家:私改限速或引发燃爆事故
环球资讯:ps 备忘清单_开发速查表分享
天天观天下!王者更新:祈愿夺宝重启,520传说天幕返场,5英雄喜提新衣
焦点速读:离谱!观致汽车要倒台 车主也被拉下水:被厂商告了
全球气象预报大模型风乌发布:有效预报时间首破10天
事关“刹车失灵”争议核心数据 本田中国召回超20万辆雅阁
长城财报漂亮 是因为新能源汽车卖得不漂亮
全球新资讯:仅1999元!铁威马F4-423(4G)四盘位NAS开启预售:双2.5G网口
全球速读:大美游轮2022年亏损2511.24万同比亏损增加 游轮运营业务毛利减少
Privilege Escalation 权限提升
即时焦点: 如何处理Xcode上传IPA文件后无法在后台架构版本中显示的问题?
当前要闻:易基因:群体分析揭示了DNA甲基化在番茄驯化和代谢多样性中的作用|组学研究
记录-VueJs中如何使用Teleport组件
Springfox与SpringDoc——swagger如何选择(SpringDoc入门)
澳大利亚一飞机掉入印度洋:全员坠海 未有伤亡
世界速递!比亚迪大疆达成合作!全新海狮将用上高级辅助驾驶技术:纯视觉走天下
每日消息!希捷推出星球大战版SSD:三款RGB光剑任选
资讯推荐:一图看懂!小米/红米多款热门机型官方降价:小米12S/13全系有活动
环球新动态:用两年就卡?3分钟学会选电视硬件
当前播报:申城交警多措并举加强高速公路和城市快速路事故预防工作
世界头条:用 Go 剑指 Offer 17. 打印从1到最大的n位数
【天天时快讯】获取Python函数信息的方法
世界信息:GPT对SaaS领域有什么影响?
全球新资讯:什么是 Java 字节码?采用字节码的好处是什么?
【天天聚看点】ubuntu离线安装tcpdump
因债券承销尽调不充分等问题 民生证券被上交所出具书面警示
每日视讯:最新确认:小米13 Ultra用上了USB 3.X接口
《流浪地球2》4月14日网络首播!导演郭帆:修改了一百多个视效镜头
差评高达86%!艺画开天官博恢复《三体》动画相关微博
【世界聚看点】等等党狂喜!比亚迪海豹有优惠了:本月订车至享高3.1万元减免
全球热门:荣耀Magic5 Pro“首碎”!SUV压过屏幕依旧完好
每日热闻!微信界面黑色怎么设置成白色_微信变成黑色怎么调过来
【独家】使用Drone+gitea配置自己的CICD流程
全球热消息:收评:两市震荡走强创指涨0.84% 医药、人工智能概念涨幅居前
最资讯丨马来西亚原装进口:猫山王榴莲雪糕4元/支狂促
索尼痛斥英国CMA:偏袒微软过于荒谬
当前头条:合资A级轿车更难了!2023款比亚迪秦PLUS EV冠军版上市:12.98万起
苹果中国杀疯!iPhone14售价跌破5000元 买它还是华为P60?
环球要闻:网红密子君带货无骨鸡爪!粉丝提醒她有蟑螂 本人道歉
保罗:比赛起起伏伏很奇怪 从未跟KD这种能吸引包夹的球员共事过
焦点热门:全文索引:Apache Lucene(一)
天天热讯:Java 自增自减运算符和移位运算符介绍
世界观速讯丨NTP时间同步服务器(频率同步)包含帧同步、载波同步、位同步
sms-activate短信验证码问题
世界新资讯:153. 寻找旋转排序数组中的最小值
【财经分析】新规创新保险服务模式 完善多层次长期护理保障制度
国风开放世界新作:网易新游《暂时叫它:天字七六》公布
世界今热点:全新MacBook要用OLED屏!如果不烧屏还是挺香的
或8万起售 比亚迪海鸥四颜色曝光:绿、黑、白、粉你选谁
这可能是最好看的RX 7900 XTX:华擎发布太极白色版
科大讯飞刘聪:5月6日将发布“1+N认知智能大模型”
泫雅和张贤胜的组合叫什么?泫雅和张贤胜在一起过吗?
蛇沼鬼城后面一部是什么?蛇沼鬼城录像带里的吴邪是谁?
张一山为什么剃光头?张一山出演的电视剧有哪些?
南派三叔为什么要封笔?南派三叔的全部作品顺序
被嫌弃的松子的一生讲了什么? 松子一生坎坷结局是怎么死的?
【新视野】山西省印发钢铁行业转型升级2023年行动计划
全球播报:[Web Server]Tomcat调优之监控连接池/线程池
焦点快播:(笔记)电源缓启动工作原理