• Flask-----轻量级的框架,快速的搭建程序


     Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后触发Flask框架,开发人员基于Flask框架提供的功能对请求进行相应的处理,并返回给用户,如果要返回给用户复杂的内容时,需要借助jinja2模板来实现对模板的处理,即:将模板和数据进行渲染,将渲染后的字符串返回给用户浏览器。

    “微”(micro) 并不表示你需要把整个 Web 应用塞进单个 Python 文件(虽然确实可以 ),也不意味着 Flask 在功能上有所欠缺。微框架中的“微”意味着 Flask 旨在保持核心简单而易于扩展。Flask 不会替你做出太多决策——比如使用何种数据库。而那些 Flask 所选择的——比如使用何种模板引擎——则很容易替换。

    默认情况下,Flask 不包含数据库抽象层、表单验证,或是其它任何已有多种库可以胜任的功能。然而,Flask 支持用扩展来给应用添加这些功能,如同是 Flask 本身实现的一样。众多的扩展提供了数据库集成、表单验证、上传处理、各种各样的开放认证技术等功能。Flask 也许是“微小”的,但它已准备好在需求繁杂的生产环境中投入使用。

    pip3 install flask
    #Flask依赖一个实现wsgi协议的模块:werkzeug
    from werkzeug.wrappers import Request, Response
    
    @Request.application
    def hello(request):
        return Response('Hello World!')
    
    if __name__ == '__main__':
        from werkzeug.serving import run_simple
        run_simple('localhost', 4000, hello)

    Django:无socket,依赖第三方模块wsgi,中间件,路由系统(CBV,FBV),视图函数,ORM。cookie,session,Admin,Form,缓存,信号,序列化。。
    Flask:无socket,中间件(需要扩展),路由系统,视图(CBV)、第三方模块(依赖jinja2),cookie,session弱爆了

    简单的Flask程序
    示例
    flask项目的基本目录结构:
    flask项目名
    |_____static #静态文件的存放目录
    |_____templates #模板的存放目录
    |_____项目名.py #主项目
    |_____config.py #配置文件

    #例:
    #项目名.py
    from flask import Flask

    app = Flask(__name__) #app是程序实例,一个项目只能有一个程序实例

    @app.route('/') #路由装饰器
    def hello_world(): #视图函数
    return 'Hello World!'

    if __name__ == '__main__':
    app.run() #有个host参数,代表监听范围,默认为127.0.0.1,只监听本机,0.0.0.0表示监听所有公网ip

    ​ @app.route()装饰器,可以将函数变为视图函数,他的参数为路由。

    使用Flask-Script支持命令行选项
    ​ flask的开发web服务器支持很多选项,但只能在脚本中作为参数传给app.run()函数,然而传递设置选项的理想方式是使用命令行参数。Flask-Script是一个Flask的扩展,为Flask程序添加了一个命令行解析器。

    #安装:pip install flask-script
    #hello.py
    from flask import Flask
    from flask_script import Manager

    app = Flask(__name__)
    manager = Manager(app) #实例化拓展

    @app.route('/')
    def hello_world():
    return 'Hello World!'

    if __name__ == '__main__':
    manager.run() 启动实例

    ​ 修改代码后,使用命令行启动程序(python hello.py runserver)时就可以添加参数了: –host/-h 客户端访问web服务的ip

    ​ –port/-p web服务的端口

    ​ -d 开启debug

    ​ -r 自动reload,当代码发生变化时自动重启

    ​ –threaded 开启多线程

    ​ -?/–help 查看帮助信息

    使用配置文件
    ​ 将工程配置下写在配置文件中,利于以后的开发维护管理。

    #config.py
    DEBUG = True #设置工程为开发者
    '''
    其他配置参数,如数据库的配置等等
    '''


    #工程文件
    import config
    app.config.from_objec(config) #将配置文件配置到项目文件中

    路由
    路由传递参数:app.route('/index/<arg1>')

    ​ 参数放在尖括号里,可以设置参数的类型,int, float,path(/将不再是路径分隔符),如:<int:arg1>,

    url重定向:redirect('<跳转的路由>')

    解析路由:url_for(视图函数名),在模板中页面跳转也可以使用url_for()解析得到路由,放在{{ }}中

    @app.route('/index/') #普通路由
    def index():
    return 'hello world'

    @app.route('/add/<int:arg1>/<int:arg2>') #带参数的路由
    def add(ag1, arg2):
    return 'arg1 +arg2 = {}'.format(arg1+arg2)

    @app.route('/hello')
    def hello():
    return rendirect(url_for('index')) #路由重定向和重定向一起使用

    2. 请求与响应
    Flask上下文全局变量
    变量名 上下文 说明
    current_app 程序上下文 当前激活程序的程序实例
    g 程序上下文 处理请求时用作临时存储的对象,每次请求都会重设这个变量。
    request 请求上下文 请求对象,封装了客户端发送的HTTP请求中的内容
    session 请求上下文 用户会话,用于存储请求之间需要记住的值的词典
    ​ Flask在分发请求之前激活(或推送)程序和请求上下文,请求处理完成后再将其删除。程序上下文被推送后,就可以在线程中使用current_app和g变量。类似地,请求上下文被推送后,就可以使用request和session变量。如果使用这些变量时我们没有激活程序上下文或请求上下文,就会导致报错。

    request:请求对象
    ​ 封装了客户端发送的HTTP请求中的内容。

    ​ request.headers 请求头信息,数据类型为类字典结构,可以使用.get(”)获取数据。

    #例:
    @app.route('/request/')
    def req():
    # 完整的请求URL
    #return request.url
    # 基本路由信息,不包含get参数
    #return request.base_url
    # 只包含主机和端口
    #return request.host_url
    # 只包含装饰器中的路由地址
    #return request.path
    # 请求方法类型
    #return request.method
    # 客户端IP地址
    #return request.remote_addr
    # 所有的请求参数(GET)
    #return request.args['page']
    # 请求头信息
    return request.headers['User-Agent']

    response:响应对象
    ​ 响应的两种方法:

    视图函数直接返回一个元组:(response, status, headers)

    视图函数返回一个make_response(键,值)函数产生的响应对象。

    Cookies:
    访问:通过请求对象的cookies属性访问(请求对象的cookies属性是一个内容为客户端提提交的所有cookies的字典)

    设置cookies:通过响应对象的set_cookies方法来设置Cookies。

    from flask import Flask, request, make_response

    @app.route('/cookies/')
    def cookies():
    cook = request.cookies #获得cookies
    resp = make_response('set cookies') #实例一个响应对象
    resp.set_cookies('name','Tom') #设置cookies
    return resp

    session:
    设置session
    #设置秘钥:使用session就必须设置密码,以便用来对数据加密
    app.config['SECRET_KEY'] = '随便什么字符串'


    @app.route('/set_sesion/')
    def set_session():
    session['user-name'] = 'hello'
    return '设置成功'

    获取session
    @app.route('/get_session/')
    def get_session():
    return session.get('username', 'who?')

    请求钩子
    ​ 4种钩子装饰器:

    before_first_request:在处理第一个请求之前执行
    before_request:在每次请求之前运行。
    after_request:如果没有未处理的异常抛出在,在每次请求之后执行
    teardown_request:即使有未处理的异常抛出,也在每次请求之后运行。
    ---------------------


    参考: https://www.cnblogs.com/huchong/p/8227606.html



  • 相关阅读:
    docker 报错 Error response from daemon: error while validating Root CA Certificate: x509: certificate has expired or is not yet valid
    Python list 与 str 互转
    小程序 url传参 参数值过长 接收时候 内容不全的问题
    es6新增对象字面量语法
    Squid Proxy
    常见开发工具安装方法
    批判世界之前先清理你的房间
    windows的双网卡问题
    SSH
    【逆向】Yara规则编写安装与使用教程
  • 原文地址:https://www.cnblogs.com/klb561/p/10492759.html
Copyright © 2020-2023  润新知