flask简单应用(3)

一、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不可重复。
flask简单应用(3)_第1张图片
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/', endpoint='home', methods=('POST', 'GET'))
def home1(age):
    print(type(age))  # 只要能传过来就是int数字
    dic1 = {'name': 'hehe', 'home1': age}
    return jsonify(dic1)

@app.route('/home/', endpoint='home2', methods=('POST', 'GET'))
def home2(str):
    print(type(str))  # 只要能传过来就是string字符串
    dic2 = {'name': 'hehe', 'home2': str}
    return jsonify(dic2)

# @app.route('/home/', 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/:给url设置动态参数(数字类型)
# /home/:给url设置动态参数(字符串类型)
# 不指定类型,默认是string类型,些什么都行/home/,数字也会转成字符串

你可能感兴趣的:(flask简单应用(3))