flask-migrate数据库迁移

在迭代开发中,会阶段性的变更数据库模型,更新数据库。
变更时,为了不丢失数据库中的数据,可以使用数据库迁移工具。

flask-migrate是对Alembic的轻量级封装,并且已经被集成到了flask-script中。

安装

$ pip install flask-migrate

配置

from flask_sqlalchemy import SQLAlchemy as SQLAlchemy
from flask_script import Manager, Shell
from flask_migrate import Migrate, MigrateCommand

app = Flask(__name__)
manager = Manager(app)
db = SQLAlchemy(app)
migrate = Migrate(app, db)

manager.add_command("shell", Shell(make_context=make_shell_context))
manager.add_command('db', MigrateCommand)

if __name__ == '__main__':
    manager.run()
    

创建迁移仓库

$ python xxx.py db init

创建迁移脚本

$ python xxx.py db migrate

数据库迁移

$ python xxx.py db upgrade    

认识javascript

javascript基础

声明

  • 声明变量不用var时,该变量为全局变量

数据类型

  • Number
  • 整型常量(10进制\8进制\16进制)
    十六进制以0x或0X开头, 例如: 0x8a
    八进制必须以0开头, 例如: 0123
    十进制的第一位不能是0(数字0除外), 例如: 123
  • 实型常量
    12.32, 193.98, 5E7, 4e5等
  • Boolean
  • String
  • “abc”,’abc’
    双引号会搜索引号内的内容是否含有变量,有则输出其值,没有则输出原有内容
    单引号则不会检测内容,因此效率更高
  • 特殊字符,需要以反斜杠()后跟一个普通字符来表示
    例如: \r, \n, \t, \b, '
  • null常量
  • undefined常量
  • 特殊数值
    NaN, Infinity(无穷大), isNaN(), isFinite()

逻辑运算符

  • && 逻辑与
  • || 逻辑或
  • ! 逻辑非

定义一个类

function Person(name) {
    this.name = name;
}

一切都是对象

类(函数)也是对象

创建对象

var p = new Person("张三")

闭包closure

函数内部可以直接读取全局变量。

    var n = 999;
    
    function f1() {
        alert(n);
    }
    
    f1(); // 999

函数外部无法读取函数内的局部变量。

    function f1() {
        var n = 999;
    }
    
    alert(n); // error

利用闭包,从函数外部读取函数内的局部变量。

    function f1() {
        var n = 999;
        
        function f2() {
            alert(n);
        }
        
        return f2;
    }
    
    var result = f1();
    result(); // 999

作用域scope(上下文)

上下文对象就是使用this指针,即被调用函数所处的环境。上下文对象在一个函数内部引用调用它的对象本身。

var someuser = {
    name: 'byvoid',
    func: function() {
        console.log(this.name);
    }
};

var foo = {
    name: 'foobar'
};

someuser.func(); // byvoid

foo.func = someuser.func;
foo.func(); // foobar

name = 'global';
func = someuser.func;
func(); // globar

prototype

利用prototype可以扩展js类。

Number.prototype.add = function(v) {
    return this + v;
}    

var d = 6;
d.add(8).add(9); // d = 6 + 8 + 9

扩展自定义的类。

function Person(name) {
    this.name = name;
}

Person.prototype.sayHello = function() {
    alert(this.name);
}

var p = new Person("zhangsan");
p.sayHello();

继承

classB继承classA

function classA(name) {
    this.name = name;
    this.sayHello = function() {
        alert(this.name);
    }
}

方法1

function classB(name) {
    this.tempMethod = classA;
    this.tempMethod(name);
}

方法2

function classB(name) {
    classA.call(this, name);
}

方法3

function classB(name) {
    classA.apply(this, [name]);
}

调用classB

var b = new classB("lisa");
b.sayHello();

可变参数

在js的世界里,内置属性arguments可以接收可辨参数。

function sum() {
    var s = 0;
    for(var i = 0; i < arguments.length; i++) {
        s+ = arguments[i];
    }
    
    return s;
}

alert(sum(1,4,5));
alert(sum(12,15,19,21,51));

react native与webapi交互

react native坑太大了!!!
既然跳进去了,就想办法填坑呗~

webapi

本地开启webAPI

webapi

curl测试webAPI

test webapi

react native如何debug

command + d

在ios的simulator上,command+d调出菜单,选择Debug JS Remotely

debug

Runtime is not ready for debugging.

如果报出该错,则需要下载chrome浏览器,mac自带的safari无法载入本地的reactJS文件。

error

Network request failed.

如果报出该错,需要配置xcode里对于http请求的设置。

error

这个错误搞的我烦躁了一个周末,根本没有头绪。
首先,要确认RCTWebSocketExecutor.m文件中host = @”localhost”;

host

其次,要在plist的APP Transport Security Settings中添加Allow Arbitrary Loads为True。这个设置把request请求不仅仅局限于https安全模式,http也被允许了。

plist

chrome debug

测试一下,与本地webapi的交互,在chrome浏览器下可以打断点,查看变量了。

chrome

webapi的监听也收到了request。

webapi listen

退出debug模式

command + d

在ios的simulator上,command+d调出菜单,选择Stop Remote JS Debugging

stop debug

参照facebook debugging文档

curl测试restful服务

利用curl,可以很方便的测试restful服务,发送HTTP GET,POST,PUT,DELETE请求。也可以改变HTTP header来指定特别条件。

curl参数

-X/–request [GET|POST|PUT|DELETE|…] 指定http request方式
-H/–header 设定request请求的header
-i/–include 显示response响应的header
-d/–data 设定request的参数
-v/–verbose 输出更多的信息
-u/–user 使用者账号,密码
-b/–cookie cookie

GET

$ curl -i http://localhost:5000/rest/api/v1.0/tasks

POST

$ curl -i -H "Content-Type: application/json" -X POST -d '{"title":"learn python"}' http://localhost:5000/rest/api/v1.0/tasks  

PUT

$ curl -i -H "Content-Type: application/json" -X PUT -d '{"title":"learn nodejs"}' http://localhost:5000/rest/api/v1.0/tasks/2

DELETE

$ curl -i -X DELETE http://localhost:5000/rest/api/v1.0/tasks/1

centOS下配置Virtualenv+Flask+Gunicorn+Supervisor+Nginx

在阿里云上部署flask环境。

安装virtualenv并创建工程

$ pip install virtualenv
$ virtualenv stooge
$ cd stooge
$ source bin/activate

安装flask并创建一个服务

$ pip install flask
$ touch runserver.py
$ vim runserver.py
$ chmod a+x runserver.py
    

runserver.py

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello World!'

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

安装Gunicorn

Gunicorn是一个开源Python WSGI UNIX的HTTP服务器,默认是同步工作,支持Gevent,Eventlet异步。

$ pip install gunicorn

gunicorn.conf

在项目stooge根目录下, 配置gevent workers数处理并发,及绑定本地的端口号。

#worker process number
workers = 3
#bind local port
bind = '127.0.0.1:8000'

安装Supervisor

$ sudo pip install supervisor

supervisor是用python实现的一款进程管理工具。supervisor会帮你把管理的应用程序转成daemon程序,而且可以方便的通过命令开启,关闭,重启等操作。而且它管理的进程一旦崩溃会自动重启,这样就可以保证程序在执行中断后自我修复。

supervisor配置

supervisor包括两部分:

  • supervisord (server端)
  • supervisorctl (client端)

重定向配置文件

$ sudo echo_supervisord_conf > /etc/supervisord.conf

虽然可以把所有的配置项都写到supervisord.conf文件里,但并不推荐这样做。而是通过include的方式把不同的程序组写到不同的配置文件里。

修改supervisord.conf的include section

[include]
files = /etc/supervisor/conf.d/*.conf

添加program配置

新建目录/etc/supervisor/conf.d,并创建stooge.conf

$ touch stooge.conf
$ vim stooge.conf
[program:stooge]
command=/home/$username/stooge/bin/gunicorn runserver:app -c /home/$username/stooge/gunicorn.conf
directory=/home/$username/stooge
user=$username
autostart=true
autorestart=true
stdout_logfile=/home/$username/stooge/logs/gunicorn_supervisor.log

这样的配置,通过[program:stooge]来告诉supervisord需要管理哪个进程。可以在client端(supervisorctl或web页面)显示,并对该进程start,restart,stop。

supervisorctl

supervisorctl 是 supervisord 的一个命令行客户端工具,启动时需要指定配置文件。

$ supervisord -c /etc/supervisord.conf

shell 命令

$ supervisorctl status #查看程序状态
$ supervisorctl stop stooge
$ supervisorctl start stooge
$ supervisorctl restart stooge
$ supervisorctl reread #读取有更新的配置文件
$ supervisorctl update #重启配置文件修改过的进程

在这里我们启动stooge

$ supervisorctl start stooge

安装nginx

$ yum install nginx

centos7下的nginx1.6.3没有sites-available和sites-enabled子目录。但是有conf.d子目录。和配置supervisord一样,也是可以通过include的方式把不同的程序组写到不同的配置文件里。

nginx配置

确保/etc/nginx/nginx.conf中,http模块中引入conf.d子目录。

include /etc/nginx/conf.d/*.conf

在/etc/nginx/conf.d下创建stooge.conf

server {
    listen 80;
    server_name xx.xx.xx.xx;
    
    root /home/$username/stooge/;
    access_log /home/$username/stooge/access.log;
    error_log /home/$username/stooge/error.log;
    
    location / {
        proxy_set_header X-Forword-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        if (!-f $request_filename) {
            proxy_pass http://127.0.0.1:8000;
            break;
        }
    }
}

重启nginx服务

$sudo service nginx restart

配置firewalld

安装完nginx后,80端口是没有开放的,外网无法访问。
增加http,https到/etc/firewalld/zones/public.xml文件。

<service name="http"/>
<service name="https"/>

访问helloworld服务

外网访问ip,显示helloworld了!

react native初体验

今天想体验一下react native

$ brew install node
$ brew install watchman
$ brew install flow
$ sudo npm install -g react-native-cli

结果报错如下

$ network getaddrinfo ENOTFOUND registry.npmjs.org registry.npmjs.org:443

给npm设置proxy翻墙安装就成功了。

$ npm config set proxy http://address:8080

初始化一个project

$ react-native init HelloWorld

成功后,新new的project里,会建立好ios和android的初始工程。
运行IOS应用程序:

$ react-native run-ios

运行Android应用程序:

$ react-native run-android

IOS环境配置很快啊,只要网络没有问题,就很快可以run成功。
Android环境配了三天啊。。。各种坑,各种查资料,还好最后也run好了。

开始实战吧。

js七牛上传实践

  • 七牛有免费的配额可以使用,在测试开发时,将图片,视频流等多种媒体文件可以上传到七牛上。
  • 其次,七牛可以绕过搭载应用的server,手机端或者pc端可以直接上传下载媒体资源至七牛云。只是在上传时,需要先向应用server要求访问七牛的token,拿到这个token后直接与七牛交互。
  • 最后,七牛云支持cdn加速,即使对成熟的应用来说,也是不错的选择。

七牛

下面讲解flask作为业务服务器,进行七牛云存储的过程。

flask.exthook.ExtDeprecationWarning警告的消除

flask升级到0.11版后,弃用了以 flask.ext.xxx 导入扩展模块的形式,改为 flask_xxx
如果仍然沿用原来的形式,flask会报警告flask.exthook.ExtDeprecationWarning。

flask团队提供了flask-ext-migrate的转换工具。

pip安装:

$ pip install flask-ext-migrate

转换:

$ flask_ext_migrate xxx.py

但目前pip上的版本上存在bug,最新的github上fix了这个问题。
这个转换工具一次只能转换一个python文件。
随便写个shell批量处理吧。

$ for f in `find . -name "*.py"`
> {
> flask_ext_migrate $f
> }

mac下批量替换文本

在mac下使用sed与linux下稍微有一些不同。
-i 参数可以指定备份源文件名

sed -i "bk" "s/Cat/Dog/g" example.txt

替换example.txt文件中的Cat->Dog时,会生成备份文件example.txtbk。也可以指定不生成备份文件,-i参数为“”。

批量替换命令如下:

sed -i "" "s/Cat/Dog/g" `grep Cat -rl ./`

用grep查找出当前文件夹下含有Cat的文件,然后替换成Dog。并且不指定备份文件。

  • Copyrights © 2015-2021 小白兔
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信