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. 配置文件

flask介绍flask介绍

 

flask介绍flask介绍

 

 

 

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()
自定义正则表达式

相关文章: