今日内容概要

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

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

  1. Flask视图函数与模板语法

    1.Django中的CBV模式 ​ 2.Flask中的CBV和FBV def auth(func):     def inner(*args, **kwargs):         result =  ...

  2. flask框架(九): 请求和响应扩展以及中间件

    一:请求响应扩展 # 每一次访问都执行 # 注意请求之前按照顺序执行 # 请求之后按照书写顺序倒序执行 # 请求之前执行 @app.before_request def process_request ...

  3. 第五课 nodejs 路由实现并处理请求作出响应

    1创建一个http Server 文件server.js var http = require('http');var url = require('url');function start(rout ...

  4. flask模板的基本用法(定界符、模板语法、渲染模板),模板辅助工具(上下文、全局对象、过滤器、测试器、模板环境对象)

    flask模板 在动态web程序中,视图函数返回的HTML数据往往需要根据相应的变量(比如查询参数)动态生成. 当HTML代码保存到单独的文件中时,我们没法再使用字符串格式化或拼接字符串的当时在HTM ...

  5. 个人博客开发之 全局配置文件settings设置

    项目源码下载:http://download.vhosts.cn # -*- coding: utf-8 -*- """ Django settings for cpyb ...

  6. Flask(1):基本示例、配置文件、路由、请求和响应、模板渲染

    Flask的特点: - pip install flask - 短小精悍.可扩展性强的 web框架 注意:上下文管理机制 - 依赖 wsgi:werkzeug Flask的简单示例: from fla ...

  7. 第一篇 Flask基础篇之(配置文件,路由系统,模板,请求响应,session&cookie)

    Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后 ...

  8. [Python自学] Flask框架 (1) (Flask介绍、配置、Session、路由、请求和响应、Jinjia2模板语言、视图装饰器)

    oldboy:s9day114 参考博客:https://www.cnblogs.com/wupeiqi/articles/7552008.html 一.Flask简介 1.安装Flask pip i ...

  9. Flask框架(二)—— 反向解析、配置信息、路由系统、模板、请求响应、闪现、session

    Flask框架(二)—— 反向解析.配置信息.路由系统.模板.请求响应.闪现.session 目录 反向解析.配置信息.路由系统.模板.请求响应.闪现.session 一.反向解析 1.什么是反向解析 ...

随机推荐

  1. 常见算法的时间复杂度(大O计数法)

    定义 ​ 对于不同的机器环境而言,确切的单位时间是不同的,但是对于算法进行多少个基本操作(即花费多少时间单位)在规模数量级上却是相同的,由此可以忽略机器环境的影响而客观的反应算法的时间效率. 对于算法 ...

  2. 《手把手教你》系列基础篇(八十四)-java+ selenium自动化测试-框架设计基础-TestNG日志-上篇(详解教程)

    1.简介 TestNG还为我们提供了测试的记录功能-日志.例如,在运行测试用例期间,用户希望在控制台中记录一些信息.信息可以是任何细节取决于目的.牢记我们正在使用Selenium进行测试,我们需要有助 ...

  3. html5文件上传断点续传

    最近公司要做一个html5上传的jquery插件,要在下先实现功能,要求显示上传进度,文件信息,断点续传等等.我一看,艾玛!Σ(゚д゚lll),没做过啊.没办法,(# ゚Д゚),只能去查资料了.作为一 ...

  4. 用Node处理文件上传

    前言 在Web开发中,文件上传是一个非常常见.非常重要的功能.本文将介绍如何用Node处理上传的文件. 需求分析 由于现在前后端分离很流行,那么本文也直接采用前后端分离的做法.前端界面如下: 用户从浏 ...

  5. Java/C++实现装饰模式---模拟手机功能的升级过程

    用装饰模式模拟手机功能的升级过程:简单的手机(SimplePhone)在接收来电时,会发出声音提醒主人:而JarPhone除了声音还能振动:更高级的手机(ComplexPhone)除了声音.振动外,还 ...

  6. 从零搭建react开发环境

    早在六年前,前端开发已经实现了模块化.工程化开发,既然是模块化工程化开发那就少不了包管理工具,所以我们的第一步就是先从安装nodejs开始(安装nodejs携带JavaScript的包管理工具npm) ...

  7. Vue脚手架结构及vue-router路由配置

    首先官网介绍,用 Vue.js + vue-router 创建单页应用,是非常简单的.使用 Vue.js ,我们已经可以通过组合组件来组成应用程序,当你要把 vue-router 添加进来,我们需要做 ...

  8. EMS修改邮箱容量限制的方法

    使用PowerShell命令完成邮箱数据库限制任务. 以Exchange管理员身份打开EMS控制台.在PowerShell命令提示符下,键入如下命令. Set-MailboxDatabase Test ...

  9. Java基础之浅谈接口

    前言 前几篇文章我们已经把Java的封装.继承.多态学习完了,现在我们开始比较便于我们实际操作的学习,虽然它也是Java基础部分,但是其实入门容易,精通很难. 我认真的给大家整理了一下这些必须学会.了 ...

  10. PyQt5 基本语法(五)

    目录 2. 输入控件(二) 2.2 步长调节 2.2.1 QAbstractSpinBox 2.2.1.1 描述 2.2.1.2 功能作用 2.2.1.2.1 使用 2.2.1.2.2 主要功能 2. ...