一、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>,数字也会转成字符串
网友评论