内容概要:

  1.flask

    - 蓝图

    - 中间件

    - 闪现

  2.扩展

    - session

    - wtfrom

  3.上下文管理

    - local-threading

  4.websocket

    - 轮训

    - 长轮训

    - websocket

一.谈谈你对面向对象的理解

  1.三大特性,继承,封装,多态(初级水平)

    封装分两种:

        (1).函数的封装

          class db1():

            def func():

              pass

            def func2():

              pass

          (2).数据的封装(一个类的对象)

          

  2.__str__...方法

    __str__,

    __new__,

    __init__,

    __getattr__,

    __setattr__,

    __delattr__,

    __getitem__,

    __setitem__,

    __delitem__,

    __enter__,

    __exit__,

    __del__,

    __call__,

    __dict__,

    这些方法有特有的执行场景,类加()执行__init__方法,对象加(),__call__方法....

  ****一个对象和一个对象能不能相加、减、乘、除

    可以 加用__add__方法 

class Foo(object):
def __add__(self, other):
pass obj1 = Foo()
obj2 = Foo() res = obj1 + obj2  

  3.metaclass

    1.创建类的两种方法   

#创建类的方式一
class Foo(object):
pass #创建类的方式二
#第一个参数是类名,第二个元祖是继承谁,第三个字典是构造字段
Bar = type("MyFoo",(object,),{})
g = Bar()
print(g)

    2.验证类是由type创建

class Mytype(type):
def __init__(self,*args,**kwargs):
print("from my type")
super(Mytype,self).__init__(*args,**kwargs) class Foo(metaclass=Mytype):
pass g = Foo() """result
from my type
"""

二、flask-蓝图

   1.目录结构:

    

  2.__init__.py  

from flask import Flask

app = Flask(__name__)

from .views import account
from .views import user
app.register_blueprint(account.ac) #注册之后可以进行路由分发
app.register_blueprint(user.us) """
这里特殊的装饰器,是全局app,每个function都需要经过
@app.before_request
def check_login():
print('.....')
"""

  3.user.py

from flask import Blueprint

us = Blueprint('us',__name__,url_prefix='/xx') #生成蓝图对象,url_prefix是前缀,加上之后请求index就变为/xx/index

#这里是局部的装饰器,用于特定视图需要权限等
# @us.before_request
# def check_login():
# print('.....') @us.route('/index')
def index():
return 'index'

  4.manage.py

from pro_flask import app

if __name__ == '__main__':
app.run()

三、flask-闪现

   1.用于1次请求之后删除,基于session,取的时候用pop

from flask import Blueprint,redirect,request,flash,get_flashed_messages

ac = Blueprint('ac',__name__)

@ac.route('/login')
def login():
flash("登录成功1",category="x1") #category多了一层分组
flash("登录成功2",category="x2")
return redirect("/logout") @ac.route('/logout')
def logout():
res = get_flashed_messages(category_filter="x1") #默认不加category_filter取所有
print(res)
return 'logout'

  2.get_flask_message源码

def get_flashed_messages(with_categories=False, category_filter=[]):

    flashes = _request_ctx_stack.top.flashes
if flashes is None:
#存入local里的stack里对象的flashes
_request_ctx_stack.top.flashes = flashes = session.pop('_flashes') \
if '_flashes' in session else []
if category_filter:
flashes = list(filter(lambda f: f[0] in category_filter, flashes))
if not with_categories:
return [x[1] for x in flashes]
return flashes

三、flask-middleware

from flask import Flask
app = Flask(__name__) @app.route('/user',methods=['GET','POST'],endpoint='xxx')
def user():
return "login" class MiddleWare(object): #主要理解对象加括号执行__call__方法
def __init__(self,old_wsgi_app): self.old_wsgi_app = old_wsgi_app def __call__(self, *args, **kwargs):
#这是个时候还没有request
print("我做一些数据库连接check,或者清理缓存操作")
return self.old_wsgi_app(*args,**kwargs) if __name__ == '__main__':
app.wsgi_app = MiddleWare(app.wsgi_app)
app.run("0.0.0.0",9999)

四、flask-session

from flask import Flask,session
app = Flask(__name__) #如下几行操作就成功将session写入redis中了
from flask.ext.session import Session
from redis import Redis
app.config["SESSION_TYPE"] = 'redis'
app.config["SESSION_REDIS"] = Redis(host='192.16.1.1',port="6379",)
Session(app) @app.route('/user',methods=['GET','POST'],endpoint='xxx')
def user():
return "login" if __name__ == '__main__':
app.run("0.0.0.0",9999)

  源码剖析:

#session_interface = RedisSessionInterface() #程序刚开始加载时候执行
def _get_interface(self, app):
config = app.config.copy()
config.setdefault('SESSION_TYPE', 'null')
config.setdefault('SESSION_PERMANENT', True)
config.setdefault('SESSION_USE_SIGNER', False)
config.setdefault('SESSION_KEY_PREFIX', 'session:')
config.setdefault('SESSION_REDIS', None)
config.setdefault('SESSION_MEMCACHED', None)
config.setdefault('SESSION_FILE_DIR',
os.path.join(os.getcwd(), 'flask_session'))
config.setdefault('SESSION_FILE_THRESHOLD', 500)
config.setdefault('SESSION_FILE_MODE', 384)
config.setdefault('SESSION_MONGODB', None)
config.setdefault('SESSION_MONGODB_DB', 'flask_session')
config.setdefault('SESSION_MONGODB_COLLECT', 'sessions')
config.setdefault('SESSION_SQLALCHEMY', None)
config.setdefault('SESSION_SQLALCHEMY_TABLE', 'sessions') if config['SESSION_TYPE'] == 'redis':
session_interface = RedisSessionInterface(
config['SESSION_REDIS'], config['SESSION_KEY_PREFIX'],
config['SESSION_USE_SIGNER'], config['SESSION_PERMANENT'])
elif config['SESSION_TYPE'] == 'memcached':
session_interface = MemcachedSessionInterface(
config['SESSION_MEMCACHED'], config['SESSION_KEY_PREFIX'],
config['SESSION_USE_SIGNER'], config['SESSION_PERMANENT'])
elif config['SESSION_TYPE'] == 'filesystem':
session_interface = FileSystemSessionInterface(
config['SESSION_FILE_DIR'], config['SESSION_FILE_THRESHOLD'],
config['SESSION_FILE_MODE'], config['SESSION_KEY_PREFIX'],
config['SESSION_USE_SIGNER'], config['SESSION_PERMANENT'])
elif config['SESSION_TYPE'] == 'mongodb':
session_interface = MongoDBSessionInterface(
config['SESSION_MONGODB'], config['SESSION_MONGODB_DB'],
config['SESSION_MONGODB_COLLECT'],
config['SESSION_KEY_PREFIX'], config['SESSION_USE_SIGNER'],
config['SESSION_PERMANENT'])
elif config['SESSION_TYPE'] == 'sqlalchemy':
session_interface = SqlAlchemySessionInterface(
app, config['SESSION_SQLALCHEMY'],
config['SESSION_SQLALCHEMY_TABLE'],
config['SESSION_KEY_PREFIX'], config['SESSION_USE_SIGNER'],
config['SESSION_PERMANENT'])
else:
session_interface = NullSessionInterface() return session_interface

   程序执行session["xx"]=123时候先执行session_interface的open_session方法:

    def open_session(self, app, request):
sid = request.cookies.get(app.session_cookie_name)
if not sid:
sid = self._generate_sid() #根据uuid生成一个随机字符串
#第一次登陆进,返回{"sid":"asdasdada","xx":123}
return self.session_class(sid=sid, permanent=self.permanent)
if self.use_signer:
signer = self._get_signer(app)
if signer is None:
return None
try:
sid_as_bytes = signer.unsign(sid)
sid = sid_as_bytes.decode()
except BadSignature:
sid = self._generate_sid()
return self.session_class(sid=sid, permanent=self.permanent) if not PY2 and not isinstance(sid, text_type):
sid = sid.decode('utf-8', 'strict')
val = self.redis.get(self.key_prefix + sid)
if val is not None:
try:
data = self.serializer.loads(val)
return self.session_class(data, sid=sid)
except:
return self.session_class(sid=sid, permanent=self.permanent)
return self.session_class(sid=sid, permanent=self.permanent)

   程序返回之前会执行save_session动作:

    def save_session(self, app, session, response):
domain = self.get_cookie_domain(app)
path = self.get_cookie_path(app)
if not session:
if session.modified:
self.redis.delete(self.key_prefix + session.sid)
response.delete_cookie(app.session_cookie_name,
domain=domain, path=path)
return
httponly = self.get_cookie_httponly(app)
secure = self.get_cookie_secure(app)
expires = self.get_expiration_time(app, session)
val = self.serializer.dumps(dict(session))
self.redis.setex(name=self.key_prefix + session.sid, value=val,
time=total_seconds(app.permanent_session_lifetime)) #往redis里写数据ex为过期时间
if self.use_signer:
session_id = self._get_signer(app).sign(want_bytes(session.sid))
else:
session_id = session.sid
#最后将随机字符串写到cookie里
response.set_cookie(app.session_cookie_name, session_id,
expires=expires, httponly=httponly,
domain=domain, path=path, secure=secure)

五、上下文管理

  1.threading.local

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import threading #本地线程,保证即使是多个线程,自己的值也是互相隔离。
local_values = threading.local() def func(num):
#创建数据库连接
local_values.name = num
import time
time.sleep(1)
print(local_values.name, threading.current_thread().name) for i in range(20):
th = threading.Thread(target=func, args=(i,), name='线程%s' % i)
th.start()

 2.自定义local类实现本地线程,也可以用setitem

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import threading
from threading import get_ident #通过自定义模拟本地线程原理
class Local(object):
def __init__(self):
object.__setattr__(self, 'storage', {})
#self.storage = {} #这样设置就会产生递归,触发settattr def __setattr__(self, key, value):
ident = get_ident()
if ident in self.storage:
self.storage[ident][key] = value
else:
self.storage[ident] = {key: value} def __getattr__(self, item):
ident = get_ident()
return self.storage[ident][item] obj = Local()
def func(num):
#创建数据库连接
obj.value = num
import time
time.sleep(1)
print(obj.value, threading.current_thread().name) for i in range(20):
th = threading.Thread(target=func, args=(i,), name='线程%s' % i)
th.start()

3.带协程判断加入

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import threading
from threading import get_ident try: #协程获取唯一id方法
from greenlet import getcurrent as get_ident
except ImportError:
try:
from thread import get_ident
except ImportError:
from _thread import get_ident #通过自定义模拟本地线程原理
class Local(object):
def __init__(self):
object.__setattr__(self, 'storage', {})
#self.storage = {} #这样设置就会产生递归,触发settattr def __setattr__(self, key, value):
ident = get_ident()
if ident in self.storage:
self.storage[ident][key] = value
else:
self.storage[ident] = {key: value} def __getattr__(self, item):
ident = get_ident()
return self.storage[ident][item] obj = Local()
def func(num):
#创建数据库连接
obj.value = num
import time
time.sleep(1)
print(obj.value, threading.current_thread().name) for i in range(20):
th = threading.Thread(target=func, args=(i,), name='线程%s' % i)
th.start()

  

M1-Flask-Day2的更多相关文章

  1. python3 Flask -day2

    flask 实战第二天,url传参 当我们访问网站/的时候,会执行hell_world函数,并把这个函数的返回值返回给浏览器,这样浏览器就显示hello world了 @app.route('/') ...

  2. NOI2013 Day2

    NOI2013 Day2 矩阵游戏 题目描述:设矩阵\(F\) 求\(F[n][m](mod (10^9+7))\) solution: 这题可以求通项解决. 设\(X_i=F[i][m]\), \( ...

  3. 【NOIP 2017】Day2 T3 列队

    Problem Description \(Sylvia\) 是一个热爱学习的女孩子. 前段时间,\(Sylvia\) 参加了学校的军训.众所周知,军训的时候需要站方阵. \(Sylvia\) 所在的 ...

  4. 8.5 正睿暑期集训营 Day2

    目录 2018.8.5 正睿暑期集训营 Day2 总结 A.占领地区(前缀和) B.配对(组合) C 导数卷积(NTT) 考试代码 T1 T2 T3 2018.8.5 正睿暑期集训营 Day2 时间: ...

  5. Flask 学习(三)模板

    Flask 学习(三)模板 Flask 为你配置 Jinja2 模板引擎.使用 render_template() 方法可以渲染模板,只需提供模板名称和需要作为参数传递给模板的变量就可简单执行. 至于 ...

  6. Flask & Vue 构建前后端分离的应用

    Flask & Vue 构建前后端分离的应用 最近在使用 Flask 制作基于 HTML5 的桌面应用,前面写过<用 Python 构建 web 应用>,借助于完善的 Flask ...

  7. NOIP2013 DAY2题解

    DAY2 T1积木大赛 传送门 题目大意:每次可以选区间[l,r]加1,最少选几次,让每个位置有 它应有的高度. 题解:O(n)扫一遍就好了.后一个比前一个的高度低,那么前一个已经把它覆盖了, 如果高 ...

  8. WC集训DAY2笔记 组合计数 part.1

    目录 WC集训DAY2笔记 组合计数 part.1 基础知识 组合恒等式 错排数 卡特兰数 斯特林数 伯努利数 贝尔数 调和级数 后记 补完了几天前写的东西 WC集训DAY2笔记 组合计数 part. ...

  9. Flask01 第一个flask项目

    参考地址:https://github.com/miguelgrinberg/microblog/tree/v0.1 flask环境[苹果M1] 添加虚拟环境 python3 -m venv venv ...

  10. 无意苦争春,一任群芳妒!M1 Mac book(Apple Silicon)能否支撑全栈工程师的日常?(Python3/虚拟机/Docker/Redis)

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_187 就像大航海时代里突然诞生的航空母舰一样,苹果把玩着手心里远超时代的M1芯片,微笑着对Intel说:"不好意思,虽然 ...

随机推荐

  1. codeforces703B

    Mishka and trip CodeForces - 703B 小米什卡是一个伟大的旅行者,她访问了许多国家.在这次考虑去哪里旅行之后,她选择了XXX--这个美丽,但鲜为人知的北方国家. 以下是关 ...

  2. Nginx websocket反向代理

    L:106 现在主流的反向代理,通过长链接可以从服务器推送数据到页面 升级成websocket反向代理必须根据上面的配置做配置 缺点无法多路复用,也就是没办法并行 我们测试下Websocket反向代理 ...

  3. 在GitHub上读大学:涵盖清华,北大,浙大等大学课程

    来自多位GitHub网友在GitHub分享的几组学习课程项目, 学习课程包含清华,北大,浙大,中科大,上海交大, 等中国多所名校的英语,AI高数,人工智能等课程以及一些讲义考题. 如果你想了解这些大学 ...

  4. [AHOI2008]紧急集合 / 聚会

    题目描述 欢乐岛上有个非常好玩的游戏,叫做“紧急集合”.在岛上分散有N个等待点,有N-1条道路连接着它们,每一条道路都连接某两个等待点,且通过这些道路可以走遍所有的等待点,通过道路从一个点到另一个点要 ...

  5. 【XSY2680】玩具谜题 NTT 牛顿迭代

    题目描述 小南一共有\(n\)种不同的玩具小人,每种玩具小人的数量都可以被认为是无限大.每种玩具小人都有特定的血量,第\(i\)种玩具小人的血量就是整数\(i\).此外,每种玩具小人还有自己的攻击力, ...

  6. hz2016的noip模拟赛(d1 + d2)

    QAQ怕不是真的凉凉 d1 205 + d2 170 = 375 感觉难度和noip差不多 那么这可是有够凉的 官方题解 D1 D2 D1 T1 某地的ENLIGHTENED总部总部有N个Agent, ...

  7. CRT and exlucas

    CRT 解同余方程,形如\(x \equiv c_i \ mod \ m_i\),我们对每个方程构造一个解满足: 对于第\(i\)个方程:\(x \equiv 1 \ mod \ m_i\),\(x ...

  8. [CF1132E]Knapsack【暴力搜索】

    你有一个容量为\(w\)的背包,和\(8\)件物品,重量分别为\(1~8\)的整数,分别有\(cnt_1 ... cnt_8\),求最大容量. 解法 笨蛋chh一开始打了一个背包模板乱搞压缩容量\(j ...

  9. webpack入门(三)webpack的api

    终于到了webpack api这一篇,我都等不及了0.0; webpack is fed a configuration object. Depending on your usage of webp ...

  10. Educational Codeforces Round 46 C - Covered Points Count

    C - Covered Points Count emmm 好像是先离散化一下 注意 R需要+1 这样可以确定端点 emmm 扫描线?瞎搞一下? #include<bits/stdc++.h&g ...