回顾
-并发编程中的一个对象,它可以保证多线程并发访问数据安全
-本质原理是:不同的线程,操作的是自己的数据
-不支持协程
try:
from greenlet import getcurrent as get_ident
except Exception as e:
from threading import get_ident
对象.属性 取值 不存在会触发 __getattr__
对象.属性 设置值 不存在时会触发 __setattr__
类内部使用 self.storage 会递归
使用类调用对象的方法,它就是普通函数,有几个值传几个值
object.__setattr__(self, 'storage', {})
等同于:self.storage={}
等价于:setattr(self,'storage', {}) 会递归
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:
self.storage[ident][k] = v
else:
self.storage[ident] = {k: v}
-一旦请求来了----》会执行 Flask类的对象app()---》触发Flask __call__--->self.wsgi_app(environ, start_response)
-Flask类wsgi_app 方法 大约 2417行
def wsgi_app(self, environ, start_response):
ctx = self.request_context(environ)
try:
try:
ctx.push()
response = self.full_dispatch_request()
except Exception as e:
error = e
response = self.handle_exception(e)
except:
error = sys.exc_info()[1]
raise
return response(environ, start_response)
finally:
if self.should_ignore_error(error):
error = None
ctx.auto_pop(error)
-是LocalStack()的对象 的push ,传入了ctx
def push(self, obj):
rv = getattr(self._local, "stack", None)
if rv is None:
self._local.stack = rv = []
rv.append(obj)
return rv
在视图函数中:request = LocalProxy(partial(_lookup_req_object, "request"))
print(request.method)
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__"):
return 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):
top = _request_ctx_stack.top
if top is None:
raise RuntimeError(_request_ctx_err_msg)
return getattr(top, name)
信号
pip3.8 install blinker
方案一:在每个增加后,都写一行代码 ---》后期要删除,比较麻烦
方案二:使用信号,写一个函数,绑定内置信号,只要程序执行到这,就会执行这个函数
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')
appcontext_popped = _signals.signal('appcontext-popped')
message_flashed = _signals.signal('message-flashed')
1 写一个函数
2 绑定内置信号
3 等待被触发
from flask import Flask, render_template,signals,session
from flask.signals import _signals
app = Flask(__name__)
app.debug = True
app.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()
https://www.cnblogs.com/liuqingzheng/articles/9803403.html
django中信号
Model signals
pre_init
post_init
pre_save
post_save
pre_delete
post_delete
m2m_changed
class_prepared
Management signals
pre_migrate
post_migrate
Request/response signals
request_started
request_finished
got_request_exception
Database Wrappers
connection_created
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
python manage.py runserver
Flask==2.2.2
Flask_Script==2.0.3
安装:pip3.8 install flask-script
修改代码:
from flask_script import Manager
manager=Manager(app)
manager.run()
用命令启动
python manage.py runserver
from flask import Flask
from flask_script import Manager
app = Flask(__name__)
app.debug =True
manager = Manager(app)
@app.route('/')
def index():
return 'index'
if __name__ == '__main__':
manager.run()
@manager.command
def custom(arg):
print(arg)
@manager.option('-n', '--name', dest='name')
@manager.option('-u', '--url', dest='url')
def cmd(name, url):
print(name, url)
sqlalchemy快速使用
pip3.8 install sqlalchemy
SQLAlchemy本身无法操作数据库,其必须以来pymsql等第三方插件
pymysql
mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]
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_engine
import datetime
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, Text, ForeignKey, DateTime, UniqueConstraint, Index
Base = declarative_base()
class User(Base):
id = Column(Integer, primary_key=True)
name = Column(String(32), index=True, nullable=False)
email = Column(String(32), unique=True)
ctime = Column(DateTime, default=datetime.datetime.now)
__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.metadata.create_all(engine)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!