一個(gè)小型的資源管理站

前置處理

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ù)庫
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容