• python


    这两天稍微接触了一点 Flask 框架,所以分享点基础

    1. 配置文件

    from flask import Flask
    
    app = Flask(__name__)
    # 使用自定义的配置文件
    app.config.from_object('settings.Config')
    """
    # 内部原理 : con = 'settings.Config' - a,b = con.rsplit('.',maxsplit=1) # 将字符分割 - m = importlib.import_module(a) # 导入settings模块 - class = getattr(m.b) # 拿到settings下的类 """ @app.route('/index') def index(): return 'index' if __name__ == '__main__': # print(app.config) # 打印 Flask 下的配置属性 app.run() ################### 配置文件.py #################### class Config(object): DEBUG = False class ProductionConfig(Config): # 线上环境使用的配置 DEBUG = False class DevelopmentConfig(Config): # 开发环境下使用 DEBUG = True

    2. 路由系统

    from flask import Flask,render_template,request,redirect,session,url_for
    
    app = Flask(__name__)
    
    """
        endpoint=名字
        这个名字就指代了当前视图函数的 url 地址
        
        如果不写 endpoint 那么 url_for 反向解析的默认值就是当前视图函数的名字 
           - url_for('index')    
    """
    
    # @app.route('/index',methods=['GET','POST'],endpoint='q1')
    @app.route('/index/<int:nid>',methods=['GET','POST'])
    def index(nid):
        """
            nid -- 接收上面 url 中的参数
                接收参数类型:
                    - @app.route('/index<username>')    # 字符
                    - @app.route('/index<int:nid>')     # 整数
                    - @app.route('/index<float:nid>')   # 浮点
                    - @app.route('/index<path:path>')   # 路径
        :param nid:
        :return:
        """
        # print(url_for('q1'))      # 反向解析 url : /index
        # print(url_for('index'))   # 默认 函数名  : /index
        # print(url_for('index',nid=333)) # /index/333
        return 'INDEX'
    
    
    if __name__ == '__main__':
        app.run()

    3. 请求和响应

    from flask import Flask, render_template, request, redirect, session, url_for, jsonify, make_response
    
    app = Flask(__name__)
    
    @app.route('/index', methods=['GET', 'POST'])
    def index():
        """
            常用 响应方式
                return 'INDEX'
                return jsonify({'k1':k2})
                return render_template()
                return redirect()
        :return:
        """
        # 设置响应头
        obj = make_response('Index')    # 把要返回的字符串,封装到对象中
        obj.headers['headers_q'] = 'xxx'
        obj.set_cookie('k1','v1')
        return obj
    
    
    if __name__ == '__main__':
        app.run()

    4. 模板

    """
    
        模板渲染:
            - 1. 标签解析:
                    方式一:{{txt|safe}}
                    方式二:MarpUp  -- Markup("<input type='text' />")
            - 2. 在模板进行函数调用
                    方式一:自定义一个函数,然后变成参数传递  --  {{fn(7)}}
                    方式二:使用 @app.template_global() 来定义一个全局的函数,在所有模板都可用(加括号) -- {{fn1(1,2)}}
                    方式二:使用 @app.template_filter() 来定义一个全局的函数,在所有模板都可用(加括号) -- {{4|fn2(6,7)}}
            - 3. 模板继承:
                    - 父模板:{% block content %} {% endblock %}
                    - 子模版:{% extends 'base.html' %}
                              {% block content %}
                              {% endblock %}
    
            - 4. 在模块中定义 宏
                    {% macro a(name,type='text',value='') %}
                        <h1>宏</h1>
                        <input type="{{type}}" name="{{name}}" value="{{value}}">
                    {% endmacro %}
                    {{a('q')}}
    """
    from flask import Flask,render_template,request,redirect,session,url_for,jsonify,make_response,Markup,flash,get_flashed_messages
    
    app = Flask(__name__)
    
    # 全局函数(加括号) - 可以任何模板中使用
    @app.template_global()
    def fn1(a1,a2):
        return a1+a2
    
    # 参数放的方式不一样,可以用于判断条件
    @app.template_filter()
    def fn2(a1,a2,a3):
        return a1+a2+a3
    
    def fn(arg):
        return arg
    
    @app.route('/index',methods=["GET","POST"])
    def index():
        print('index')
        info = {
            'lis':[1,2,3],
            'txt':"<input type='text' />",
            'txt1':Markup("<input type='text' />"),
            'fn':fn
        }
        return render_template('models.html',**info)
    
    
    if __name__ == '__main__':
        app.run()

    5. session 简单了解

    """
        # 当请求刚到来的时:flask 读取cookie 中对应的值,将值解密,并放反序列化成字典,放入内存,以便视图函数使用
        # 当请求结束时,flask 会读取内存中字典的值,进行序列化和加密,写入 Cookie 中
    
        - 只能取一次 session 值:
                from flask import Falsk, flash, get_fiashed_messages
    
                flash('k1')  --  存放一个值到 session 中
                    - 可以分类:
                            flash('k1','error')
                            flash('k2','error')
                            flash('k3','info')
                get_flashed_messages() --  只能获取一次 session 的值
                    - 可以只拿分类中的数据
                            get_flashed_messages(category_filter=['error'])
    """

    6. 特殊装饰器 -- 类似于 Django 中的中间件

    from flask import Flask
    app = Flask(__name__)
    
    """
        执行顺序:
            1. before -> Index -> after 
            2. before1 -> before2 -> Index -> after2 -> after1
            3. before1(如果return) -->  after2  ->  after1
        
        定制错误页面:
            @app.errorhandler(404)
            def not_found(arg):
                return xxx.html
            
    """
    
    @app.before_request
    def x1():
        print('before')
    
    @app.after_request
    def x2(response):
        print('after')
        return response
    
    @app.route('/index')
    def index():
        print('index')
        return 'Index'
    
    
    if __name__ == '__main__':
        app.run()

    7. 中间件

    """
        - call 触发条件:
            - 用户发起请求时执行
    """
    from flask import Flask
    app = Flask(__name__)
    
    class Middleware(object):
        def __init__(self,old):
            self.old = old
    
        def __call__(self, *args, **kwargs):
            ret = self.old(*args, **kwargs)
            return ret
    
    if __name__ == '__main__':
        app.wsgi_app = Middleware(app.wsgi_app)
        app.run()

    持续更新...

  • 相关阅读:
    说说内核与计算机硬件结构
    为什么51单片机的地址总线是16位的,但是它却是8位机?
    哈弗结构与冯诺依曼结构
    关于ARM的内核架构
    Bootloader之uBoot简介(转)
    mysql优化
    java上传并下载以及解压zip文件有时会报文件被损坏错误分析以及解决
    [Java]读取文件方法大全
    request相关研究
    session与cookie
  • 原文地址:https://www.cnblogs.com/chaoqi/p/10487157.html
Copyright © 2020-2023  润新知