前置处理
1.服务器架构
系统:centos7.5
服务框架:Nginx和uWSGI部署Flask
2.数据库架构
MariaDB5.5
3.示例前景
微信小程序用户注册端口
一、服务框架
Web服务器网关接口(Python Web Server Gateway Interface,缩写为WSGI)是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。
1.安装uWSGI
pip3 install uwsgi
#为常用指令建立连接
ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi
2.安装nginx
详见https://www.jianshu.com/p/4c0fb2ed6083
wget http://nginx.org/download/nginx-1.14.2.tar.gz
tar zxvf nginx-1.14.2.tar.gz
cd nginx-1.14.2/
./configure --prefix=/usr/local/nginx-1.14.2 --with-pcre \
--with-http_ssl_module --with-http_gzip_static_module \
--with-http_stub_status_module
#前置安装已经安装好了所有的关联项,若有报错直接复制对应的程式搜索即可
make & make install
#建立连接
ln -s /usr/local/nginx-1.14.2/sbin /usr/bin/nginx
3.安装flask
pip3 install flask
二、测试
1.测试flask
编辑flask
> vi test.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'Hello World!'
> export FLASK_APP=test.py
> python3 -m flask run --host=0.0.0.0
使用浏览器测试(注意额外参数--host=0.0.0.0,从而告诉操作系统监听所有公开的 IP)
2.测试nginx
> nginx
> netstat -ntulp
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1777/nginx: master
访问IP:80即可见到nginx的默认欢迎界面
3.测试uWSGI
编辑uWSGI
> vi test.py
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World"]
> uwsgi --http :9090 --wsgi-file test.py
通过IP:9090测试uWSGI
4.测试flask+nginx
flask作为web应用框架,其实是有自己的Web server,我们可以直接用nginx代理flask的web服务
#测试服务,仍然使用test.py
#修改nginx的配置文件
location / {
proxy_pass http://127.0.0.1:5000;
}
#默认80端口,根目录/全部走http://127.0.0.1:5000
现在打开浏览器访问IP:80就能看到5000端口挂的flask服务
5.测试flask+uWSGI
flask作为实现了WSGI标准的应用框架,虽然有自己的Web server,但是为了专业性,其实就是功能拓展性。选择uWSGI,uWSGI是一个全站式的托管服务,它实现了应用服务器(支持多种编程语言)、代理、进程管理器、监视器。
最简单的方法直接用指令启动
uwsgi --http 127.0.0.1:5000 --module myproject:app
#--http 即挂载的IP:端口
#--module即WSGI模式下的应用文件名(不含后缀):模板名称
也可以直接用配置文件处理
#创建WSGI配置文件
> vi wsig_conf.ini
[uwsgi]
chdir=/usr/local/Labtest/flask # 工程目录
home=/usr/local/Labtest/flask/.env # 虚拟环境目录
module=for_flask # 启动flask应用的文件名,不用加.py
callable=app # 应用名,与我们hell
master=true
#processes=2 # worker的进程个数
chmod-socket=666
logfile-chmod=644
procname-prefix-spaced=for_flask # uwsgi的进程名称前缀,启动后可通过ps -ef | grep HelloWorld查找到这个进程
py-autoreload=1 #py文件修改,自动加载,也就是设置热启动了
#http=0.0.0.0:8080 #监听端口,测试时使用,即此处使用应该取消注释
vacuum=true # 退出uwsgi是否清理中间文件,包含pid、sock和status文件
socket=%(chdir)/uwsgi/uwsgi.sock # socket文件,配置nginx时候使用
stats=%(chdir)/uwsgi/uwsgi.status # status文件,可以查看uwsgi的运行状态
pidfile=%(chdir)/uwsgi/uwsgi.pid # pid文件,通过该文件可以控制uwsgi的重启和停止
#daemonize=%(chdir)/uwsgi/uwsgi.log # 设置后台模式,然后将日志输出到uwsgi.log。当调试时,可先注释掉此内容
注意这里配置了python虚拟环境目录,为了正式工程不受外界影响
virtualenv
#uwsgi 指令集
uwsgi --ini uwsgi.ini # 启动
uwsgi --reload uwsgi.pid # 重启
uwsgi --stop uwsgi.pid # 关闭
6.测试flask+uWSGI+nginx
flask+uWSGI已经能实现webserver的功能了,但是更加优秀的weberver还需要nginx的辅助。
Nginx(发音同engine x)是异步框架的网页服务器,也可以用作反向代理、负载平衡器和HTTP缓存。
#修改nginx的配置文件
location / {
include uwsgi_params;
uwsgi_pass unix:/???/uwsgi/uwsgi.sock;
}
> nginx -s reload
#重启nginx服务
还有写拓展处理主要看服务配置
三、数据库架构
时代变了,现在使用MariaDB,不过老版本之前MariaDB=MySQL,从MariaDB8开始两者才有本质的不同。
#安装MariaDB
> yum install mariadb mariadb-server
> systemctl start mariadb
> systemctl enable mariadb
> service mariadb status
四、为MariaDB配置RESTful
配置
> pip3 install flask_sqlalchemy
> pip3 install flask_restless
测试
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_restless import APIManager
app = Flask(__name__)
app.config['DEBUG'] = True
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://用户名:密码@127.0.0.1:3306/数据库名?charset=utf8mb4'
app.config['SQLALCHEMY_DATABASE_URI'] = SQLALCHEMY_DATABASE_URI
db = SQLAlchemy(app)
manager = APIManager(app, flask_sqlalchemy_db=db)
class Test(db.Model):
__tablename__ = 'test'
id = db.Column(db.BIGINT, primary_key=True)
name = db.Column(db.String(255), default="", doc='名称')
state = db.Column(db.INT, default="", doc='状态')
text = db.Column(db.String(1000), default="", doc='说明')
manager.create_api(Test, methods=['GET', 'POST', 'PUT', 'DELETE'])
if __name__ == '__main__':
app.run(host='127.0.0.1', port=8987, debug=True)
直接运行测试即可
五、微信小程序
学习微信小程序
学习微信小程序
其实最好还是看官网,个人文章带有总结向
解析用户数据
即获得openid和unionid,机制请详见官方
//注意官方逐步放弃弹出授权——获取用户基础数据
//app.js
App({
onLaunch: function () {
// 登录
wx.login({
success: res => {
var code = res.code;//登录凭证
console.log({ code: code })
// 发送 res.code 到后台换取 openId, sessionKey, unionId
}
})
// 获取用户信息
wx.getSetting({
success: res => {
if (res.authSetting['scope.userInfo']) {
// 已经授权,可以直接调用 getUserInfo 获取头像昵称,不会弹框
wx.getUserInfo({
success: res => {
// 可以将 res 发送给后台解码出 unionId
console.log(res)
this.globalData.userInfo = res.userInfo
/*
将wx.login的res.code
wx.getUserInfo的res.encryptedData,res.iv
发送给后台server解析
当然如果只需要openid的话,可以只看res.code
https://api.weixin.qq.com/sns/jscode2session
在授权以后unionid也可以直接用此API获取,但是有前提开发者有开放平台,还有一些具体要求。详询官方文档
*/
// 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回
// 所以此处加入 callback 以防止这种情况
if (this.userInfoReadyCallback) {
this.userInfoReadyCallback(res)
}
}
})
}
}
})
},
globalData: {
userInfo: null
}
})
存入DB
#可以直接调用restful接口
> curl -X POST localhost:5000/api/test -H "Content-Type:application/json" -d '{"id":"6","name":"cpf","state":"0","text":"加油"}'
#也可以用ORM操作数据库