flask框架2

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()

三.请求与响应

from flask import Flask
from flask import request
from flask import render_template
from flask import make_response
app = Flask(__name__)
#请求里面有哪些内容
#我们怎么定制响应
@app.route(‘/login.html‘, methods=[‘GET‘, "POST"])
def login():
    # 请求相关信息
    #提交的方法
    print(request.method)
    # request.args  get请求提及的数据
    print(request.args)
    # request.form   post请求提交的数据
    # request.values  post和get提交的数据总和
    # request.cookies  客户端所带的cookie
    # request.headers  请求头
    print(request.headers)
    # request.path     不带域名,请求路径
    print(request.path)
    # request.full_path  不带域名,带参数的请求路径
    # request.script_root
    # request.url           带域名带参数的请求路径
    # request.base_url      带域名请求路径
    # request.url_root      域名
    # request.host_url      域名
    # request.host          127.0.0.1:500
    # request.files
    # obj = request.files[‘the_file_name‘]
    # obj.save(‘/var/www/uploads/‘ + secure_filename(f.filename))


    # 响应相关信息
    # return "字符串"
    # return render_template(‘html模板路径‘,**{})
    # return redirect(‘/index.html‘)
    # return jsonify({‘k1‘:‘v1‘})

    #response = make_response(render_template(‘index.html‘))
    # response是flask.wrappers.Response类型
    # response.delete_cookie(‘key‘)
    # response.set_cookie(‘key‘, ‘value‘)
    # response.headers[‘X-Something‘] = ‘A value‘
    # return response

    # 如果想要做定制化响应的话
    #1导入make_response
    #2response=make_response(4剑客)
    #3 操作response
    # return response
    response=make_response(render_template(‘index.html‘))
    response.set_cookie(‘jason‘, ‘sb‘)
    # response.delete_cookie(‘key‘)
    response.headers[‘X-Something‘] = ‘A value sbwewewe‘
    return response


if __name__ == ‘__main__‘:
    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()

了解:

只执行一次
# @app.before_first_request
# def before_first():
#     print("123")

#如论有没有异常都会执行,如果没有异常这个参数就是None,有就记录这个异常
# @app.teardown_request
# def tear(e):
#     print(‘teardown_request‘)
#     print(e)

#捕获异常,如果出现异常,而且状态就是@app.errorhandler(404),
@app.errorhandler(404)
def error_404(arg):
    print(arg)
    return "404错误了"


# @app.errorhandler(500)
# def error(arg):
#     print(arg)
#     return "500错误了"




@app.template_global()
def sb(a1, a2):
    return a1 + a2

@app.template_filter()
def db(a1, a2, a3):
    print(a1,a2,a3)
    return a1 + a2 + a3

@app.route(‘/index‘)
def index():
    print("我是真的视图")
    return render_template("index.html")

七.中间件

八.请求流程

相关推荐