flask配置文件、路由设置、模板语法、请求与响应、session使用、闪现功能(flash)
2022-05-14 14:27
501 查看
今日内容概要
- 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, '''
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>
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()
相关文章推荐
- Python Flask学习_使用Jinja2模板响应请求
- 转--只有在配置文件或 Page 指令中将 enableSessionState 设置为 true 时,才能使用会话状态。还请确保在应用程序配置的 // 节中包括 System.Web.SessionStateMod 或自定义会话状态模块
- 只有在配置文件或 Page 指令中将 enableSessionState 设置为 true 时,才能使用会话状态。还请确保在应用程序配置的 // 节中包括..
- 只有在配置文件或 Page 指令中将 enableSessionState 设置为 true 时,才能使用会话状态等错误解决方法(原)
- 只有在配置文件或 Page 指令中将 enableSessionState 设置为 true 时,才能使用会话状态。还请确保...
- 在做了 BasePage 时: 只有在配置文件或 Page 指令中将 enableSessionState 设置为 true 时,才能使用会话状态。还请确保在应用程序配置的 / / 节中包括
- 只有在配置文件或 Page 指令中将 enableSessionState 设置为 true 时,才能使用会话状态。还请确保在应用程序配置的 // 节中包括 System.Web.SessionSta
- 只有在配置文件或 Page 指令中将 enableSessionState 设置为 true 时,才能使用会话状态。还请确保在应用程序配置的 // 节中包括 System.Web.SessionStateMod 或自定义会话状态模块 -
- 只有在配置文件或 Page 指令中将 enableSessionState 设置为 true 时,才能使用会话状态。
- 有在配置文件或 Page 指令中将 enableSessionState 设置为 true 时,才能使用会话状态。还请确保在应用程序配置的 <configuration>\<system.web>\<
- 只有在配置文件或 Page 指令中将 enableSessionState 设置为 true 时,才能使用会话状态。还请确保在应用程序配置的 / / 节中包括 .
- 只有在配置文件或 Page 指令中将 enableSessionState 设置为 true 时,才能使用会话状态。还请确保在应用程序配置的 <configuration>\<system.web>\
- c# Session 只有在配置文件或 Page 指令中将 enableSessionState 设置为 true 时,才能使用会话状态。
- 只有在配置文件或 Page 指令中将 enableSessionState 设置为 true 时,才能使用会话状态。还请确保在应用程序配置的 // 节中包括 System.Web.SessionSta
- Flask初级(四)flash在模板中使用静态文件
- IIS部署ASP.NET网站后提示只有在配置文件或 Page 指令中将 enableSessionState 设置为 true 时,才能使用会话状态...
- 只有在配置文件或 Page 指令中将 enableSessionState 设置为 true 时,才能使用会话状态。还请确保在应用程序配置的 <configuration>\<system.web>\<httpModules> 节中包括..
- 只有在配置文件或 Page 指令中将 enableSessionState 设置为 true 时,才能使用会话状态。还请确保在应用程序配置的 // 节中包括 System.Web.SessionStateMod 或自定义会话状态模块 -
- 2010-08-31 只有在配置文件或 Page 指令中将 enableSessionState 设置为 true 时,才能使用会话状态
- 只有在配置文件或 Page 指令中将 enableSessionState 设置为 true 时,才能使用会话状态。还请确保在应用程序配置的 \\ 节中包括 System.Web.SessionStateMod 或自定义会话状态模块