文章目录
flask框架
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'Hello Falsk'
if __name__ == '__main__':
app.run()
Flask类的参数
import_name: Flask程序所在的包,使用"__name__“即可
static_folder: 静态文件夹,默认为"static”
template_folder: 模板文件夹,默认为"templates"
app的配置加载
- 对象加载
- 文件加载(.ini)
- 环境变量加载
# 对象加载方式
class Config(object):
DEBUG = True
app = Flask(__name__)
app.config.from_object(Config)
# 文件加载方式
app.config.from_pyfile('../.../xxx.ini')
# 环境变量加载方式
# 需要预先设置环境变量(FLASKCFG)对应的配置文件地址
app.config.from_envvar('FLASKCFG')
获取配置
# app.config是个字典
app.config.get()
current_app.config.get()
app.run()的参数
# host设置为'0.0.0.0', 来作为外部可访问的服务器
# debug=True, 则修改代码后自动reload
app.run(host='0.0.0.0', port='5555', debug=True)
Manager
- Flask服务器启动的时候,通过 命令行 的方式传入参数
from flask_script import Manager
# 关联manager和app
manager = Manager(app)
if __name__ == '__main__':
manager.run()
##########################################
python hello.py runserver -d
路由
利用装饰器实现
指定请求方式
@app.route('/user', methods=['GET', 'POST'])
def user_info():
if request.method == 'GET':
return 'GET'
return 'POST'
路由传参
@app.route('/user/<int:user_id>')
def user_info(user_id):
return 'userid:{:}'.format(user_id)
正则匹配路由
app.url_map.converters['re'] = ReConverter
@app.route('/mobile/<re("1[3456789]\d{9}"):mobile>')
def mobile(mobile):
return 'mobile:{:}'.format(mobile)
# 定义正则匹配类
from werkzeug.routing import BaseConverter
class ReConverter(BaseConverter):
def __init__(self, url_map, *args):
super().__init__(url_map)
self.regex = args[0] # args[0]就是正则表达式
特殊对象
request对象
from flask import request
# 获取get请求的参数
user = request.args.get('user')
response对象
# 通过response对象添加返回头信息, 或者自定义返回状态码
@app.route('/resp')
def test_resp():
resp = make_response('login')
resp.status = '400 fail'
resp.headers['city'] = 'beijing'
return resp
cookie对象
- 存储 不那么敏感 的数据,如网站的浏览足迹。
- 由服务端生成,在浏览器端以 纯文本形式 存储存储。
- 当浏览器请求某网站时,会将本网站下所有Cookie信息提交给服务器,所以在request中可以读取Cookie信息
response.set_cookie('name', 'zs', max_age=3600)
request.cookies.get('name')
session对象
- 存储 敏感重要 的数据,如余额、验证码等。
- 在服务端进行状态保持。
from flask import session
session['name'] = user.id # 记录用户信息
session.get('name') # 获取用户信息
记得设置secret_key: app.secret_key = ‘xxxx’
应用上下文对象
from flask import current_app, g
print(current_app) # 存储应用程序中的变量,如配置信息等
print(g) # 当前请求的全局变量,通过它可以传递一些数据
特殊方法
redirect()重定向方法
# url_for通过视图函数反查url, 可拼接参数
# redirect重定向到url对应的视图函数去执行
from werkzeug.utils import redirect
@app.route('/redirect')
def test_redirect():
# return redirect('https://learn.kaikeba.com/')
return redirect(url_for('user', user_id=111))
jsonify()字典转json方法
# 中文显示需配置 JSON_AS_ASCII = False
@app.route('/json')
def get_json():
json_dict = {
'user_id': 1,
'user_name': 'laowang'
}
# return jsonify(json_dict)
return jsonify(code='200', msg='登录成功')
abort()抛出异常方法
# abort抛出异常状态码
@app.route('/error')
def test_error():
return abort(404)
# 利用装饰器定义状态码对应的处理方法
@app.errorhandler(404)
def hander(e):
return '页面找不到'
请求勾子函数
做一些准备工作以及扫尾工作
# 处理第一个请求前执行
@app.before_first_request
def bfr():
print('before_first_request')
# 在每次请求前执行
# 如果在某被装饰的函数中返回了一个响应,则视图函数将不再被调用
@app.before_request
def br():
print('before_request')
# 如果没有抛出错误,在每次请求后执行
# 接收来自视图函数作出的响应response,进一步处理后返回response
@app.after_request
def ar(response):
print('after_request')
return response
# 在每次请求之后执行
# 接收一个参数:错误信息,如果有错误抛出
@app.teardown_request
def tr(e):
print('teardown_request')
模板
from flask import render_template
render_template('html/index.html', data={'date': '2021-08-23', 'api': 'album'})
代码块
{{ data.date }} # 变量代码块
<a href="{{ url_for('index') }}" class="{% if data.api=='index' %}active{% endif %}">文章</a> # 控制代码块
{# ... #} # 注释代码块
过滤器
字符串过滤器
- safe:禁用转义
- capitalize:把变量值的 首字母转成大写,其余字母转小写
- lower:把值转成小写
- upper:把值转成大写
- title:把值中的 每个单词 的首字母都转成大写
- reverse:字符串反转
- format:格式化输出
- striptags:渲染之前把值中所有的 HTML标签都删掉
列表过滤器
- first:取第一个元素
- last:取最后一个元素
- length:获取列表长度
- sum:列表求和
- sort:列表排序
自定义过滤器
# 自定义过滤器
@app.template_filter('title_last')
def title2(string):
newString = ''
for word in string.split():
newString += word[:-1]
newString += word[-1].upper()
newString += ' '
newString = newString[:-1]
return newString
###########################################################
<p class="text">{{ data.welcome | title_last }}</p>
模板继承
# 1.在父模板base.html中挖坑
{% block content %}
待填充部分
{% endblock %}
########################################################
# 2.子模版继承后,填充父模板挖坑部分
{% extends 'base.html' %}
{% block content %}
需要填充的内容
{% endblock content %}
表单
数据库
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy(app)
定义数据模型
class User(db.Model):
__tablename__ = 'user'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(64), unique=True)
password = db.Column(db.String(64))
插入数据
if __name__ == '__main__':
db.create_all() # 一定要先创建表结构
user1 = User(name='zs', password='123')
user2 = User(name='李四', password='1234')
db.session.add_all([user1, user2])
db.session.commit()
app.run(host='0.0.0.0', port='5555', debug=True)