flask问题点

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

猜你喜欢

转载自blog.csdn.net/weixin_42149982/article/details/86604318