Flask框架
1. Flask 中正则 URL 的实现?
app.route(‘
第一步:写正则类,继承 BaseConverter,将匹配到的值设置为 regex 的值。
1. class RegexUrl(BaseConverter):
2. def __init__(self, url_map, *args):
3. super(RegexUrl, self).__init__(url_map)
4. self.regex = args[0]
第二步:把正则类赋值给我们定义的正则规则。
5. app.url_map.converters['re'] = RegexUrl
第三步:在 URL 中使用正则。
6. @app.route('/regex/<re("[a-z]{3}"):id>')
7. def regex111(id):
8. return 'id:%s'%id
2. Flask 中请求上下文和应用上下文的区别和作用?
current_app、g 是应用上下文。
request、session 是请求上下文。
手动创建上下文的两种方法:
1. with app.app_context()
2. app = current_app._get_current_object()
两者区别:
请求上下文:保存了客户端和服务器交互的数据。
应用上下文:flask 应用程序运行过程中,保存的一些配置信息,比如程序名、数据库连接、应用信息等。
两者作用:
请求上下文(request context):
Flask从客户端收到请求时,要让视图函数能访问一些对象,这样才能处理请求。请求对象是一个很好的例子,它封装了客户端发送的HTTP请求。
要想让视图函数能够访问请求对象,一个显而易见的方式是将其作为参数传入视图函数,不过这会导致程序中的每个视图函数都增加一个参数,除了访问请求对象,如果视图函数在处理请求时还要访问其他对象,情况会变得更糟。为了避免大量可有可无的参数把视图函数弄得一团糟,
Flask使用上下文临时把某些对象变为全局可访问。
应用上下文(application context):
它的字面意思是 应用上下文,但它不是一直存在的,它只是request context 中的一个对 app 的代理(人),所谓local proxy。它的作用主要是帮助 request 获取当前的应用,它是伴 request 而生,随 request 而灭的。
3. Flask中数据库设置?
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:mysql@127.0.0.1:3306/test'
动态追踪修改设置,如未设置只会提示警告
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
查询时会显示原始SQL语句
app.config['SQLALCHEMY_ECHO'] = True
4. 常用的SQLAlchemy查询过滤器?
5. 对Flask蓝图(Blueprint)的理解?
1) 蓝图的定义
蓝图 /Blueprint 是Flask应用程序组件化的方法,可以在一个应用内或跨越多个项目共用蓝图。
使用蓝图可以极大地简化大型应用的开发难度,也为 Flask扩展 提供了一种在应用中注册服务的集中式机制。
2) 蓝图的应用场景
- 把一个应用分解为一个蓝图的集合。这对大型应用是理想的。一个项目可以实例化一个应用对象,初始化几个扩展,并注册一集合的蓝图。
- 以 URL 前缀和/或子域名,在应用上注册一个蓝图。 URL 前缀/子域名中的参数即成为这个蓝图下的所有视图函数的共同的视图参数(默认情况下)。
- 在一个应用中用不同的 URL 规则多次注册一个蓝图。
- 通过蓝图提供模板过滤器、静态文件、模板和其它功能。一个蓝图不一定要实现应用或者视图函数。
- 初始化一个 Flask 扩展时,在这些情况中注册一个蓝图。
3) 蓝图的缺点
不能在应用创建后撤销注册一个蓝图而不销毁整个应用对象。
4) 使用蓝图的三个步骤
1.创建 一个蓝图对象
blue = Blueprint("blue",__name__)
2.在这个蓝图对象上进行操作 ,例如注册路由、指定静态文件夹、注册模板过滤器
@blue.route('/')
def blue_index():
return 'Welcome to my blueprint'
3.在应用对象上注册这个蓝图对象
app.register_blueprint(blue,url_prefix='/blue')
字段对象 说明
FieldList 一组指定类型的字段
WTForms常用验证函数
InputRequired 确保字段中有数据
DataRequired 确保字段中有数据并且数据为真
EqualTo 比较两个字段的值,常用于比较两次密码输入
Length 验证输入的字符串长度
NumberRange 验证输入的值在数字范围内
URL 验证URL
AnyOf 验证输入值在可选列表中
NoneOf 验证输入值不在可选列表中
使用Flask-WTF需要配置参数SECRET_KEY。
CSRF_ENABLED是为了CSRF(跨站请求伪造)保护。 SECRET_KEY用来生成加密令牌,当CSRF激活的时候,该设置会根据设置的密匙生成加密令牌。
6. Flask项目中如何实现 session 信息的写入?
Flask中有三个 session:
第一个:数据库中的 session,例如:db.session.add()
第二个:在 flask_session 扩展中的 session,使用:from flask_session importSession,使用第三方扩展的 session 可以把信息存储在服务器中,客户端浏览器中只存储 sessionid。
第三个:flask 自带的 session,是一个请求上下文, 使用:from flask import session。自带的session 把信息加密后都存储在客户端的浏览器 cookie 中。
7. 项目接口实现后路由访问不到怎么办?
1.可以通过 postman 测试工具测试,或者看 log 日志信息找到错误信息的大概位置。
2.断点调试
8. Flask中url_for函数?
1.URL反转:根据视图函数名称得到当前所指向的url。
2.url_for() 函数最简单的用法是以视图函数名作为参数,返回对应的url,还可以用作加载静态文件。
<link rel="stylesheet" href="{{url_for('static',filename='css/index.css')}}">
该条语句就是在模版中加载css静态文件。
3.url_for 和 redirect 区别
url_for是用来拼接 URL 的,可以使用程序 URL 映射中保存的信息生成 URL。url_for() 函数最简单的用法是以视图函数名作为参数, 返回对应的 URL。例如,在示例程序中 hello.py 中调用
url_for(‘index’) 得到的结果是 /。
redirect 是重定向函数,输入一个URL后,自动跳转到另一个URL所在的地址,例如,你在函数
中写 return redirect(‘https://www.baidu.com‘) 页面就会跳转向百度页面。
1. from flask import Flask,redirect,url_for
2. app = Flask(__name__)
3. @app.route('/')
4. def index():
5. login_url = url_for('login')
6. return redirect(login_url)
7. return u'这是首页'
8.
9. @app.route('/login/')
10. def login():
11. return u'这是登陆页面'
12.
13. @app.route('/question/<is_login>/')
14. def question(is_login):
15. if is_login == '1':
16. return u'这是发布问答的页面'
17. else:
18. return redirect(url_for('login'))
19.
20. if __name__ == '__main__':
21. app.run(debug=True)
9. Flask中请求钩子的理解和应用?
请求钩子是通过装饰器的形式实现的,支持以下四种:
1,before_first_request 在处理第一个请求前运行
2,before_request:在每次请求前运行
3,after_request:如果没有未处理的异常抛出,在每次请求后运行
4,teardown_request:即使有未处理的异常抛出,在每次请求后运行
应用:
请求钩子
1. @api.after_request
2. def after_request(response):
3. """设置默认的响应报文格式为 application/json"""
4. # 如果响应报文 response 的 Content-Type 是以 text 开头,则将其改为
5. # 默认的 json 类型
6. if response.headers.get("Content-Type").startswith("text"):
7. response.headers["Content-Type"] = "application/json"
8. return respon
10. 一个变量后写多个过滤器是如何执行的?
{{ expression | filter1 | filter2 | … }} 即表达式(expression)使用filter1 过滤后再将filter1的结果去使用 filter2 过滤。