day110--Flask--路由配置, flask实例化配置, app对象配置, 特殊装饰器, Blueprint
1.路由配置:app.add_url_rule("路由地址",view_func=视图函数,endpoint="反向地址")
methods 允许进入当前视图函数的请求方式
endpoint 反向生成URL地址 默认是视图函数名 -解决视图函数重名 endpoint是唯一值,不能重复
url_for 根据函数名反向生成URL地址, 如果加了装饰器,应把函数名改为endpoint名,见代码
defaults 传递默认参数 defaults={"nid":1} def index(nid)
strict_slashes 是否严格遵守URL地址规则 == True 在地址末尾不可以出现 / 反之可以
redirect_to 永久重定向 "/index" http - 301 # # 永久重定向 不执行视图函数直接跳转 301
subdomain 子域名配置 必须和 app中的 SERVER_NAME 联动
from flask import Flask, render_template, url_for import time app = Flask(__name__) def wrapper(func): def inner(*args, **kwargs): st = time.time() ret = func(*args, **kwargs) et = time.time() ut = et - st # print(f'耗时{ut}') return ret return inner @app.route('/index') @wrapper def index(): return "hello" @app.route('/home', endpoint='home') @wrapper def home(): return render_template('home.html') def login(): print('这里是login') print(url_for('inner')) print(url_for('home')) print(url_for('login')) print(url_for('my_custom')) return 'login' @app.route('/work', endpoint='my_custom') def work(): return app.add_url_rule('/login', view_func=login) if __name__ == '__main__': app.run(debug=True)
@app.route('/work', endpoint='my_custom', defaults={'sid': 11, 'arg': 'hello'}) def work(sid, arg): return str(sid) + arg
@app.route('/work', endpoint='my_custom', defaults={'sid': 11, 'arg': 'hello'}, strict_slashes=True) def work(sid, arg): return str(sid) + arg
@app.route('/work', endpoint='my_custom', defaults={'sid': 11, 'arg': 'hello'}, strict_slashes=True, redirect_to='/login') def work(sid, arg): return str(sid) + arg
# 动态路由参数
@app.route('/index/<int:nid>') # 限制参数类型int
@app.route('/index/<string:nid>') # 限制参数类型str
@app.route('/index/<nid>') # 不限制参数类型
# @app.route('/test/<int:nid>') # @app.route('/test/<string:arg>') @app.route('/test/<arg>') def test(arg): return arg
2.Flask实例化配置
template_folder="template" 更改模板存放目录
static_folder="statics" 更改静态文件存放目录
static_url_path="/s" 更改静态文件访问路径 默认- /static_folder
from flask import Flask, render_template app = Flask(__name__, template_folder="template",static_folder='static1', static_url_path='/s') @app.route('/photo') def photo(): return render_template('photo.html') if __name__ == '__main__': app.run(debug=True)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>photo</h1> <img src="../static1/02.jpg" alt="pic"> <img src="/s/02.jpg" alt="pic"> </body> </html>
3.Flask app对象配置 Session
class MyConfig(object):
DEBUG=True
SECRET_KEY = "23456789#$%^&*()" # 秘钥
SESSION_COOKIE_NAME = "sssss" # 修改session的名字, 默认是session
app.config.from_object(MyConfig)
app.config.from_json("json文件")
from flask import Flask, render_template, jsonify, session app = Flask(__name__, template_folder="template", static_folder='static1', static_url_path='/s') # 参见default_config = ImmutableDict中的默认配置项 # app.config['SECRET_KEY'] = '^(%&*(*' # app.config['DEBUG'] = True # app.config['TESTING'] = True # app.config['JSONIFY_MIMETYPE'] = 'application/json222' # 更改请求头中的Content-Type from settings import MyConfig, ConfigTesting # app.config.from_object(MyConfig) # app.config.from_object(ConfigTesting) # 自定义类 app.config.from_json('my_config.json') # json 文件 @app.route('/photo') def photo(): return render_template('photo.html') @app.route('/get_json') def get_json(): session['user'] = '123dd' return jsonify({'name': 'Alice'}) if __name__ == '__main__': app.run()
""" { 'ENV': None, 'DEBUG': None, 'TESTING': False, 'PROPAGATE_EXCEPTIONS': None, 'PRESERVE_CONTEXT_ON_EXCEPTION': None, 'SECRET_KEY': None, 'PERMANENT_SESSION_LIFETIME': timedelta(days=31), 'USE_X_SENDFILE': False, 'SERVER_NAME': None, 'APPLICATION_ROOT': '/', 'SESSION_COOKIE_NAME': 'session', 'SESSION_COOKIE_DOMAIN': None, 'SESSION_COOKIE_PATH': None, 'SESSION_COOKIE_HTTPONLY': True, 'SESSION_COOKIE_SECURE': False, 'SESSION_COOKIE_SAMESITE': None, 'SESSION_REFRESH_EACH_REQUEST': True, 'MAX_CONTENT_LENGTH': None, 'SEND_FILE_MAX_AGE_DEFAULT': timedelta(hours=12), 'TRAP_BAD_REQUEST_ERRORS': None, 'TRAP_HTTP_EXCEPTIONS': False, 'EXPLAIN_TEMPLATE_LOADING': False, 'PREFERRED_URL_SCHEME': 'http', 'JSON_AS_ASCII': True, 'JSON_SORT_KEYS': True, 'JSONIFY_PRETTYPRINT_REGULAR': False, 'JSONIFY_MIMETYPE': 'application/json', 'TEMPLATES_AUTO_RELOAD': None, 'MAX_COOKIE_SIZE': 4093, } """ class MyConfig(object): DEBUG = True SECRET_KEY = '^&*^*(' SESSION_COOKIE_NAME = 'my_session_name' class ConfigTesting(object): TESTING = True SECRET_KEY = "DFASGS" SESSION_COOKIE_NAME = 'customized_session_name'
这个session 是序列化后(加密)存放在客户端的Cookies中 默认名称为 session
4.特殊装饰器
before_request 在请求进入视图函数之前 做出响应
after_requset 在视图函数处理之后 响应返回客户端之前
正常情况:be1 - be2 - be3 - views - af3 - af2 - af1 返回顺序是定义代码时的倒序
before_request 返回值none
after_request 要接收一个参数response, 并返回这个参数
异常情况:be1 - af3 - af2 - af1 异常阻塞请求的情况
当只存在be1和af1, af2, af3时, 返回顺序是 be1 - views - af3 - af2 - af1
@app.errorhandler(404) # 重定义错误提示
def error404(arg):
print(arg)
return redirect("https://www.autohome.com.cn/beijing/asdfgasdfasdf")
before_first_request
from flask import Flask, render_template, session, request, redirect app = Flask(__name__) app.template_folder = 'template' app.config['SECRET_KEY'] = '^&^$^%^*' # 只在第一次请求之前执行, 之后的请求不执行 @app.before_first_request def first_rq(): print('before first request') return @app.before_request def be1(): print('我是be1') if request.path == '/login': return None if session: return None else: return redirect('/login') # @app.before_request # def be1(): # print('我是be2') # return None # # @app.before_request # def be1(): # print('我是be3') # return None @app.after_request def af1(res): print(res) print('我是af1') return res @app.after_request def af1(res): print('我是af2') return res @app.after_request def af1(res): print('我是af3') return res @app.route('/') def index(): print('进入视图函数了') return "test for before_request" @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'GET': return render_template('login.html') elif request.form.get('username') and request.method == "POST": print(request.form.get('username')) session['user'] = request.form.get('username') return render_template('login.html') # 修改了template_folder, pycharm识别错误飘黄 @app.errorhandler(404) # 里面参数放错误码或错误名 def error404(arg): print(arg) return render_template('404.html') if __name__ == '__main__': app.run()
5.Flask 蓝图Blueprint
from flask import Flask, Blueprint, render_template user = Blueprint('user', __name__, template_folder='templateB') @user.route('/user') def users(): return render_template('user.html')
from flask import Blueprint custom = Blueprint('custom', __name__, url_prefix='/cus') # 路由前缀添加 http://127.0.0.1:5000/cus/custom @custom.route('/custom') def test(): return "我是蓝图22222"
from flask import Flask from user import user from blueprint02 import custom app = Flask(__name__) app.register_blueprint(user) app.register_blueprint(custom) if __name__ == '__main__': app.run()
from flask import Blueprint ac_bp = Blueprint("acc",__name__,url_prefix="/ac") @ac_bp.route("/acc") def accs(): return "I am acc Blueprint"
from flask import Flask app = Flask(__name__) from s2.user import user_bp from s2.acc import ac_bp app.register_blueprint(user_bp) app.register_blueprint(ac_bp) if __name__ == '__main__': app.run()

浙公网安备 33010602011771号