flask 基础2
一.装饰器的坑
在使用装饰器函数时候,当一个装饰器装饰多个函数的时候,会由于内存地址相同时发生报错,因为装饰的都是一个函数
所以就需要引入
import functools 重新定义每一个函数的名称
import functools def waidu(fun): @functools.wraps(fun) def nei(*args,**kwargs): if session.get('user'): ret= fun(*args, **kwargs) return ret else: return redirect('/login') return nei
或者
在flask下也有一个内置 endpoint
二 flask中的路由
1.endpoint 反向生成url地址标识,默认是凸函数名url_for
1 @app.route('/', endpoint='index')#endpoint是route里面的属性,默认为NONE,则会显示函数名def index为默认 2 #要是标识出,就会区分每一个单独的函数名 3 def index(): 4 print(request.path) 5 return render_template('home.html')
这样也可以区分装饰器的坑,通过引入
from flask import url_for
来检测
print (url_for()
若正确,则打印路由地址
2.methods 视图函数允许的请求方式
@app.route("/index/<page>",methods=["GET","POST"],endpoint="index")
methods默认get请求,若不声明则不会显示
3
@app.route("/info/<page>", methods=['POST','GET'],endpoint='student',strict_slashes=True) #<int:page>page是一个变量名,int声明是数字,默认声明str #访问时,需要后面带着访问的字符串才会有页面 def student(page): print(page,type(page)) return "123"
4.defaults={"nid":"123456"} 默认参数,同样拼接在route里,打印的page是默认参数123456
5.strict_slashes=True 是否严格遵循路由地址#按照严格的网址关系,默认为false
6.redirect_to="/login" 永久重定向 301 没有302发生在显示页面之前,用在更换网址时直接跳转旧的网址
三.flask实例化配置
app = Flask(__name__,template_folder="template",static_folder="statics",static_url_path="/statics")
了解:
4.static_host=None 指定静态文件服务器地址 5.host_matching = False, # 如果不是特别需要的话,慎用,否则所有的route 都需要host=""的参数 6.subdomain_matching = False, # 理论上来说是用来限制SERVER_NAME子域名的,但是目前还没有感觉出来区别在哪里 7.instance_path = None, # 指向另一个Flask实例的路径 8.instance_relative_config = False # 是否加载另一个实例的配置 9.root_path = None # 主模块所在的目录的绝对路径,默认项目目录
四flask对象配置
'DEBUG': False, # 是否开启Debug模式 'TESTING': False, # 是否开启测试模式 'SECRET_KEY': None # 在启用Flask内置Session的时候/开启flash,一定要有它 'PERMANENT_SESSION_LIFETIME': 31, # days , Session的生命周期(天)默认31天 'SESSION_COOKIE_NAME': 'session', # 在cookies中存放session加密字符串的名字
对象配置需要新创建一个文件,
class FlaskDebug(object): DEBUG=True SECRET_KEY="SADIHAS" PERMANENT_SESSION_LIFETIME=8 SESSION_COOKIE_NAME="shadoubushi"
在flask里
import FlaskSetting
app.config.from_object(FlaskSetting.FlaskDebug)
就可以使用配置后的环境了
五.flask蓝图 (蓝图配置)
Blueprint :当成一个不能被启动的 app Flask示例
使用:
创建一个独立的文件夹
from flask import Blueprint,render_template s4app = Blueprint("s4app",__name__,template_folder="apptemp",url_prefix="/blue") @s4app.route("/s4app") def s4appfunc(): return render_template("s4app.html")
url_prefix="/blue" url前缀
在访问时需要写在路由前127.0.0.1:8000/blue/s4app
注册:
app.register_blueprint(views.s4app)
例子:
from flask import Blueprint, render_template,request,jsonify,json app01=Blueprint("app01",__name__,template_folder="temp")#每一个蓝图都需要声明一个名字,不可重复,可以创建多个蓝图 @app01.route("/app01",methods=["POST","GET"]) def app01func(): if request.method =="GET": return render_template("01.html") else: print(request.form.to_dict()) dic={} x=request.form.get("key") y=request.form.get("value") dic[x]=y dicc=json.dumps(dic) print(dic) return render_template("01.html",dic=dicc)
flask
from flask import Flask from bu import ha app=Flask(__name__) app.register_blueprint(ha.app01) app.run()
六.flask特殊装饰器
@app.before_request def bel(): print("我是 before_request1") return None #默认return None 要是直接返回 三剑客 不会自行视图函数 @app.before_request def be2(): print("我是before_request2") @app.before_request def be3(): print("我是before_request3")
@app.after_request def af1(args): print(args) print("我是after_request1") return args #发生在返回给客户端之前,需要返回参数args,若没有客户端什么都不显示 @app.after_request def af2(args): print("我是after_request2") return args @app.after_request def af3(args): print("我是after_request3") return args
@app.errorhandler(404)#声明出错信息 必须写 def error404(args): print(args)#打印报错信息 return render_template("error.html")#返回自己写的报错信息 app.run(debug=True)