# 咱们都知道flask中的@app.route就是一层装饰器, 当咱们须要在给视图函数加装饰器的时候就两层装饰器,这里介绍一下加装饰器的前后顺序,以及遇到的问题.
def wrapper(func): def inner(*args, **kwargs): if session.get('is_login'): ret = func(*args, **kwargs) return ret else: return redirect('/login') return inner
# Flask中的route装饰器放到最外面, 它装饰被操做完的视图函数. # 凡是加上双装饰器的函数, @app.route()里面都要写endpoint='名字随便起,可是不能重复', 不然会报下面这个错误. # AssertionError: View function mapping is overwriting an existing endpoint function: inner @app.route("/index", endpoint='index') @wrapper def index(): return 'Conguatulations!!!' @app.route('/static/detail', endpoint='detail') @wrapper def detail(): return render_template('detail.html', student_detail=STUDENT_DETAIL)
if view_func is not None: # view_func = def detail # view_func = def index old_func = self.view_functions.get(endpoint) # endpoint = "detail" if old_func is not None and old_func != view_func: raise AssertionError('View function mapping is overwriting an ' 'existing endpoint function: %s' % endpoint) self.view_functions[endpoint] = view_func # 若是都不写endpoint的话,第一次view_func(detail)赋值给endpoint, 那么第二次view_func(index)来的时候就已经有endpoint了,而且endpoint是detail, 明显不为空而且detail != index,因此报错.
# 第一种,直接在装饰器里面写 @app.route("/index") def index() # 第二种,方法,写在函数下面 app.add_url_rule("/index",view_func=index)
# methods要写在@app.route()里面, 并且methods=可迭代对象(列表,元组等),可迭代对象里面写http的8中请求方式. @app.route('/login', methods=['GET', 'POST'])
endpoint 路由Mapping 地址对应视图函数,绝对不能重复 @app.route('/index',endpoint='随便起名') def my_index(): print(url_for(endpoint='这个名要和上边的同样')) # 获得的是 /index, url_for须要导入 return '我是index'
# 这些参数都写在@app.route()里面 strict_slashes=True # 是否严格遵循路由匹配 -> "/"结尾 默认值是 True 必须严格遵循 defaults={"nid":3} # 默认路由参数 -> 视图函数中必须有一个nid的形参接收,必须叫这个名 redirect_to="/index" # 永久重定向 -> 不进入试图函数处理,直接跳转
@app.route("/detail/<stu_id>") 能够在 路由地址 以后增长参数的传递 视图函数中必须有一个 stu_id 的形参接收且必须叫这个名 例如: @app.route("/getimg/<path>/<filename>") def getimg(path,filename): file_path = os.path.join(path,filename) return send_file(file_path) # 在浏览器中输入127.0.0.1:5000/getimg/img/1.jpg 就能访问到本机上img文件夹下1.jpg这张图片.
# 如下这些都写在app=Flask(__name__)里面,如app=Flask(__name__,static_folder=img) 1.template_folder="tem" # 指定模板存放路径,建立tem文件夹装html文件,flask能找到路径 2.static_folder="img" # 指定静态文件的存放路径,告诉flask去img里面找 3.static_url_path="/static" #指定静态文件访问路径,当你访问static的时候去img里面找 <img src="/static/1.jpg"> # 这时候找的就是img中的1.jpg # 源码 # if static_url_path is None # static_url_path = "/" + static_folder = /img static_host=None, 静态文件的存放服务器 host_matching=False, False 主机位匹配 www.baidu.com:999 subdomain_matching=False, 遵循子域名匹配
app.default_config # ctrl + 鼠标左键点default_config查看默认配置及配置项
# mysetting.py文件 # debug环境下,里面的属性必须都大写 class DebugSetting(object): DEBUG = True SECRET_KEY = "#$%^&*$%*&%*" SESSION_COOKIE_NAME = "我是session的名字" JSONIFY_MIMETYPE = "application/javascript" # 测试环境下,里面的属性必须都大写 class TestingSetting(object): DEBUG = False TESTING = True SECRET_KEY = "我实际上是正式环境的赛克瑞特钥匙" SESSION_COOKIE_NAME = "SHIT" JSONIFY_MIMETYPE = "application/json"
# test.py文件 浏览其中访问127.0.0.1:5000/index from flask import Flask, render_template, session app = Flask(__name__) # 从mysetting文件中导入 下面两个类 from mysetting import DebugSetting from mysetting import TestingSetting # app.config.from_object(DebugSetting) # 开启这个是debug环境 app.config.from_object(TestingSetting) # 开启这个是测试环境 app.congfig.from_object(类名) 记住这个格式 @app.route("/index") def index(): session["key"] = "value" return render_template("index.html") if __name__ == '__main__': app.run()
# message.py文件 from flask import Blueprint msg = Blueprint("msg",__name__,url_prefix="/xxx") # 第一个参数是蓝图标识,随便写,但不能重复, url_prefix是前缀,当你访问msg的时候须要加上/xxx, 也就是说你正常访问127.0.0.0:5000/msg变成了127.0.0.0:5000/xxx/msg @msg.route("/msg",methods=['POST','GET']) def msg(): return "我是信息文件"
# userinfo.py文件 from flask import Blueprint user = Blueprint("随便写",__name__) # url_prefix没啥必要 @user.route("/user",methods=["GET","POST"]) def my_user(): return "i am user"
from flask import Flask from userinfo import user from message import msg app = Flask(__name__) app.register_blueprint(user) app.register_blueprint(msg) if __name__ == '__main__': app.run(debug=True) # 这是候访问127.0.0.1:5000/user 返回结果就是i am user
# 写在views文件夹里的bigboy.py文件 from flask import Blueprint boy = Blueprint('boy', __name__) @boy.route('/boy') def my_boy(): return '我是大帅锅!'
from flask import Flask from app01.views import bigboy def create_app(): app = Flask(__name__) #须要注册蓝图 app.register_blueprint(bigboy.boy) return app
from app01 import create_app app = create_app() if __name__ == '__main__': app.run(debug=True)