一个小型的资源管理站

前置处理

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操作数据库

你可能感兴趣的:(一个小型的资源管理站)