昔我往矣

搭建Flask开发环境并在nginx上使用uwsgi部署

2015年10月30日

本来就想学习一门python的web框架,正好有需求要写个api,半天时间用flask写完接口,功能是从数据库中读取用户id,以json串格式返回。flask入门不难,简单看了文档的第一节就写好这个功能。在Nginx上部署的时候花了些力气,下面记录一下。

测试环境

CentOS 6
Python 2.6
Flask-0.10.1
数据库IP:192.168.1.1
api测试域名:api.xnow.me

安装Flask环境

安装Flask,先安装easy_install,然后安装pip,再用pip安装Flask,因为我习惯用pip安装各种Python库。

yum -y install python-setuptools mysql-devel python-devel
easy_install pip
pip install flask 
pip install Flask-MySQL

API脚本代码

这段代码是从名为mydb的数据库中,在users表里找到username对应的uid,并以json形式返回,结构很简单:

#!/usr/bin/python
from flask import Flask
from flaskext.mysql import MySQL
import json

app = Flask(__name__)

mysql=MySQL()
app.config['MYSQL_DATABASE_HOST'] = "192.168.1.1"
app.config['MYSQL_DATABASE_USER'] = "root"
app.config['MYSQL_DATABASE_PASSWORD'] = "123456"
app.config['MYSQL_DATABASE_DB'] = "mydb"
mysql.init_app(app)

def GetUid(username):
    conn = mysql.connect()
    cur=conn.cursor()
    cur.execute("select uid from users where username='" + username + "'");
    data=cur.fetchall()
    if len(data):
        conn.commit()
        return json.dumps({username:str(data[0][0])})
    else:
        return json.dumps({"error":"Not found"})
    
@app.route('/api/user/<username>')
def ReturnUid(username):
    return GetUid(username)

if __name__=='__main__':
    app.run(host = '0.0.0.0')

使用python执行这个脚本,会监听本机的5000端口。测试获取admin用户的uid,命令如下(服务器上没浏览器可用啦),可知admin的uid是0:

$ curl http://localhost:5000/api/user/admin
{"admin": "0"}

配置部署环境

现在配置uwsgi和Nginx,首先安装这两个软件:

yum -y install nginx
pip install uwsgi  #yum仓库中也有安装包,但yum装好uwsgi和python的插件之后还是不能用

uwsgi配置文件,app.ini,经测试,这个配置文件似乎需要和api.py放在同一目录下才能生效

[uwsgi]
base = /data/program/myapi    #存放api脚本的目录
app=api    #脚本的名字
module = %(app)

socket= /tmp/app.sock
chmod-socket=666      #使用套接字方式,设置sock文件路径和权限
callable = app
logto = /tmp/%n.log    #%n是变量,即配置文件的文件名,不要ini扩展名

启动uwsgi,会按上面的配置,在/tmp目录下生成日志和sock文件,uwsgi的配置项很丰富,如果追求性能的话,值得好好研究,这里只算可用的demo而已。

uwsgi --ini /data/program/myapi/app.ini

nginx的部分配置文件

    server {
        listen       80;
        server_name  api.xnow.me;
        charset     utf-8;
        client_max_body_size 75M;

        location / { try_files $uri @yourapplication; }
        location @yourapplication {
            include uwsgi_params;
            uwsgi_pass unix:/tmp/app.sock;
        }
    }

启动nginx

service nginx start

使用浏览器测试下

客户端浏览器测试api

根据返回值获得数据,zhangs的uid是1

现在只是简单的看了flask的第一节,很有趣的样子,接下来还得好好学习下这个框架!

当前暂无评论 »

添加新评论 »