flask基础和安装
安装命令:pip3 install flask
表单验证:pip3 install Flask-WTF
邮件验证:pip3 install email_validator
pip3 install cryptography
pip3 install peewee
pip3 install psycopg2
pip3 install gevent
pip3 install huey
pip3 install pysnowflake #雪花算法
pip3 install requests
pip3 install pycryptodome #福禄解密需要,不然会提示缺少crypto库
最小应用:
from flask import Flask,render_template
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html')
if __name__ == '__main__':
app.run(port=80,debug=True)
常用函数:
abort(404) #可以在返回页面的时候同时返回浏览器能识别的代码
with app.app_context(): #联系上下文
db.create_all()#自动创建表格
db.drop_all() #更新表
目录结构:
/templates #模板文件
模板
python语句和变量:
{% if name %} 必须独占行,开始判断
<h1>{{ name }}</h1> #如果要关闭转义:{{ name|safe }}
{% else %}
<h1>Hello, World!</h1>
{% endif %} #必须要有结尾,结束if
#同样,如果有for 也要有{% endfor %}
模板继承:
主模板layout.html
<!doctype html>
<html>
<head>
<link rel="stylesheet" href="#">
<title>{% block title %}标题{% endblock %}</title>
</head>
<body>
<div id="content">
{% block content %}
内容
{% endblock %}
</div>
<div id="footer">
{% block footer %}
页尾
{% endblock %}
</div>
</body>
</html>
子模板
{% extends "layout.html" %} #申明继承模板
{% block title %}标题{% endblock %}
{% block content %}
这是内容
{% endblock %}
{% block footer %}
这是页尾
{% endblock %}
过滤器函数
{{ jine|float }} #浮点数
{{ name|safe }} #转义
{% for mx in user.yuemxs|sorted(reverse=True, attribute='id') %} #数据库查询倒序根据id
去掉小数无效0,自定义过滤器
# 自定义过滤器:去掉小数后面的无效零
@app.template_filter('rstrip')
def remove_trailing_zeros_filter(value):
# 将 Decimal 转换为字符串
value_str = str(value)
# 去掉小数后面的无效零
if '.' in value_str:
value_str = value_str.rstrip('0').rstrip('.')
return value_str
然后在模板变量中使用{{ dingdanmx.jine|rstrip }} 来去掉无效0
全局模板传递变量参数
@app.context_processor #这个装饰器用来传递全局的模板视图
def inject_languages():
# 可以在这里处理需要传递给模板的数据
LANGUAGES = ['en', 'es', 'fr']
return dict(LANGUAGES=LANGUAGES) #这里将LANGUAGES常量传递给所有模板
#或者直接使用g传递全局变量
from flask import g
g.get('lang_code', None) #获取值
g.lang_code = "cn" #给予值
异常页面
#处理404错误
@app.errorhandler(404)
def errorhandler404(err):
return f'找不到这个页面,错误代码:{err}'
蓝图
可以实现组件化,让逻辑更清晰
这是一个蓝图组件的视图文件app/blueprints/lang/views.py:
from flask import render_template, Blueprint
from app import app
lang = Blueprint('lang', __name__, template_folder='templates') #指定一个蓝图模块,目录为lang,并指定这个蓝图组件默认模板目录为templates
#指定这个蓝图组件的路由
@lang.route('/')
def index():
user = {'username': 'Miguel'}
posts = [
{
'author': {'username': 'John'},
'body': 'Beautiful day in Portland!'
},
{
'author': {'username': 'Susan'},
'body': 'The Avengers movie was so cool!'
}
]
return render_template('index.html', user=user, posts=posts)
而在app/blueprints/lang/ 的init:文件中,我直接将它导入为lang的目录对象
from app.blueprints.lang.views import lang
现在在app目录下有一个__init__.py来实现初始化flask实例:
from flask import Flask
app = Flask(__name__) #在__init__中指定的直接在目录中访问对象
from app.blueprints.lang import lang #导入之前的蓝图组件
app.register_blueprint(lang) #注册蓝图
#一旦app被执行任何被注册的蓝图都将被一起运行
部署
sudo journalctl -u gunicorn.service -r
#检查gunicorn错误信息
#启动gunicorn服务单元,启动前需要确保已经上传好了web程序,并且配置要和web程序的对象对应systemctl start gunicorn
#重启gunicorn服务单元,重启前需要删除主py文件里的run调试systemctl restart gunicorn
#验证服务单元是否正在运行,输出应该会显示“active (running)”绿色状态systemctl status gunicorn
#停止gunicornsystemctl stop gunicorn
caddy
#验证caddy配置文件,后面的路径要根据实际修改caddy validate --config /etc/caddy/Caddyfile
#重启caddysystemctl restart caddy