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

#停止gunicorn
systemctl stop gunicorn

caddy

#验证caddy配置文件,后面的路径要根据实际修改
caddy validate --config /etc/caddy/Caddyfile

#重启caddy
systemctl restart caddy