uwsgi生产环境部署flask项目
项目目录结构
开发调试环境
开发环境中启动的web服务是由flask内置的web服务器来提供的,所以服务启动的时候监听的网卡和端口是在项目中的app.py中进行指定
from flask import Flask,render_template,request,redirect,session from flask import jsonify,abort,json,make_response,send_from_directory,send_file from flask_bootstrap import Bootstrap from main import userhandler from main import msgconfig as m import os from urllib.parse import unquote,quote app = Flask(__name__) bootstrap = Bootstrap(app) @app.route('/index',methods=['GET']) def index(): return send_file("static/pages/sitetable.html") @app.route('/') def main(): return send_file("static/pages/sitetable.html") @app.route('/login',methods=['POST']) def login(): loginame = request.form.get('loginuser') loginpwd = request.form.get('loginpwd') result = userhandler.checkuser(loginame, loginpwd) if result: session['user'] = {'user': loginame} m.loginmsg="" return redirect("/index") m.loginmsg="error" return redirect("/") @app.route('/site',methods=['GET']) def get_sites(): sites = userhandler.get_sitesexcelfile() return jsonify({'sites': sites}) @app.route('/phone/site',methods=['GET']) def get_phonesites(): sites = userhandler.get_sitesyamlfile() return jsonify({'sites': sites}) @app.route('/upload',methods=['POST']) def upload(): f = request.files['file'] userhandler.upload_excelfile(f) return "success" @app.route('/downsite',methods=['GET']) def downtxt(): return send_from_directory('static/files/','sites.xlsx', as_attachment=True) @app.route('/initsites',methods=['POST']) def uploadtxt(): f = request.files.get('myfile') if f: userhandler.upload_sitesexcel(f) return send_file("static/pages/sitetable.html") else: return "error" @app.route('/initdir',methods=['GET']) def initexecledir(): userhandler.initexceldir() return "success" @app.route('/excellist',methods=['GET']) def getexcellist(): sitename = request.args.get("sitename") templateName = request.args.get("templateName") sitename= unquote(unquote(sitename)).encode('utf-8').decode('utf-8-sig') filelist = userhandler.getexcellist(sitename, templateName) return jsonify(filelist) @app.route('/uploadexcel',methods=['POST']) def uploadexcel(): f = request.files.get('myfile') sitename = request.form.get('sitename') templateName = request.form.get("templateName") userhandler.upload_excelfile(f, sitename, templateName) return send_file("static/pages/exceltable.html") @app.route('/deletefile',methods=['GET']) def deletefile(): sitename = unquote(unquote(request.args.get("sitename"))) filename = unquote(unquote(request.args.get("filename"))) templateName = request.args.get("templateName") userhandler.deletefile(sitename, filename, templateName) return "success" @app.route("/renamebase",methods=['GET']) def renamefile(): sitename = unquote(unquote(request.args.get("sitename"))) filename = unquote(unquote(request.args.get("filename"))) templateName = request.args.get("templateName") userhandler.renamefile(sitename, filename, templateName) return "success" @app.route("/baksite",methods=['GET']) def baksite(): userhandler.sitebak() return "success" @app.route('/phone/save',methods=['POST']) def phonesaveexcel(): sitename = request.form.get('sitename') sitename = unquote(unquote(sitename)) data = request.form.get("data") userhandler.save_phoneexcel(sitename, data) return "success" @app.route('/phone/basedata',methods=['GET']) def getbasedatabyexcel(): sitename = request.args.get("sitename") sitename = unquote(unquote(sitename)) return userhandler.get_phonebasedata(sitename) @app.route('/phone/savect',methods=['POST']) def phonesavect(): sitename = request.form.get('sitename') sitename = unquote(unquote(sitename)) data = request.form.get("data") userhandler.save_phoneexcelct(sitename, data) return "success" @app.before_request def process_request(): pass @app.after_request def process_response(response): response.headers['Access-Control-Allow-Origin'] = "http://192.168.0.1:81" response.headers["Access-Control-Allow-Credentials"]="true"; return response app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT' if __name__ == '__main__': app.run(host="0.0.0.0", port=5000, debug=True)
启动调试服务器 直接使用python app.py即可
生产环境
[uwsgi] socket=172.17.51.235:5050 processes=4 threads=2 master=true pythonpath=/root/jiankong/appserver module=manager callable=app memory-report=true buffer-size=32768 static-map =/static=/root/jiankong/appserver/static daemonize = /root/jiankong/appserver/log/uwsgi.log
from app import app if __name__ == "__main__": app.run("0.0.0.0")
from flask import Flask,render_template,request,redirect,session from flask import jsonify,abort,json,make_response,send_from_directory,send_file from flask_bootstrap import Bootstrap from main import userhandler from main import msgconfig as m import os from urllib.parse import unquote,quote app = Flask(__name__) bootstrap = Bootstrap(app) @app.route('/index',methods=['GET']) def index(): return send_file("static/pages/sitetable.html") @app.route('/') def main(): return send_file("static/pages/sitetable.html") @app.route('/login',methods=['POST']) def login(): loginame = request.form.get('loginuser') loginpwd = request.form.get('loginpwd') result = userhandler.checkuser(loginame, loginpwd) if result: session['user'] = {'user': loginame} m.loginmsg="" return redirect("/index") m.loginmsg="error" return redirect("/") @app.route('/site',methods=['GET']) def get_sites(): sites = userhandler.get_sitesexcelfile() return jsonify({'sites': sites}) @app.route('/phone/site',methods=['GET']) def get_phonesites(): sites = userhandler.get_sitesyamlfile() return jsonify({'sites': sites}) @app.route('/upload',methods=['POST']) def upload(): f = request.files['file'] userhandler.upload_excelfile(f) return "success" @app.route('/downsite',methods=['GET']) def downtxt(): return send_from_directory('static/files/','sites.xlsx', as_attachment=True) @app.route('/initsites',methods=['POST']) def uploadtxt(): f = request.files.get('myfile') if f: userhandler.upload_sitesexcel(f) return send_file("static/pages/sitetable.html") else: return "error" @app.route('/initdir',methods=['GET']) def initexecledir(): userhandler.initexceldir() return "success" @app.route('/excellist',methods=['GET']) def getexcellist(): sitename = request.args.get("sitename") templateName = request.args.get("templateName") sitename= unquote(unquote(sitename)).encode('utf-8').decode('utf-8-sig') filelist = userhandler.getexcellist(sitename, templateName) return jsonify(filelist) @app.route('/uploadexcel',methods=['POST']) def uploadexcel(): f = request.files.get('myfile') sitename = request.form.get('sitename') templateName = request.form.get("templateName") userhandler.upload_excelfile(f, sitename, templateName) return send_file("static/pages/exceltable.html") @app.route('/deletefile',methods=['GET']) def deletefile(): sitename = unquote(unquote(request.args.get("sitename"))) filename = unquote(unquote(request.args.get("filename"))) templateName = request.args.get("templateName") userhandler.deletefile(sitename, filename, templateName) return "success" @app.route("/renamebase",methods=['GET']) def renamefile(): sitename = unquote(unquote(request.args.get("sitename"))) filename = unquote(unquote(request.args.get("filename"))) templateName = request.args.get("templateName") userhandler.renamefile(sitename, filename, templateName) return "success" @app.route("/baksite",methods=['GET']) def baksite(): userhandler.sitebak() return "success" @app.route('/phone/save',methods=['POST']) def phonesaveexcel(): sitename = request.form.get('sitename') sitename = unquote(unquote(sitename)) data = request.form.get("data") userhandler.save_phoneexcel(sitename, data) return "success" @app.route('/phone/basedata',methods=['GET']) def getbasedatabyexcel(): sitename = request.args.get("sitename") sitename = unquote(unquote(sitename)) return userhandler.get_phonebasedata(sitename) @app.route('/phone/savect',methods=['POST']) def phonesavect(): sitename = request.form.get('sitename') sitename = unquote(unquote(sitename)) data = request.form.get("data") userhandler.save_phoneexcelct(sitename, data) return "success" @app.before_request def process_request(): pass @app.after_request def process_response(response): response.headers['Access-Control-Allow-Origin'] = "http://192.168.9.1:81" response.headers["Access-Control-Allow-Credentials"]="true"; return response app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT'
server { listen 80; server_name sjz; root /usr/share/nginx/html; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { include uwsgi_params; uwsgi_pass 172.17.51.235:5000; uwsgi_param UWSGI_CHDIR /root/shijiazhuang/appserver; uwsgi_param UWSGI_SCRIPT manager:app; } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } server { listen 81; server_name jiankong; location / { include uwsgi_params; uwsgi_pass 172.17.51.235:5050; uwsgi_param UWSGI_CHDIR /root/jiankong/appserver; uwsgi_param UWSGI_SCRIPT manager:app; } }
说明:
生产环境中flask启动占用的网卡和端口全部委托给uwsgi服务来管理,不再使用开发环境中app.py中指定的网卡和端口等相关信息
uwsgi.ini的socket=127.0.0.1:5050 5050表示uwsgi服务进程通过5050端口转发到flask web 在flask的app.py中就无需再指定监听端口
nginx.conf中的 uwsgi_pass 127.0.0.1:5050; uwsgi_param UWSGI_SCRIPT manager:app;
查看uwsgi服务是否成功启动
[root@iz2ze6e5pr6sbu9qxhzulaz ~]# ps -ef |grep uwsgi root 23579 1 0 08:30 ? 00:00:00 uwsgi jiankong/appserver/uwsgi.ini root 23581 23579 0 08:30 ? 00:00:00 uwsgi jiankong/appserver/uwsgi.ini root 23582 23579 0 08:30 ? 00:00:00 uwsgi jiankong/appserver/uwsgi.ini root 23584 23579 0 08:30 ? 00:00:00 uwsgi jiankong/appserver/uwsgi.ini root 23585 23579 0 08:30 ? 00:00:00 uwsgi jiankong/appserver/uwsgi.ini root 23592 1 0 08:30 ? 00:00:00 uwsgi shijiazhuang/appserver/uwsgi.ini root 23594 23592 0 08:30 ? 00:00:00 uwsgi shijiazhuang/appserver/uwsgi.ini root 23595 23592 0 08:30 ? 00:00:00 uwsgi shijiazhuang/appserver/uwsgi.ini root 23597 23592 0 08:30 ? 00:00:00 uwsgi shijiazhuang/appserver/uwsgi.ini root 23598 23592 0 08:30 ? 00:00:00 uwsgi shijiazhuang/appserver/uwsgi.ini root 23715 23697 0 08:48 pts/1 00:00:00 grep --color=auto uwsgi
设置uwsgi为开机启动
vi /etc/rc.d/rc.local
在/etc/rc.d/rc.local文件末尾追加 /root/a.sh
chmod +x /root/a.sh
chmod +x /etc/rc.d/rc.local
var RestConfig = { "restip":"127.0.0.1", "restport":"5000" };
var RestConfig = { "restip":"60.204.203.31", "restport":"81" };
本文来自博客园,作者:不懂123,转载请注明原文链接:https://www.cnblogs.com/yxh168/articles/9590143.html