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 = ['15821520539@163.com','52440918@qq.com'] sender = '52440918@qq.com' # 发件人邮箱的SMTP服务器(即sender的SMTP服务器) smtpserver = 'smtp.qq.com' # 发件人邮箱的用户名和授权码(不是登陆邮箱的密码) username = '52440918@qq.com' 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