flask配置文件、路由设置、模板语法、请求与响应、session使用、闪现功能(flash)

今日内容概要

  • flask 配置文件
  • flask 路由系统
  • flask模板语法
  • 请求与相应
  • session
  • 闪现(flash翻译过来的)

内容详细

1、flask 配置文件

# django ---》settings.py

# flask --->支持很多方式
# flask默认主要的一些配置(了解:是否是调试模式,秘钥,cookie的可以值,过期时间),自己的配置(mysql,redis。。)

{
        'DEBUG':                                get_debug_flag(default=False),  是否开启Debug模式
        'TESTING':                              False,                          是否开启测试模式
        'PROPAGATE_EXCEPTIONS':                 None,                          
        'PRESERVE_CONTEXT_ON_EXCEPTION':        None,
        'SECRET_KEY':                           None,
        'PERMANENT_SESSION_LIFETIME':           timedelta(days=31),
        'USE_X_SENDFILE':                       False,
        'LOGGER_NAME':                          None,
        'LOGGER_HANDLER_POLICY':               'always',
        'SERVER_NAME':                          None,
        'APPLICATION_ROOT':                     None,
        'SESSION_COOKIE_NAME':                  'session',
        'SESSION_COOKIE_DOMAIN':                None,
        'SESSION_COOKIE_PATH':                  None,
        'SESSION_COOKIE_HTTPONLY':              True,
        'SESSION_COOKIE_SECURE':                False,
        'SESSION_REFRESH_EACH_REQUEST':         True,
        'MAX_CONTENT_LENGTH':                   None,
        'SEND_FILE_MAX_AGE_DEFAULT':            timedelta(hours=12),
        'TRAP_BAD_REQUEST_ERRORS':              False,
        'TRAP_HTTP_EXCEPTIONS':                 False,
        'EXPLAIN_TEMPLATE_LOADING':             False,
        'PREFERRED_URL_SCHEME':                 'http',
        'JSON_AS_ASCII':                        True,
        'JSON_SORT_KEYS':                       True,
        'JSONIFY_PRETTYPRINT_REGULAR':          True,
        'JSONIFY_MIMETYPE':                     'application/json',
        'TEMPLATES_AUTO_RELOAD':                None,
    }


# 使用方式
	加载和使用配置
from flask import Flask, jsonify

app = Flask(__name__)

### 配置文件配置方式:
# # 方式一:直接配置--->能够配的参数少
app.secret_key = 'asdfasdf'
app.debug = True  # 修改了代码,只需要保存,自动热加载


# # 方式二:通过app.config字典,配置,这个字典中放了所有的配置
# print('---', app.config)
# app.debug = True
# print(app.config)
# app.config['DEBUG'] = False  # 都要大写
# app.config['MYSQL_HOST'] = '127.0.0.1'

# # 方式三:通过settings.py 配置文件--->用得少,django的方式 创建settings.py文件
# app.config.from_pyfile("settings.py")
# print(app.config)

# # 方式四:多套配置文件:开发环境,测试环境,线上环境 ,配置有差别
# app.config.from_object("settings.DevelopmentConfig")
# app.config.from_object("settings.ProductionConfig")
# print(app.config)

# 方式五:服务(项目)多了,配置文件多了---》配置中心 nacos 阿波罗
# m = {}
# m = request.get('ssss')
# app.config.from_mapping(m)

@app.route('/')
def index():
    # 面试题:你知道的http的请求头和响应头?
    '''
    referer,user-agent,content-type,cookie-->Connection: keep-alive,X-Forwarded-For
    http协议版本号:0.9版本,1.1 版本,2.0版本早就出了
    http基于socket---》应用层协议---》osi7层, 5层,tcp/ip 4层--》socket 抽象层--》网络和传输层
    三次握手四次挥手,每次发送http,都会三次握手四次挥手-->性能不高
    多次http请求共用一个socket连接
    2.0 多路复用  socket流式协议
    content-type,cookie,
    '''
    # 前端返回内容:
    # 方式 1 :相应头中,响应编码方式为 application/json
    return jsonify({'name': "lqz", 'age': 19})

    # 方式 2 :
    # res = {'name': "lqz", 'age': 18}
    # import json
    # res = json.dumps(res)
    # return res


if __name__ == '__main__':
    app.run()

settings.py:

# 配置文件方式三
# DEBUG=True
# MYSQL_HOST='127.0.0.1'

# 配置文件方式四
class Config(object):
    DEBUG = False
    MYSQL_HOST = '127.0.0.1'
    MYSQL_POET = '3306'


class ProductionConfig(Config):  # 上线阶段
    MYSQL_HOST = '184.124.22.12'
    MYSQL_POET = '3306'


class DevelopmentConfig(Config):  # 测试阶段
    DEBUG = True


class TestingConfig(Config):
    TESTING = True

2、flask 路由系统

2.1 路由本质

# 你在什么地方用了装饰器,怎么用的---》登陆认证装饰器---》日志装饰器,只要执行这个函数就记录日志

# django的路由 urls.py中---》flask中路由基于装饰器

# 注册路由两种方式
	1 装饰器
    
	2 app.add_url_rule('/',view_func=index)  

2.2 cbv写法

# cbv
# 如果继承的是View,需要重写dispatch
# 如果继承的是MethodView,只需要写get,post。。方法即可
class HomeView(MethodView):
    def get(self):
        print(request.path)
        return 'cbv的homeview'


# 添加路由
# name 是路由别名,跟endpoint一个作用,但是cbv必须传name
app.add_url_rule('/home', view_func=HomeView.as_view(name='home'))

2.3 路由的参数

# app.add_url_rule的参数
'''
1 rule, URL规则,  可以使用转换器 <int:pk>

2 endpoint, 当前路由的别名,如果不传, 默认已函数名作为endpoint,如果函数名重名,就会有两个重名的地址,报错,主要用来反向解析
# endpoint = None, 名称,用于反向生成URL,即: url_for('名称')
# 多个视图函数,如果加同一个装饰器,如果不写endpoint,就会报错 
 
3 view_func, 视图函数名称 如果是cbv  视图类.as_view(name='xx')

4 defaults = None, 默认值, 当URL中无参数,函数需要参数时,使用defaults = {'k': 'v'}
为函数提供参数,就是django中的kwargs

5 methods = None, 允许的请求方式,如:["GET", "POST"]

6 strict_slashes = None
对URL最后的 / 符号是否严格要求

7 redirect_to = None,   redirect_to='/home'
#重定向到指定地址

8 子域名访问
subdomain = None, 
'''

image

3、flask模板语法

# 原来dtl中学的,拿过来,无缝衔接---》flask的模板语法支持 (),[] 等

# 渲染变量 ---》比dtl多支持允许 () []

# for循环一样
# if判断,一样

# Markup等价django的mark_safe ,

# extends, include一模一样
from flask import Flask, render_template, Markup

from flask.views import View, MethodView

app = Flask(__name__)

app.secret_key = 'asdfasdf'
app.debug = True


def test(a, b):
    return a + b


def func1(arg):  # Jinja处理了xss攻击,让字符串显示成标签的样子。Markup
    return Markup("<input type='text' value='%s' />" % (arg,))


@app.route('/')
def index():
    return render_template('index.html', name='lqz', test=test, safe=func1)


if __name__ == '__main__':
    app.run()

templates/index.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>

<body>
<p>{{name}}</p>
<p>{{test(5,6)}}</p>
<p>{{safe('lqz')}}</p>
</body>
</html>

image

4、请求与相应

4.1 请求

@app.route('/request', methods=['GET', "POST"])
def test_request():
    # http请求中有的东西,都能取出来
    print(request.method)
    # request.method  提交的方法

    # request.args  get请求提及的数据
    print(request.args)

    # request.form   post请求提交的数据
    print(request.form)

    # request.values  post和get提交的数据总和
    print(request.values)

    # request.cookies  客户端所带的cookie
    print(request.cookies)

    # request.headers  请求头
    print(request.headers)

    # request.path     不带域名,请求路径
    print(request.path)

    # request.full_path  不带域名,带参数的请求路径
    print(request.full_path)

    # request.url           带域名带参数的请求路径
    print(request.url)

    # request.base_url		带域名请求路径
    # request.url_root      域名
    # request.host_url		域名
    # request.host			127.0.0.1:500
    print(request.host)
    # 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
    return "内容"

4.2 响应

@app.route('/test_response')
def test_response():
    # 1、 4件套
    # return "字符串"
    # return render_template('html模板路径',**{})
    # return redirect('/index.html')
    # return jsonify({'k1':'v1'})

    # 响应头中加东西,四件套都可以使用make_response包裹成响应对象,等同于django中的HTTPResponse
    # res=make_response('字符串')
    # res.headers['name']='lqz'
    # return res

    # 2、 设置cookie
    response = make_response('字符串')
    response.set_cookie('key', 'value')
    return response

5、session

# cookie  session token

# session是存在于服务端的键值对---》django中的session默认存在数据库的django_session表
	request.SESSION['name']='lqz'
    
### 在django中发什么三件事--->响应走,在中间件的process_response中写的
	1. 生成一个随机的字符串   sdfads 
	2. 往数据库存表  
		id	key	content	expire
		1	sdfads	数据内容(加密)	过期时间 
        
	3. 写入cookie返回浏览器
		response.set_cookie('sessionid',sdfads)
        
	# 请求来了---》process_request中执行了
	1. 根据sessionid取出随机字符串
	2. 根据随机字符串去数据库查出content数据,解密
	3. 赋值个请求对象request.SESSION
	4. 你在视图函数中才能正常使用request.SESSION['name']取值,赋值,删除值
    
   

### 任何web框讲的session原理都是这个
### flask中使用session
	设置值:session['login']=True
	取值:session['login']

	# flask中session原理
	#flask流程,写入session流程
	1 把sesion对象,当字典 转成字符串,使用秘钥加密 
		val = self.get_signing_serializer(app).dumps(dict(session))
	2 写入cookie返回浏览器 session=加密的字符串
	response.set_cookie(
		app.session_cookie_name,
		val, # 加密字符串 
	)
    
	# 请求来了流程
	1 根据sessionid取出加密字符串
		val = request.cookies.get(app.session_cookie_name)
	2 通过秘钥解密,组装成 session
		data = s.loads(val, max_age=max_age)
		self.session_class(data)
	3 你在视图函数中才能正常使用session['name']取值,赋值,删除值
  
  
	# 源码分析
	处理session,有个一个类SecureCookieSessionInterface(),有俩重要方法 
	open_session:请求来了执行
		1 根据sessionid取出加密字符串
			val = request.cookies.get(app.session_cookie_name)
		2 通过秘钥解密,组装成 session
			data = s.loads(val, max_age=max_age)
			self.session_class(data)
		3 你在视图函数中才能正常使用session['name']取值,赋值,删除值
      
	save_session:请求走了执行
		1 把sesion对象,当字典 转成字符串,使用秘钥加密 
			val = self.get_signing_serializer(app).dumps(dict(session))
		2 写入cookie返回浏览器 session=加密的字符串
		response.set_cookie(
			app.session_cookie_name,
			val, # 加密字符串 
		)
    
 # 自定义一个类 SecureCookieSessionInterface,重写open_session和save_session,把session存到数据库,redis里----》flask-session 模块做的:数据库,redis,文件中

6、闪现(flash翻译过来的)

# 在多次请求中,第一次请求放一个值,第二次请求取出这个值,取完就没有了

# django中有吗?  
	有 没有学---》消息框架,message ,django默认自带的app,message的app

# 实际用途
	a页面出了错,重定向到b页面,b页面要把错误信息显示
  
# 本质:
	如果在同一次请求中,放到request对象中即可
	如果在不同请求中,放到session中,所以使用闪现一定配置秘钥

# 使用
设置:flash('诱惑美女')
获取:res=get_flashed_messages()

# 高级使用  按分类设置和获取
设置:
	flash('诱惑美女',category='man')
	flash('诱惑帅哥',category='wonmen')
获取:
	res = get_flashed_messages(with_categories=True,category_filter=["man"])
from flask import Flask, flash, get_flashed_messages

app = Flask(__name__)
app.debug = True
app.secret_key = 'adsfasfasd'


# http://127.0.0.1:5000/set_flash
@app.route('/set_flash')
def set_flash():
    flash('诱惑美女')
    return "设置成功"


# http://127.0.0.1:5000/get_flash
@app.route('/get_flash')
def get_flash():
    res = get_flashed_messages()
    print(res)
    return "获取成功"


if __name__ == '__main__':
    app.run()

image

posted @ 2022-05-14 14:27  Deity_JGX  阅读(285)  评论(0编辑  收藏  举报