flask框架
1.路由扩展
2.模板
3.请求与响应
4.session
5.闪现
6.请求扩展
7.中间件
8.请求流程
一.路由扩展
1.
# #对URL最后的 / 符号是否严格要求 # strict_slashes=False,改参数是用来设置我们路由是否为严格模式,False是非严格模式,True是严格,默认就是严格 # redirect_to="/login"比如说着个就url了,我们想让别人还输入旧的url登录到另一个网站
from flask import Flask,redirect,render_template,jsonify,views app = Flask(__name__) @app.route('/index',strict_slashes=True,redirect_to="/login") def index(): return "ok" @app.route('/login') def login(): return "sb" @app.route('/detail/<int:nid>') def detail(nid): print(nid) return "ok" if __name__ == '__main__': app.run()
2.
# 添加到flask中 # 我们要用自定义的路由,用正则的话 #1导入from werkzeug.routing import BaseConverter # 2我先要写一个类,然后继承BaseConverter,然后实现__inti__, def to_python(self, value):to_url(self, value) # 3 app.url_map.converters['随便'] = RegexConverter #4 我们在路由里面@app.route('/index/<regex1("\d+"):nid>'),regex1='随便,regex1("正则表达式") #5 regex1("正则表达式")匹配出来的结果,返回to_python,一定要return #6 当我们做反向解析的解析的时候,我们的参数,会传递给to_url,return的结果才是我们拼接到我们路由上
from flask import Flask, views, url_for from werkzeug.routing import BaseConverter app = Flask(import_name=__name__) class RegexConverter(BaseConverter): """ 自定义URL匹配正则表达式 """ def __init__(self, map, regex): super(RegexConverter, self).__init__(map) self.regex = regex def to_python(self, value): """ 路由匹配时,匹配成功后传递给视图函数中参数的值 """ #value就正则匹配出来的结果 print('value',value,type(value)) # 这里可以操作打印的数据类型 return "asdasdasd" def to_url(self, value): """ 使用url_for反向生成URL时,传递的参数经过该方法处理,返回的值用于生成URL中的参数 """ val = super(RegexConverter, self).to_url(value) print(val) return val app.url_map.converters['regex1'] = RegexConverter @app.route('/index/<regex1("\d+"):nid>',endpoint="sb") def index(nid): print("nid",nid,type(nid)) # 可以在to_url里面改变这个参数 print(url_for('sb', nid='888')) # /index/666 return 'Index' if __name__ == '__main__': app.run()
二.模板
from flask import Flask,render_template,Markup app = Flask(__name__) app.debug = True app.secret_key = 'sdfsdfsdfsdf' USERS = { 1:{'name':'张三','age':18,'gender':'男','text':"道路千万条"}, 2:{'name':'李四','age':28,'gender':'男','text':"安全第一条"}, 3:{'name':'王五','age':18,'gender':'女','text':"行车不规范"}, } # 函数在前端响应 def func1(st,st1): return Markup(f"<h1>fzy-sb{st}{st1}</h1>") @app.route('/list',methods=['GET']) def list(): info = USERS return render_template('list.html',info=info,html='<h1>fzy-dsb</h1>',html1=func1) # 有名分组 可以标识号 @app.route('/detail<int:nid>',methods=['GET'],endpoint="sb") def detail(nid): return "ok" if __name__ == '__main__': app.run()
三.请求与响应
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 from flask import Flask 2 from flask import request 3 from flask import render_template 4 from flask import make_response 5 app = Flask(__name__) 6 #请求里面有哪些内容 7 #我们怎么定制响应 8 @app.route('/login.html', methods=['GET', "POST"]) 9 def login(): 10 # 请求相关信息 11 #提交的方法 12 print(request.method) 13 # request.args get请求提及的数据 14 print(request.args) 15 # request.form post请求提交的数据 16 # request.values post和get提交的数据总和 17 # request.cookies 客户端所带的cookie 18 # request.headers 请求头 19 print(request.headers) 20 # request.path 不带域名,请求路径 21 print(request.path) 22 # request.full_path 不带域名,带参数的请求路径 23 # request.script_root 24 # request.url 带域名带参数的请求路径 25 # request.base_url 带域名请求路径 26 # request.url_root 域名 27 # request.host_url 域名 28 # request.host 127.0.0.1:500 29 # request.files 30 # obj = request.files['the_file_name'] 31 # obj.save('/var/www/uploads/' + secure_filename(f.filename)) 32 33 34 # 响应相关信息 35 # return "字符串" 36 # return render_template('html模板路径',**{}) 37 # return redirect('/index.html') 38 # return jsonify({'k1':'v1'}) 39 40 #response = make_response(render_template('index.html')) 41 # response是flask.wrappers.Response类型 42 # response.delete_cookie('key') 43 # response.set_cookie('key', 'value') 44 # response.headers['X-Something'] = 'A value' 45 # return response 46 47 # 如果想要做定制化响应的话 48 #1导入make_response 49 #2response=make_response(4剑客) 50 #3 操作response 51 # return response 52 response=make_response(render_template('index.html')) 53 response.set_cookie('jason', 'sb') 54 # response.delete_cookie('key') 55 response.headers['X-Something'] = 'A value sbwewewe' 56 return response 57 58 59 if __name__ == '__main__': 60 app.run()
四.什么是session怎么使用
''' app.session_interface这里面看 存session, 1 调用save_session,将我们的session加密的val,读取配置文件['SESSION_COOKIE_NAME']得到key 2 将1种的key,val存储到cookies 取session 1 获取request里面的cookies,获取里面key,这个key就是['SESSION_COOKIE_NAME'],值就是加密的值 2 对该值进行解密 '''
from flask import Flask,session app = Flask(__name__) # 使用session就需要指定一下这个参数,随便写一串字符串就是加密秘钥 app.secret_key = "qrqrqq" # 可以修改session的key app.config['SESSION_COOKIE_NAME'] = 'dsb' @app.route('/') def index(): # 设置session值 session['fzy'] = "gdx" return "ok" @app.route('/index') def index1(): # 取session值 print(session['fzy']) return "ok1" if __name__ == '__main__': app.run()
五.闪现
''' 什么是闪现 a产生信息,传给 c 页面以后,不是直接跳转到c,而是到b,或者是其他页面, 但是用户访问c页面的时候,我希望把a给我的信息拿到 '''
一些参数的解释
# flash是存 get_flashed_messages是取
#1 如果要用flash就必须设置app.secret_key = 'asdfasdf'
#2 只能取一次,在取就没有了
#3 我们可以通过 flash('普通信息',category="info"),对信息做分类
#4get_flashed_messages(with_categories=True,category_filter=("error",)),with_categories以键值对的形式获取
#我们设置闪现,category_filter=("error",)进行分类信息的过滤
# category= 对信息进行分类
# 如果你不写这个with_categories=True取出来的值就没有key,就直接打印错误信息
# category_filter=("error","info")指定取出哪些信息 等于说做了一个过滤
# 在同一次请求中无论获取多少次都可以获取到
# 但是请求结束后,再次请求就没有了,因为被pop掉了
from flask import Flask,flash,get_flashed_messages,request app = Flask(__name__) app.secret_key = 'asdfasdf' @app.route('/index1') def index(): #(category="message", message)) flash('超时错误',category="error") # category= 对信息进行分类 flash('普通信息',category="info") return "ssdsdsdfsd" # return redirect('/error') @app.route('/error1') def error1(): return "ok" @app.route('/error') def error(): # 如果你不写这个with_categories=True取出来的值就没有key,就直接打印错误信息 # category_filter=("error","info")指定取出哪些信息 等于说做了一个过滤 data = get_flashed_messages(with_categories=True,category_filter=("error","info")) # 在同一次请求中无论获取多少次都可以获取到 # 但是请求结束后,再次请求就没有了,因为被pop掉了 data1 = get_flashed_messages(with_categories=True, category_filter=("error", "info")) print("data1",data1) print("data",data) return "错误信息" if __name__ == '__main__': app.run()
六.请求扩展
重要的就2个:before_request,after_request
from flask import Flask,flash,get_flashed_messages,request app = Flask(__name__) # # before_request请求之前的 # @app.before_request # def befor1(): # print("我是请求之前1") # return "123" # # @app.before_request # def befor2(): # print("我是请求之前2") # after_request 请求之后的 ,需要一个参数:response ''' 执行结果 我是真的视图 我是请求之后2 我是请求之后1 ''' @app.after_request def after(response): print("我是请求之后1") return response @app.after_request def after(response): print("我是请求之后2") return response @app.route('/index') def index(): print("我是真的视图") return "ok" if __name__ == '__main__': app.run()
了解:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 只执行一次 2 # @app.before_first_request 3 # def before_first(): 4 # print("123") 5 6 #如论有没有异常都会执行,如果没有异常这个参数就是None,有就记录这个异常 7 # @app.teardown_request 8 # def tear(e): 9 # print('teardown_request') 10 # print(e) 11 12 #捕获异常,如果出现异常,而且状态就是@app.errorhandler(404), 13 @app.errorhandler(404) 14 def error_404(arg): 15 print(arg) 16 return "404错误了" 17 18 19 # @app.errorhandler(500) 20 # def error(arg): 21 # print(arg) 22 # return "500错误了" 23 24 25 26 27 @app.template_global() 28 def sb(a1, a2): 29 return a1 + a2 30 31 @app.template_filter() 32 def db(a1, a2, a3): 33 print(a1,a2,a3) 34 return a1 + a2 + a3 35 36 @app.route('/index') 37 def index(): 38 print("我是真的视图") 39 return render_template("index.html")
七.中间件
八.请求流程