• 【Flask介绍】


    介绍

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

    下载安装

    pip install flask
    
    • 1

    python使用flask

    在这里插入图片描述
    在这里插入图片描述

    app.py

    from flask import Flask
    
    app = Flask(__name__)
    
    
    @app.route('/')
    def hello_world():
        return 'Hello World!'
    
    
    if __name__ == '__main__':
        app.run()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    flask的配置

    flask配置文件写法很多种

        # 第一种写法
        app.secret_key='asfasdf'
        app.debug=True
    
        # 第二种:app所有的配置项都在app.config这个字典中
        app.config['DEBUG']=True
        print(app.config)
    
        # 第三种:仿django的settings.py 写法
        app.config.from_pyfile('settings.py')
        print(app.config['NAME'])
    
        # 第四种:通过类的方式
        app.config.from_object('settings.DevelopmentConfig')
        print(app.config)
    
        # 其他:
        app.config.from_envvar("环境变量名称")
        app.config.from_json("json文件名称")
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    flask的路由

    flask 路由写法:基于装饰器,跟djagno有区别,本质其实是一样的,sanic,fastapi就是这种路由方式

    flask路由和djagno路由的区别?

    1. 在django中,路由是浏览器访问服务器时,先访问的项目中的url,再由项目中的url找到应用中url, 这些url是放在一个列表里,遵从从前往后匹配的规则。

    2. 在flask中,路由是通过装饰器给每个视图函数 提供的,而且根据请求方式的不同可以一个url用于不同的作用。

    flask的路由:

    @app.route('/index', methods=['GET'], endpoint='index')
    def index():
        return 'hello'
    
    • 1
    • 2
    • 3

    Django的路由:

    urlpatterns = [
    	path('admin/', admin.site.urls),
    	
    ]
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    toute源码分析

    ‘’’
    #1 装饰器 @route python特殊语法糖,会把下面的函数当参数传入 order=route(order) 以后调用order本质就是在执行route(order)()

    #2 route的内层函数---->本质是self.add_url_rule(rule, endpoint, f, **options)
    def decorator(f):
    endpoint = options.pop(“endpoint”, None)
    self.add_url_rule(rule, endpoint, f, **options)
    return f

    #3 self是app对象,add_url_rule 其实就Flask类的add_url_rule方法

    #4 所以我们可以不使用装饰器来注册路由,而自己写
    app.add_url_rule(‘/order/string:pk’,view_func=order)
    app.add_url_rule(‘/index’,view_func=index)
    ‘’’

    add_url_rule参数

    参数

    	-rule:请求的路径,可以使用转换器
        -endpoint:别名--》反向解析
        -view_func:视图类.as_view(name='xx')(视图函数内存地址)
        -methods:允许的请求方式
        # ---------以下不重要-----
        -defaults:字典,给视图函数传默认值
        -strict_slashes:对URL最后的 / 符号是否严格要求
        -redirect_to
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    默认转换器

    'default':          UnicodeConverter,
    'string':           UnicodeConverter,
    'any':              AnyConverter,
    'path':             PathConverter,
    'int':              IntegerConverter,
    'float':            FloatConverter,
    'uuid':             UUIDConverter, 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    请求响应

    @app.route('/login.html', methods=['GET', "POST"])
    def login():
        ####请求对象的属性和方法
        # request:是全局的request,用起来就当是每个请求都有一个request即可
        print(request.method) # 请求方式
        print(request.args) # get 请求参数
        print(request.form) # post提交的数据
        print(request.values)  # get,post提交的数据总和
    
        print(request.cookies)  # cookies
        print(request.headers)  # 请求头
        print(request.path)  # 路径
        print(request.full_path)  # 全路径
        print('-----',request.script_root)
        # request.url           带域名带参数的请求路径
        print(request.url)      # 带服务器地址的全路径
        # request.base_url		带域名请求路径
        print(request.base_url)  # 不带地址的全路径
        # request.url_root      域名
        print(request.url_root)   # 域名+端口
        # request.host_url		域名
        print(request.host_url)  # 域名+端口
        # request.host
        print(request.host)    # 不带http的域名+端口
        from werkzeug.datastructures import FileStorage
        print(type(request.files.get('files')))
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    响应对象

    ##1  向浏览器中写入cookie,四件套都可以使用make_response包裹一下变成响应对象
    
    • 1
        res=make_response(render_template('home.html'))
        res.set_cookie('name','lqz')
        # delete_cookie  #  删除cookie
    
    • 1
    • 2
    • 3
    ## 2 向浏览器中写响应头
    
    • 1
    res.headers['X-Something'] = 'A value'
     return res
    
    • 1
    • 2
  • 相关阅读:
    基建融资与预算软约束(2015年A股大牛市与“流动性堰塞湖”)-中国视角下的宏观经济
    Transfer principle
    java计算机毕业设计校园快递联盟系统源码+系统+mysql数据库+lw文档
    Verilog参数定义与仿真模块中的参数修改
    6-10 单链表分段逆转 分数 15
    系列二、Lock接口
    RIP协议(路由信息协议)
    “易+”开源 | 简单可信赖,GameSentry 正式开源
    2-9.基金管理人公司治理和风险管理
    怎么把pdf转换成高清图片?
  • 原文地址:https://blog.csdn.net/Ban_a/article/details/126232483