1.flask异步任务
# 注意点,与SQLALchemy连用,对数据库进行操作时,会出现问题,建议使用源生的sql语句
from flask import Flask
from time import sleep
from concurrent.futures import ThreadPoolExecutor
# DOCS https://docs.python.org/3/library/concurrent.futures.html#concurrent.futures.ThreadPoolExecutor
executor = ThreadPoolExecutor(2)
app = Flask(__name__)
@app.route('/jobs')
def run_jobs():
executor.submit(some_long_task1)
executor.submit(some_long_task2, 'hello', 123)
return 'Two jobs was launched in background!'
def some_long_task1():
print("Task #1 started!")
sleep(10)
print("Task #1 is done!")
def some_long_task2(arg1, arg2):
print("Task #2 started with args: %s %s!" % (arg1, arg2))
sleep(5)
print("Task #2 is done!")
if __name__ == '__main__':
app.run()
1.2 celery异步任务
# url: https://blog.csdn.net/weixin_40612082/article/details/81149592
2.flask跨域请求解决方法
# 下载flask_cors包
pip install flask-cors
# 使用flask_cors的CORS,代码示例
from flask_cors import CORS
app = Flask(__name__)
CORS(app, supports_credentials=True)
3.flask里面不要用协程,用线程
# 因为用了协程,必须导入monkey.patch_all(),这样才能识别耗时任务,但是这样的话,会导致别的地方出现问题,例如,debug都不能使用了,必须使用线程
4.flask-migrate 更改表字段类型、字段长度
找到migrations/env.py文件,在run_migrations_online函数加入如下内容:
context.configure(
…………
compare_type=True, # 检查字段类型
compare_server_default=True # 比较默认值
)
5.flask中的session用法
from flask import Flask,session
from flask_session import Session
import os
app = Flask(__name__)
app.config['SESSION_TYPE'] = 'filesystem' # 即表示session储存的地方
app.config['SECRET_KEY'] = os.urandom(24)
Session(app)
# config.py 设置session配置信息 配置文件
SESSION_TYPE = 'redis' # 保存类型
SESSION_USE_SIGNER = True # 签名存储
SESSION_REDIS = redis.StrictRedis(host=REDIS_HOST, port=REDIS_PORT)
PERMANENT_SESSION_LIFETIME = 3600 * 24 * 2 # 设置存储时间为2天,单位秒
6.flask发送邮件
import smtplib
from email.mime.text import MIMEText
from email.header import Header
# 收件人和发件人
receiver = ['[email protected]','[email protected]']
sender = '[email protected]'
# 发件人邮箱的SMTP服务器(即sender的SMTP服务器)
smtpserver = 'smtp.qq.com'
# 发件人邮箱的用户名和授权码(不是登陆邮箱的密码)
username = '[email protected]'
password = 'szaoltttsttnbjid' # (邮箱的授权码)
mail_title = '我是谁' # 邮件标题
mail_body = '你好呀' # 邮件内容
# 创建一个实例
message = MIMEText(mail_body, 'plain', 'utf-8') # 邮件正文
# (plain表示mail_body的内容直接显示,也可以用text,则mail_body的内容在正文中以文本的形式显示,需要下载)
message['From'] = sender # 邮件上显示的发件人
message['To'] = str(receiver) # 邮件上显示的收件人
message['Subject'] = Header(mail_title, 'utf-8') # 邮件主题
smtp = smtplib.SMTP() # 创建一个连接
smtp.connect(smtpserver) # 连接发送邮件的服务器
smtp.ehlo()
smtp.starttls()
smtp.login(username, password) # 登录服务器
smtp.sendmail(sender, receiver, message.as_string()) # 填入邮件的相关信息并发送
smtp.quit()
7.1.Flask + WSGI + Nginx部署(虚拟环境)
# https://blog.csdn.net/grean2015/article/details/78192763
# 安装虚拟环境 https://blog.csdn.net/haeasringnar/article/details/80078529
a.安装虚拟环境的命令 :
sudo pip3 install virtualenv
sudo pip3 install virtualenvwrapper
b.安装完虚拟环境后,如果提示找不到mkvirtualenv命令,须配置环境变量:
# 1、创建目录用来存放虚拟环境
mkdir $HOME/.virtualenvs
# 查找
find / -name virtualenv
find / -name virtualenvwrapper.sh
# 在给virtualenv创建软连接
ln -s /usr/local/python3.6/bin/virtualenv /usr/bin/virtualenv
# 2、打开~/.bashrc文件,并添加如下:
# 指定虚拟环境路径
export WORKON_HOME=$HOME/.virtualenvs
export PROJECT_HOME=$HOME/workspace
source /usr/local/python3.6/bin/virtualenvwrapper.sh # 查到virtualenvwrapper.sh 的路径
# 3、运行
source ~/.bashrc
指定安装python3.x
mkvirtualenv -p python3 虚拟环境名称
4.退出,进入虚拟环境
deactivate 虚拟环境
workon 虚拟环境名称
# 桌面上压缩文件夹
yum install l
虚拟机安装
yum install zip # 压缩
yum install unzip # 解压
# uWSGI 项目目录下创建一个 confg.ini
vim config.ini
[uwsgi]
http = 0.0.0.0:8604
# uwsgi 启动时所使用的地址与端口 这个是与nginx关联的
socket = 127.0.0.1:8001
# 指向网站目录
chdir = /root/CephMontior2
# python 启动程序文件
wsgi-file = manage.py
# python 程序内用以启动的 application 变量名
callable = app
# 处理器数
processes = 4
# 线程数
threads = 2
#状态检测地址
stats = 127.0.0.1:9191
# Negix
sudo yum install nginx
# 配置Negix
Ubuntu 上配置 Nginx 也是很简单,不要去改动默认的 nginx.conf 只需要将
/etc/nginx
文件替换掉就可以了。
新建一个 default 文件:
server {
listen 80;
server_name XXX.XXX.XXX; #公网地址 访问的ip
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8001; # 主要的 指向uwsgi 所应用的内部地址,所有请求将转发给uwsgi 处理
# uwsgi_param UWSGI_PYHOME /home/www/my_flask/venv; # 指向虚拟环境目录
# uwsgi_param UWSGI_CHDIR /home/www/my_flask; # 指向网站根目录
#uwsgi_param UWSGI_SCRIPT manage:app; # 指定启动程序
}
}
将default配置文件替换掉就大功告成了!
还有,更改配置还需要记得重启一下nginx:
sudo service nginx restart
# 查看nginx的状态
nginx
# 启动
systemctl restart nginx
# 停止
nginx -s stop
7.2 Flask + WSGI + Nginx部署(虚拟环境)
# 配置uwsgi
将项目文件移动到/opt目录下并解压
tar -zxvf CephMonitor2.tar.gz
在/opt/uwsgi下创建文件uwsgi.ini:
[uwsgi]
chdir =/opt/CephMonitor2 # 指定项目名的路径
callable=app # 指定app
wsgi-file = manage.py # 指定启动文件
process = 3 # 进程数
http = 0.0.0.0:8080 # nginx的端口和这个保持一致
daemonize = /var/log/flask.log # 这个可以不设置
# 编译安装nginx及依赖
1) tar -zxvf openssl-fips-2.0.10.tar.gz
cd openssl-fips-2.0.10./config
&& make && make install
2) tar -zxvf pcre-8.40.tar.gz
cd pcre-8.40./configure
&& make && make install
3) tar -zxvf zlib-1.2.11.tar.gz
cd zlib-1.2.11./configure
&& make && make install
4) tar -zxvf nginx-1.10.2.tar.gz
cd nginx-1.10.2./configure
&& make && make install
# 配置nginx配置文件:
vi /usr/local/nginx/conf/nginx.conf
修改server项下内容
server_name 84.11.94.1 # [IP为本机IP]
location / {
uwsgi_pass 127.0.0.1:8080; # 此项的端口需要与uwsgi.ini中http项端口配置一致
}
8.flask+geventwebsocket
# 后端代码
from geventwebsocket.handler import WebSocketHandler
from gevent.pywsgi import WSGIServer
from flask import Flask, render_template, request
app = Flask(__name__)
app.config['SECRET_KEY'] = 'DFSAFSDFSDF'
@app.route("/")
def show_index():
return render_template("index.html")
WS_LIST = []
@app.route('/test')
def test():
ws = request.environ.get('wsgi.websocket')
if not ws:
return '请使用WebSocket协议'
# websocket连接已经成功
WS_LIST.append(ws)
while True:
# 等待用户发送消息,并接受
message = ws.receive()
# 关闭:message=None
if not message:
print("ws.close")
WS_LIST.remove(ws)
ws.close()
break
for item in WS_LIST:
item.send(message)
return "asdfasdf"
if __name__ == '__main__':
http_server = WSGIServer(('127.0.0.1', 5000,), app, handler_class=WebSocketHandler)
http_server.serve_forever()
9.类视图
from flask import Flask, request
from flask.views import View
app = Flask(__name__)
app.config["SECRET_KEY"] = "SFSDFDS"
class Index(View):
def __init__(self):
self.name = "zs"
def dispatch_request(self): # 继承View类,只能重写该方法
name = request.args.get("name")
return name
class Hello(MethodView): # 继承MethodView类,可以重写请求方法的方法
def get(self):
return "get"
def post(self):
return "post"
# 添加匹配的url规则
app.add_url_rule("/", view_func=Index.as_view("index"))
app.add_url_rule("/hello", view_func=Hello.as_view("hello"))
if __name__ == '__main__':
app.run(debug=True)
10.域名访问flask项目
11.flask里的配置
# 设置基础配置类
class Config(object):
# 设置启动模式,秘钥
DEBUG = True
SECRET_KEY = "jfkdjfkdk"
# 数据库配置
SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:123456@localhost:3306/information14"
SQLALCHEMY_TRACK_MODIFICATIONS = False
SQLALCHEMY_COMMIT_ON_TEARDOWN = True # 当数据库操作完成,自动提交
# redis配置
REDIS_HOST = '127.0.0.1'
REDIS_PORT = 6379
# 设置session配置信息
SESSION_TYPE = 'redis' # 保存类型
SESSION_USE_SIGNER = True # 签名存储
SESSION_REDIS = redis.StrictRedis(host=REDIS_HOST, port=REDIS_PORT)
PERMANENT_SESSION_LIFETIME = 3600 * 24 * 2 # 设置存储时间为2天,单位秒
# 设置默认日志级别
LEVEL = logging.DEBUG
12.flask单线程传输流媒体阻塞
flask默认开发模式为单线程模式,在编辑器在线预览,或是流媒体传输时,都会产生一个问题,就是:获取流媒体时造成服务器阻塞。
为解决这个问题,需要为flask开启多线程模式,只要给app.run加上一个threaded=True参数或者processes=N参数(N改为实际数值)。例如:
if __name__ == '__main__':
app.run(threaded=True) #或者
app.run(processes=3)
参数说明:
threaded 多线程支持,默认不开启
processes 进程数量,默认为1个
如果使用了Flask-Script来部署应用,可以给runserver命令加上–threaded参数或者–processes N参数(参数意义同上)。例如:
python manage.py runserver --threaded
或者:
python manage.py runserver --processes 3