Flask clearance strategy Daquan

basic use

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

configuration file

Introduce in app

app.config.from_object("settings.DevelopmentConfig")

settings

class BaseConfig(object):
    DEBUG = True
    SECRET_KEY = "随机字符串"


class ProductionConfig(BaseConfig):
    DEBUG = False


class DevelopmentConfig(BaseConfig):
    pass


class TestingConfig(BaseConfig):
    pass

routing

a. 添加路由的两种方式:
    from flask import Flask,render_template,redirect
    app = Flask(__name__)

    """
    1. 执行decorator=app.route('/index',methods=['GET','POST'])
    2. @decorator
         - decorator(index)
    """
    # 路由方式一(*):
    @app.route('/index',methods=['GET','POST'])
    def index():
        return "Index"

    # 路由方式二:
    def order():
        return 'Order'

    app.add_url_rule('/order',view_func=order)


    if __name__ == '__main__':
        app.run()
b. endpoint(默认函数名)
c. 传参数
    @app.route('/index/<int:nid>',methods=['GET','POST'])
    def index(nid):
        print(nid,type(nid))
        
        url_for('index',nid=888)
        
        return "Index"
d. 自定义正则参数

        from flask import Flask,render_template,redirect,url_for
        from werkzeug.routing import BaseConverter
        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['xxx'] = RegexConverter

        @app.route('/index/<xxx("\d+"):nid>',methods=['GET','POST'])
        def index(nid):
            print(nid,type(nid))
            v = url_for('index',nid=999) # /index/999
            print(v)
            return "Index"

        if __name__ == '__main__':
            app.run()

e. 其他参数
    - 重定向
        from flask import Flask,render_template,redirect
        app = Flask(__name__)

        @app.route('/index',methods=['GET','POST'],redirect_to='/new')
        def index():
            return "老功能"

        @app.route('/new',methods=['GET','POST'])
        def new():
            return '新功能'


        if __name__ == '__main__':
            app.run()
    
        PS: 前端重定向
            - meta/js

重点:
    - url
    - methods 
    - endpoint
    - @app.route('/index/<int:nid1>/<int:nid2>/')
    - url_for 

view function

fbv (commonly used)

import functools

def wapper(func):
    @functools.wraps(func)
    def inner(*args,**kwargs):
        print('before')
        return func(*args,**kwargs)
    return inner

@app.route('/xxxx',methods=['GET','POST'])
@wapper
def index():
    return "Index"

cbv

class IndexView(views.MethodView):
    methods = ['GET']
    decorators = [wapper, ]

    def get(self):
        return 'Index.GET'

    def post(self):
        return 'Index.POST'

app.add_url_rule('/index', view_func=IndexView.as_view(name='index2'))  # name=endpoint

request and response

request related

request.method
request.args
request.form
request.cookies
request.headers
request.path
request.files

obj = request.files['the_file_name']
obj.save('/var/www/uploads/' + secure_filename(obj.filename))

request.values
request.full_path
request.script_root
request.url
request.base_url
request.url_root
request.host_url
request.host

Response correlation

return ""
return json.dumps({}) # return jsonify({})
return render_template('index.html',n1=123)
return redirect('/index')

response = make_response(render_template('index.html'))
response = make_response("xxxx")
response.set_cookie('key', 'value')
response.headers['X-Something'] = 'A value'
response.delete_cookie('key')
return response

template

The calling method is basically the same as Django

session

  • set: session['username'] = 'xxx'
  • 删除:session.pop('username', None)

Blueprint

# 问题:模块化视图,把具体的视图给拆分出去,使用pytho模块制作的形式,解决文件引用的问题,
#        但是,模块制作解决不了url映射视图的问题;
# 引出蓝图:
# blueprint.py
    from flask import Blueprint
    from flask import Flask

    # 1.创建蓝图对象
    api = Blueprint('api',__name__) # 'api'表示蓝图的名称

    # 2.使用蓝图路由
    @api.route('/user')
    def user():
        return 'user'

# main.py # flask项目主文件
    from flask import Flask
    # 把拆分出去的文件导入程序启动文件
    from blueprint import api

    app = Flask(__name__)

    # 3.注册蓝图路由到app上
    app.register_blueprint(api)

    @app.route('/')
    def index():
        return 'index'

    if __name__ == '__main__':
        print(app.url_map)
        app.run(debug=True)
# 如果在其他文件中使用蓝图的api
# extra.py
    from flask import Flask
    # 把拆分出去的文件导入程序启动文件
    from blueprint import api

    @api.route('/')
    def extra_view():
        return 'index'
# blueprint.py
    from flask import Blueprint
    # from extra import extra_view # 这样还是会造成循环导入;
    # 解决循环导入的两种方式:1.from extra import * # 不建议使用
    #                       2.将导入操作放在执行代码后面,解决交错导入的问题;

    api = Blueprint('api',__name__) # 'api'表示蓝图的名称
    # 解决循环导入的问题
    from extra import extra_view
    
    @api.route('/user')
    def user():
        return 'user'

flash (message)

message是一个基于Session实现的用于保存数据的集合 
其特点是:使用一次就删除。
@app.route('/x1',methods=['GET','POST'])
def login():
    flash('我要上学校1',category='x1')
    flash('我要上学校2',category='x2')
    return "视图函数x1"

@app.route('/x2',methods=['GET','POST'])
def index():
    data = get_flashed_messages(category_filter=['x1'])
    print(data)
    return "视图函数x2"

middleware

class Middleware(object):
    def __init__(self,old_wsgi_app):
        """
        服务端启动时,自动执行
        :param old_wsgi_app:
        """
        self.old_wsgi_app =old_wsgi_app

    def __call__(self, environ, start_response):
        """
        每次有用户请求道来时
        :param args:
        :param kwargs:
        :return:
        """
        print('before')
        from flask import session,request
        obj = self.old_wsgi_app(environ, start_response)
        print('after')
        return obj

if __name__ == '__main__':
    app.wsgi_app = Middleware(app.wsgi_app)
    app.run()
    """
    1.执行app.__call__
    2.再调用app.wsgi_app方法
    """

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=324787715&siteId=291194637