zoukankan      html  css  js  c++  java
  • PythonWeb框架之Flask

    简单实例:

    from flask import Flask
    
    app = Flask(__name__)
    
    
    @app.route('/')
    def hello_world():
        return 'Hello World!'
    
    
    if __name__ == '__main__':
        app.run()

    1.配置

      通过app.config进行配置项的设置:

      - 直接赋值

    app.config['secret_key'] = "sdf234jkwjk3423kldjl"

      - 通过配置文件进行配置项管理

    # settings.py 定义类,变量名要大写,在flask的使用源码里进行了isupper的判断
    class BaseConfig():
        SALT = "3d086a6d-a140-41d8-817b-61f66de49fc0"
        SECRET_KEY = "3c43k6zl5las1d2kk3d8y7tw"
    # 使用
    app.config.from_object("settings.BaseConfig")

    2.路由系统

      - 方式一

    def index():
        pass
    app.add_url_rule('/', 'index', index) # '/':url,'index':endpoint,index:对应执行的函数

      - 方式二

    @app.route('/', endpoint='index')
    def index():
        pass

        - 动态传参

    @app.route('/index/<int:nid>')
    def index(nid):
        return "Index"

      endpoint指定反向解析url的方式,默认为函数名

    url_for(endpoint) # 反向解析
    url_for(endpoint, nid=参数) # 反向解析传参

      指定请求方式methods

    @app.route('/', methods=['GET','POST'])  # 默认只有GET

    3.CBV

      示例

    #CBV视图
    from flask import Flask,url_for,views
    #-----------------------------------------------------
    app=Flask(__name__)               #装饰器
    
    def auth(func):
        print('我在上面')
        def inner(*args,**kwargs):
            return func(*args,**kwargs)
        return inner
    #--------------------------------------------------------
    class IndexView(views.MethodView):  #CBV视图
        methods=['GET']                #允许的http请求方法(改CBV只允许GET方法)
        decorators = [auth,]            #每次请求过来都加auth装饰器
    
        def get(self):
            return 'Index.GET'
        def post(self):
            return 'Index.POST'
    
    app.add_url_rule('/index/',view_func=IndexView.as_view(name='name1')) #(name='name1'反向生成url别名
    
    
    if __name__ == '__main__':
        app.run()
    
    CBV视图

    4.请求相关

      request能获取的数据:

    request.method
    request.args
    request.form
    request.values
    request.cookies
    request.headers
    request.path
    request.full_path
    request.script_root
    request.url
    request.base_url
    request.url_root
    request.host_url
    request.host
    request.files

      详细信息参考博客https://www.cnblogs.com/wangjikun/p/6935592.html

    5.响应

      - return "Hello World" 返回字符串

      - return jsonify({'data': data})  返回json数据

      - return render_template('index.html')  返回HTML

      - return redirect('/login')  跳转

      定制响应头:

    from flask import make_response
    
    response = make_response("Hello World")
    response.headers["xxx"] = "value"
    # 设置cookie
    response.set_cookie("key", "value")
    return response

    6.模板渲染

      使用方式和Django的模板渲染类似:{{ }} 和 {% %}。

      基本方法不太一样,函数需要加括号执行,类似于python的语法:

        - {{ dict.get() }} 或 {{ dict["key"] }}

        - {{ list[0] }}

        - {% for 循环 %} {% endfor %}

        - {% if 判断 %} {% endif %}

      还可以自定义全局函数,在模板中使用:

    @app.template_global()
    def sum(a1, a2):
        return a1 + a2
    # 模板中使用{{ sum(2, 3) }}
    
    # 类似的
    @app.template_filter()
    def sum(a1, a2, a3):
        return a1 + a2 + a3
    # 调用方式不同{{ 1|sum(2,3) }}    

      模板继承:

    {% extends "mater.html"%}
    
    {% block content %}
        自定义内容
    {% endblock %}
    
    {% include "组件.html" %}    

      定义宏:

    {% macro input(name, type='text', value=' ') %}
    <input type="{{ type }}" name="{{ name }}" value="{{ value }}">
    {% endmacro %}
    
    # 使用
    <form>
    {{ input('username') }}
    {{ input('password', type="password") }}
    {{ input(' ', type="submit", value="提交") }}
    </form>

      安全:

    # 前端
    {{ data|safe }}
    
    # 后端
    from flask import Markup
    data = Markup(data)

    7.session

      flask中的session正常保存在cookie中,当请求时,会从cookie中读取session值,进行解密和反序列化保存在Local对象中,通过导入的session可以在视图中进行操作。请求结束时,会从Local对象中读取值,进行序列化和加密后保存到cookie中。

    8.flash

      flask中暂时储存数据的一个方式

    from flask import flash, get_flashed_messages
    
    # 储存数据
    flash("临时数据", "name")
    
    # 获取数据, 通过pop获取并移除
    msg = get_flashed_messages(category_filter=["name"])

    9.中间件

      flask中请求到来时会执行app.__call__方法,而__call__会执行app.wsgi_app方法。而我们就可以通过重写wsgi_app完成一个中间件,重写app.wsgi_app为对象,执行app.wsgi_app()就会触发类的__call__方法,在__call__方法里完成中间件的操作。

    class Middleware():
        def __init__(self, wsgi_app)
            self.wsgi_app = wsgi_app
    
        def __call__(self, environ, start_response):
            # 在处理请求前的操作
            ret = self.wsgi_app(environ, start_response)
            # 在请求完成后的操作
            return ret
    
    if __name__ == '__main__':
        app.wsgi_app = Middleware(app.wsgi_app)
        app.run()

    10.特殊装饰器

      1.before_request:在执行请求对应的视图函数之前执行其装饰的函数,可以用作登录验证。

      2.after_request:在请求完成后执行其装饰的函数

      3.before_first_request:在第一次请求时执行其装饰的函数

      4.template_global

      5.template_filter

      6.errorhandler:捕捉指定的错误,进而执行其装饰的函数     

  • 相关阅读:
    使用vue-cookies操作cookie
    JavaScript如何友好的操作的cookie
    揭秘——TCP的三次握手和四次挥手
    python学习之【第八篇】:Python中的函数基础
    python学习之【第七篇】:Python中的集合及其所具有的方法
    python学习之【第六篇】:Python中的字典及其所具有的方法
    php判断是不是手机端访问
    php判断浏览器还是微信打开
    php无限极分类方法
    javascript/jquery获取url地址栏参数的方法
  • 原文地址:https://www.cnblogs.com/zxc-Weblog/p/9200997.html
Copyright © 2011-2022 走看看