美文网首页
一个小型的资源管理站

一个小型的资源管理站

作者: 浪尖的游鱼 | 来源:发表于2019-05-16 09:52 被阅读0次

    前置处理

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

    相关文章

      网友评论

          本文标题:一个小型的资源管理站

          本文链接:https://www.haomeiwen.com/subject/nmuooqtx.html