美文网首页
flask简单应用(3)

flask简单应用(3)

作者: 清风徐来_简 | 来源:发表于2019-06-23 16:50 被阅读0次

    一、endpoint,路由命名
    二、url_for,反向解析
    三、send_file,打开文件并返回
    四、jsonify,返回json格式数据
    五、strict_slashes,redirect_to,路由配置
    六、路由动态参数

    一、flask_demo1 之 endpoint

    from flask import Flask, render_template, request, session, redirect
    app = Flask(__name__)
    app.secret_key = 'ASDFGHJKL'
    
    def wrapper(f):
        def inner(*args, **kwargs):
            if not session.get('user'):
                return redirect('/login')
            ret = f(*args, **kwargs)
            return ret
    
        return inner
    
    @app.route('/home',endpoint='home')
    @wrapper
    def home():
        return '这是Home页面'
    
    @app.route('/index',endpoint='index')
    @wrapper
    def index():
        return render_template('index.html')
    
    @app.route('/login', methods=('POST', 'GET'))
    def login():
        msg = ''
        if request.method == 'POST':
            username = request.form.get('username')
            password = request.form.get('password')
            if username == 'zhangsan' and password == '123':
                session['user'] = username  # 设置session
                return redirect('/index')
            else:
                msg = '用户名或密码不对'
    
        return render_template('login.html', msg=msg)
    
    if __name__ == '__main__':   
        app.run()
    
    # 1,先加自定义装饰器再加路由装饰器
    # 2,且每一个路由里定义自己的endpoint名字
    
    # 原因:规定一个视图函数对应一个endpoint,如果加上装饰器之后会形成多个重复的函数 ,都叫inner,
    #       如果多个函数都没有定义endpoint,就会全部默认为函数名,就会一样,所以就报错。
    #       不写endpoint,默认都是装饰器的“inner”,重复即报错。
    # 报错:View function mapping is overwriting an existing endpoint function: inner
    
    # 函数名可重复,但是endpoint不可重复。
    
    endpoint.png

    二、flask_demo2 之 url_for

    from flask import Flask,url_for,redirect
    app = Flask(__name__)
    
    @app.route('/indexxxxx',endpoint='index')  # 给这个url个起名字
    def index():
        return url_for('index')  # 这是返回的字符串
    
    @app.route('/find')
    def find():
        return redirect(url_for('index'))  # 这是根据字符串跳转
    
    if __name__ == '__main__':   
        app.run()
    # endpoint 给路由起名字 (路由命名)
    # url_for  根据名字找路由(反向解析)
    

    三、flask_demo3 之 send_file

    from flask import Flask, send_file
    app = Flask(__name__)
    
    @app.route('/get')
    def get():
        return send_file('blueprint_static/f666.jpg')  # 打开文件并返回
    
    if __name__ == '__main__':   
        app.run()
    

    四、flask_demo4 之 jsonify

    import json
    from flask import Flask, jsonify
    app = Flask(__name__)
    
    x = {'name': 'zhangsan', 'age': 24}
    li = ['aaa', 'bbb', 'ccc', 1, 2, 3]
    
    # 1,原生json.dump(Content-Type: text/html; charset=utf-8)
    @app.route('/json')
    def json_type():
        return json.dumps(x)
    
    # 2,jsonify (Content-Type: application/json)
    @app.route('/jsonify')
    def jsonify_type():
        return jsonify(x)
    
    @app.route('/list')
    def lis():
        return jsonify(li)
    
    if __name__ == '__main__':   
        app.run()
    # 和  Django 中的 from django.http.response import JsonResponse 一样
    # jsonify的配置在app["JSONIFY_MIMETYPE"] = ""
    

    五、flask_demo5 路由配置(strict_slashes,redirect_to)

    from flask import Flask
    app = Flask(__name__)
    
    @app.route('/index', endpoint='index', methods=('POST', 'GET'), strict_slashes=True)
    def index():
        return 'Hello World!这是新地址'
    
    @app.route('/home', endpoint='home', methods=('POST', 'GET'), redirect_to='/index')
    def home():
        return 'Hello 这是老网址'
    
    if __name__ == '__main__':   
        app.run()
    # strict_slashes: 接收布尔值,如果输入的url最后带/,实际路由中不带/,strict_slashes=True,就会找不到,变成 False 就能找到
    # redirect_to :
    #       不进视图函数,直接跳转,强制跳转(此跳转状态码301:永久重定向),(302是临时重定向)
    #       用于:后端路由改变,不用告知用户,还是输入原url,可使用户无感知的跳转到新的url
    

    六、flask_demo6 路由动态参数

    from flask import Flask, jsonify
    app = Flask(__name__)
    
    @app.route('/index', endpoint='index', methods=('POST', 'GET'), defaults={'age': 20}) # 默认参数
    def index(age):
        dic = {'name': 'hehe', 'age': age}
        return jsonify(dic)
    
    @app.route('/home/<int:age>', endpoint='home', methods=('POST', 'GET'))
    def home1(age):
        print(type(age))  # 只要能传过来就是int数字
        dic1 = {'name': 'hehe', 'home1': age}
        return jsonify(dic1)
    
    @app.route('/home/<string:str>', endpoint='home2', methods=('POST', 'GET'))
    def home2(str):
        print(type(str))  # 只要能传过来就是string字符串
        dic2 = {'name': 'hehe', 'home2': str}
        return jsonify(dic2)
    
    # @app.route('/home/<suibian>', endpoint='home3', methods=('POST', 'GET'))
    # def home3(suibian):
    #     print(type(suibian))  # 只要能传过来,不管输入的数字还是字符串都会变成字符串
    #     dic2 = {'name': 'hehe', 'home3': suibian}
    #     return jsonify(dic2)
    
    if __name__ == '__main__':   
        app.run()
    # defaults :给视图传默认参数
    # /home/<int:age>:给url设置动态参数(数字类型)
    # /home/<string:sex>:给url设置动态参数(字符串类型)
    # 不指定类型,默认是string类型,些什么都行/home/<suibian>,数字也会转成字符串
    

    相关文章

      网友评论

          本文标题:flask简单应用(3)

          本文链接:https://www.haomeiwen.com/subject/jzgiqctx.html