前置處理
1.服務(wù)器架構(gòu)
系統(tǒng):centos7.5
服務(wù)框架:Nginx和uWSGI部署Flask
2.數(shù)據(jù)庫架構(gòu)
MariaDB5.5
3.示例前景
微信小程序用戶注冊(cè)端口
一、服務(wù)框架
Web服務(wù)器網(wǎng)關(guān)接口(Python Web Server Gateway Interface,縮寫為WSGI)是為Python語言定義的Web服務(wù)器和Web應(yīng)用程序或框架之間的一種簡(jiǎn)單而通用的接口。
1.安裝uWSGI
pip3 install uwsgi
#為常用指令建立連接
ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi
2.安裝nginx
詳見http://www.itdecent.cn/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
#前置安裝已經(jīng)安裝好了所有的關(guān)聯(lián)項(xiàng),若有報(bào)錯(cuò)直接復(fù)制對(duì)應(yīng)的程式搜索即可
make & make install
#建立連接
ln -s /usr/local/nginx-1.14.2/sbin /usr/bin/nginx
3.安裝flask
pip3 install flask
二、測(cè)試
1.測(cè)試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
使用瀏覽器測(cè)試(注意額外參數(shù)--host=0.0.0.0,從而告訴操作系統(tǒng)監(jiān)聽所有公開的 IP)
2.測(cè)試nginx
> nginx
> netstat -ntulp
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1777/nginx: master
訪問IP:80即可見到nginx的默認(rèn)歡迎界面
3.測(cè)試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測(cè)試uWSGI
4.測(cè)試flask+nginx
flask作為web應(yīng)用框架,其實(shí)是有自己的Web server,我們可以直接用nginx代理flask的web服務(wù)
#測(cè)試服務(wù),仍然使用test.py
#修改nginx的配置文件
location / {
proxy_pass http://127.0.0.1:5000;
}
#默認(rèn)80端口,根目錄/全部走h(yuǎn)ttp://127.0.0.1:5000
現(xiàn)在打開瀏覽器訪問IP:80就能看到5000端口掛的flask服務(wù)
5.測(cè)試flask+uWSGI
flask作為實(shí)現(xiàn)了WSGI標(biāo)準(zhǔn)的應(yīng)用框架,雖然有自己的Web server,但是為了專業(yè)性,其實(shí)就是功能拓展性。選擇uWSGI,uWSGI是一個(gè)全站式的托管服務(wù),它實(shí)現(xiàn)了應(yīng)用服務(wù)器(支持多種編程語言)、代理、進(jìn)程管理器、監(jiān)視器。
最簡(jiǎn)單的方法直接用指令啟動(dòng)
uwsgi --http 127.0.0.1:5000 --module myproject:app
#--http 即掛載的IP:端口
#--module即WSGI模式下的應(yīng)用文件名(不含后綴):模板名稱
也可以直接用配置文件處理
#創(chuàng)建WSGI配置文件
> vi wsig_conf.ini
[uwsgi]
chdir=/usr/local/Labtest/flask # 工程目錄
home=/usr/local/Labtest/flask/.env # 虛擬環(huán)境目錄
module=for_flask # 啟動(dòng)flask應(yīng)用的文件名,不用加.py
callable=app # 應(yīng)用名,與我們hell
master=true
#processes=2 # worker的進(jìn)程個(gè)數(shù)
chmod-socket=666
logfile-chmod=644
procname-prefix-spaced=for_flask # uwsgi的進(jìn)程名稱前綴,啟動(dòng)后可通過ps -ef | grep HelloWorld查找到這個(gè)進(jìn)程
py-autoreload=1 #py文件修改,自動(dòng)加載,也就是設(shè)置熱啟動(dòng)了
#http=0.0.0.0:8080 #監(jiān)聽端口,測(cè)試時(shí)使用,即此處使用應(yīng)該取消注釋
vacuum=true # 退出uwsgi是否清理中間文件,包含pid、sock和status文件
socket=%(chdir)/uwsgi/uwsgi.sock # socket文件,配置nginx時(shí)候使用
stats=%(chdir)/uwsgi/uwsgi.status # status文件,可以查看uwsgi的運(yùn)行狀態(tài)
pidfile=%(chdir)/uwsgi/uwsgi.pid # pid文件,通過該文件可以控制uwsgi的重啟和停止
#daemonize=%(chdir)/uwsgi/uwsgi.log # 設(shè)置后臺(tái)模式,然后將日志輸出到uwsgi.log。當(dāng)調(diào)試時(shí),可先注釋掉此內(nèi)容
注意這里配置了python虛擬環(huán)境目錄,為了正式工程不受外界影響
virtualenv
#uwsgi 指令集
uwsgi --ini uwsgi.ini # 啟動(dòng)
uwsgi --reload uwsgi.pid # 重啟
uwsgi --stop uwsgi.pid # 關(guān)閉
6.測(cè)試flask+uWSGI+nginx
flask+uWSGI已經(jīng)能實(shí)現(xiàn)webserver的功能了,但是更加優(yōu)秀的weberver還需要nginx的輔助。
Nginx(發(fā)音同engine x)是異步框架的網(wǎng)頁服務(wù)器,也可以用作反向代理、負(fù)載平衡器和HTTP緩存。
#修改nginx的配置文件
location / {
include uwsgi_params;
uwsgi_pass unix:/???/uwsgi/uwsgi.sock;
}
> nginx -s reload
#重啟nginx服務(wù)
還有寫拓展處理主要看服務(wù)配置
三、數(shù)據(jù)庫架構(gòu)
時(shí)代變了,現(xiàn)在使用MariaDB,不過老版本之前MariaDB=MySQL,從MariaDB8開始兩者才有本質(zhì)的不同。
#安裝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
測(cè)試
#!/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/數(shù)據(jù)庫名?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='狀態(tài)')
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)
直接運(yùn)行測(cè)試即可
五、微信小程序
學(xué)習(xí)微信小程序
學(xué)習(xí)微信小程序
其實(shí)最好還是看官網(wǎng),個(gè)人文章帶有總結(jié)向
解析用戶數(shù)據(jù)
即獲得openid和unionid,機(jī)制請(qǐng)?jiān)斠姽俜?/p>
//注意官方逐步放棄彈出授權(quán)——獲取用戶基礎(chǔ)數(shù)據(jù)
//app.js
App({
onLaunch: function () {
// 登錄
wx.login({
success: res => {
var code = res.code;//登錄憑證
console.log({ code: code })
// 發(fā)送 res.code 到后臺(tái)換取 openId, sessionKey, unionId
}
})
// 獲取用戶信息
wx.getSetting({
success: res => {
if (res.authSetting['scope.userInfo']) {
// 已經(jīng)授權(quán),可以直接調(diào)用 getUserInfo 獲取頭像昵稱,不會(huì)彈框
wx.getUserInfo({
success: res => {
// 可以將 res 發(fā)送給后臺(tái)解碼出 unionId
console.log(res)
this.globalData.userInfo = res.userInfo
/*
將wx.login的res.code
wx.getUserInfo的res.encryptedData,res.iv
發(fā)送給后臺(tái)server解析
當(dāng)然如果只需要openid的話,可以只看res.code
https://api.weixin.qq.com/sns/jscode2session
在授權(quán)以后unionid也可以直接用此API獲取,但是有前提開發(fā)者有開放平臺(tái),還有一些具體要求。詳詢官方文檔
*/
// 由于 getUserInfo 是網(wǎng)絡(luò)請(qǐng)求,可能會(huì)在 Page.onLoad 之后才返回
// 所以此處加入 callback 以防止這種情況
if (this.userInfoReadyCallback) {
this.userInfoReadyCallback(res)
}
}
})
}
}
})
},
globalData: {
userInfo: null
}
})
存入DB
#可以直接調(diào)用restful接口
> curl -X POST localhost:5000/api/test -H "Content-Type:application/json" -d '{"id":"6","name":"cpf","state":"0","text":"加油"}'
#也可以用ORM操作數(shù)據(jù)庫