pip3 install flask
短小精悍、可扩展强 的一个Web框架。
牛逼点:上下文管理机制
依赖wsgi:
werkzeug(相当于Django的wsgi):只要安装flask,就有werkzeug了。
底层实现一: from werkzeug.wrappers import Request, Response from werkzeug.serving import run_simple 请求进来--------------------- def run(environ,start_response): return [b"asdfasdf"] 返回 if __name__ == '__main__': 监听4000端口 run_simple('localhost', 4000, run) 底层实现二: from werkzeug.wrappers import Request, Response @Request.application def hello(request): response对象也可以 return Response('Hello World!') if __name__ == '__main__': from werkzeug.serving import run_simple run_simple('localhost', 4000, hello)
备注:
flask源码入口
Flask源码入口: from werkzeug.wrappers import Response from werkzeug.serving import run_simple class Flask(object): def __call__(self,environ, start_response): response = Response('hello') return response(environ, start_response) def run(self): run_simple('127.0.0.1', 8000, self) app = Flask() if __name__ == '__main__': app.run()
class Foo(object): def __init__(self): print('sdfsdf') def __call__(self, *args, **kwargs): print('call') 类+()执行__init__方法 obj = Foo() 类+()执行__call__方法 obj()
简单使用:
from flask import Flask 步骤1实例化flask--------------- app = Flask(__name__) 步骤2视图函数------------------ @app.route('/index') def index(): return "Hello World" 步骤3运行--------------------------- if __name__ == '__main__': app.run()
给你一个路径 ,获取类并获取其中的大写的静态字段
给你一个路径 “settings.Foo”,可以找到类并获取去其中的大写的静态字段。
settings.py文件 class Foo: DEBUG = True TEST = True xx.py 文件 import importlib path = "settings.Foo" p,c = path.rsplit('.',maxsplit=1) m = importlib.import_module(p) cls = getattr(m,c) # 如果找到这个类? for key in dir(cls): if key.isupper(): print(key,getattr(cls,key))
flask系统组件:
1. 配置文件
app.py: app.config.from_object("settings.DevelopmentConfig") settings.py: class Config(object): DEBUG = False TESTING = False DATABASE_URI = 'sqlite://:memory:' class ProductionConfig(Config): DATABASE_URI = 'mysql://user@localhost/foo' 开发环境 class DevelopmentConfig(Config): DEBUG = True 测试环境 class TestingConfig(Config): TESTING = True
2. 路由系统
自定义装饰器放下面
- @app.route('/user/<username>'):不加类型是字符串
- @app.route('/post/<int:post_id>')整型
- @app.route('/post/<float:post_id>')小数
- @app.route('/post/<path:path>')路径
- @app.route('/login', methods=['GET', 'POST'])方法
- 自定义正则
1:无参数的反向解析:--------------------------------------------
导入url_for,指定endpoint名字,
不指定:默认是函数名
重名:项目无法启动
from flask import Flask,url_for app=Flask(__name__) @app.route('/indexaaaaa',methods=['GET','POST'],endpoint='n1') def index(): print(url_for('n1')) return 'Index' if __name__ == '__main__': app.run()
2:有参数的反向解析:----------------------------------------------------
from flask import Flask,url_for
app=Flask(__name__)
@app.route('/index/<int:nid>',methods=['GET','POST'],endpoint='n1')
def index(nid):
print(url_for('n1',nid=666))反向解析有参解析
return 'Index'
if __name__ == '__main__':
app.run()
from werkzeug.routing import BaseConverter from flask import Flask,url_for app = Flask(__name__) class RegexConverter(BaseConverter): """ 自定义URL匹配正则表达式 """ def __init__(self, map, regex): super(RegexConverter, self).__init__(map) self.regex = regex def to_python(self, value): """ 路由匹配时,匹配成功后传递给视图函数中参数的值 :param value: :return: """ return int(value) def to_url(self, value): """ 使用url_for反向生成URL时,传递的参数经过该方法处理,返回的值用于生成URL中的参数 :param value: :return: """ val = super(RegexConverter, self).to_url(value) return val # 步骤二:添加到转换器 app.url_map.converters['reg'] = RegexConverter """ 1. 用户发送请求 2. flask内部进行正则匹配 3. 调用to_python(正则匹配的结果)方法 4. to_python方法的返回值会交给视图函数的参数 """ # 步骤三:使用自定义正则 @app.route('/index/<reg("\d+"):nid>') def index(nid): print(nid, type(nid)) print(url_for('index', nid=987)) return "index" if __name__ == '__main__': app.run()