任何一个好的程序,配置文件必不可少,而且非常重要。配置文件里存储了连接数据库,redis的用户密码,不允许有任何闪失。要有灵活性,用户可以自己配置;生产环境和开发环境要分开,最好能简单的修改一个东西,就能达到要求;要有安全性,最好的方式,即使有一天前端服务器被窃取信息,配置文件里的信息也不能泄露。

  python本身带有configparser库,可以解析普通文件的配置,但是这样不但繁琐,而且安全性也得不到保证。我在前面一再强调,能达到自己要求的实现方式,就是最好的方式。flask官方例子有一个非常好的事例,就是config文件本身就是一个py文件,直接导入,代码简单、实用。连接我们之前的代码,我写了如下配置文件。

config.py

class Config(object):
SECRET_KEY = 'saduhsuaihfe332r32rfo43rtn3noiYUG9jijoNF23'
QINIU_ACCESS_KEY = 'hP7WNic×××××××××××××××××××××××××oZfrVs6'
QINIU_SECRET_KEY = 'bBZ×××××××××××××××××××××××××××××××××VAV'
BUCKET_NAME = 'dameinv' class DevelopmentConfig(Config):
DEBUG = True REDIS_HOST = 'localhost'
REDIS_PORT = 6380
REDIS_DB = 4
REDIS_PASSWORD = '××××××' MYSQL_INFO = "mysql://root:××××××××@127.0.0.1:3306/blog01?charset=utf8" class ProductionConfig(Config):
DEBUG = False REDIS_HOST = 'server-ip'
REDIS_PORT = 6380
REDIS_DB = 4
REDIS_PASSWORD = '×××××××××××' MYSQL_INFO = "mysql://××××××××××@server-ip:3306/blog01?charset=utf8"
Conf = DevelopmentConfig

  整个过程非常简单,就3个类,基类是Config,这里面记载的配置信息,都各种开发环境公用的。如果有配置不公用,就把具体的配置信息放到子类中去,我们只需要引用具体的子类即可,每次从开发环境转移到生产环境时,只需要修改Conf参数就可以了。

  下面在view和model里面使用一下吧。

  首先在view.py里面,把定义的那部分代码修改如下:

from config import Conf

app = Flask(__name__)
app.config.from_object(Conf) app.secret_key = app.config['SECRET_KEY']
app.redis = redis.Redis(host=app.config['REDIS_HOST'], port=app.config['REDIS_PORT'],
db=app.config['REDIS_DB'], password=app.config['REDIS_PASSWORD']) app.q = Auth(access_key=app.config['QINIU_ACCESS_KEY'], secret_key=app.config['QINIU_SECRET_KEY'])
bucket_name = app.config['BUCKET_NAME'] ×××××××××××××××
@app.route('/user')
@login_check
def user():
user = g.current_user nickname = app.redis.hget('user:%s' % user.phone_number, 'nickname')
return jsonify({'code': 1, 'nickname': nickname, 'phone_number': user.phone_number}) ××××××××××××××××××
if __name__ == '__main__': 
  app.run(debug=app.config['DEBUG'], host='0.0.0.0', port=5001)

其他代码就省略了,跟之前版本一样,只是让大家看到效果不同,每个东西,都可以在配置文件里进行修改。从开发环境转到生产环境,只需要在config.py文件里修改一下即可。是不是非常简单?

同理,model.py也一样

from config import Conf

engine = create_engine(Conf.MYSQL_INFO, pool_recycle=7200)

model里面,没有使用app环境来config,大家一定要记住,程序是写的,怎么简单,怎么写,只要不影响效率,千万不要被框架限定死。

  好了,上面显示了,怎么用config.py文件来做配置文件,基本使用会了,但是上面所说的安全性呢?如果哪天前端服务器的密码被别人知道了,或者网站有重大漏洞,被别人看到config.py文件,他岂不是知道所有数据库和redis的信息?那怎么做呢?其实也很简单,直接引用config.pyc文件即可,上传正式服务器的时候,把config.py文件给移除出去。是不是很傻瓜?没关系,像我之前所说的那样,如果能用最简单的办法达到目的,我为何还要走弯路呢?当然,还是挡不住高手的,他们可以反编译pyc文件,这个就不要钻牛角尖了。

  整个配置文件是不是很简单,这一章就讲到这,下一章,我们讲讲flask restful api最最精华的一部分,蓝图。

  

flask开发restful api系列(6)-配置文件的更多相关文章

  1. flask开发restful api系列(8)-再谈项目结构

    上一章,我们讲到,怎么用蓝图建造一个好的项目,今天我们继续深入.上一章中,我们所有的接口都写在view.py中,如果几十个,还稍微好管理一点,假如上百个,上千个,怎么找?所有接口堆在一起就显得杂乱无章 ...

  2. flask开发restful api系列(1)

    在此之前,向大家说明的是,我们整个框架用的是flask + sqlalchemy + redis.如果没有开发过web,还是先去学习一下,这边只是介绍如果从开发web转换到开发移动端.如果flask还 ...

  3. flask开发restful api系列(7)-蓝图与项目结构

    如果有几个原因可以让你爱上flask这个极其灵活的库,我想蓝图绝对应该算上一个,部署蓝图以后,你会发现整个程序结构非常清晰,模块之间相互不影响.蓝图对restful api的最明显效果就是版本控制:而 ...

  4. flask开发restful api系列(3)--利用alembic进行数据库更改

    上面两章,主要讲基本的配置,今天我们来做一个比较有趣的东西,为每个客户加一个头像图片.如果我们图片保存在自己的服务器,对于服务器要求有点高,每次下载的时候,都会阻塞网络接口,要是1000个人同时访问这 ...

  5. flask开发restful api系列(5)-短信验证码

    我们现在开发app,注册用户的时候,不再像web一样,发送到个人邮箱了,毕竟个人邮箱在移动端填写验证都很麻烦,一般都采用短信验证码的方式.今天我们就讲讲这方面的内容. 首先,先找一个平台吧.我们公司找 ...

  6. flask开发restful api系列(4)--七牛图片服务

    上一章我们讲到如何利用alembic来更新数据库,这章,我们讲如何通过七牛服务来存储图片. 像我们大多数公司一样,公司资金比较少,如果自己开发图片服务器,代价太大:如果我们用自己的网站服务器来保存图片 ...

  7. flask开发restful api系列(2)

    继续上一章所讲,上一章我们最后面说道,虽然这个是很小的程序,但还有好几个要优化的地方.先复制一下老的view.py代码. # coding:utf-8 from flask import Flask, ...

  8. flask开发restful api

    flask开发restful api 如果有几个原因可以让你爱上flask这个极其灵活的库,我想蓝图绝对应该算上一个,部署蓝图以后,你会发现整个程序结构非常清晰,模块之间相互不影响.蓝图对restfu ...

  9. 描述怎样通过flask+redis+sqlalchemy等工具,开发restful api

    flask开发restful api系列(8)-再谈项目结构 摘要: 进一步介绍flask的项目结构,使整个项目结构一目了然.阅读全文 posted @ 2016-06-06 13:54 月儿弯弯02 ...

随机推荐

  1. COJN 0484 800502电池的寿命

    800502电池的寿命 难度级别:B: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 小S新买了一个掌上游戏机,这个游戏机由两节5号电池供电. ...

  2. RMQ算法讲解

    RMQ算法 引入: 例1.题目描述 输入N个数和M次询问,每次询问一个区间[L,R],求第L个数到R个数之间的最大值.   第一种方法:大暴力之术. 但是……时间复杂度最坏会达到 $O(NM)$,一半 ...

  3. I - Navigation Nightmare-poj 1984

    约翰和他的邻居生活在一个村庄里,他们的道路修建的很特别,都是正东正西或者正南正北,但是呢他们用一种方式描述他们和邻居的位置,比如说 6号 在1号 东面13处,那么我们就可以计算出来这两家的曼哈顿距离, ...

  4. iOS进阶读物

    不知不觉作为 iOS 开发也有两年多的时间了,记得当初看到 OC 的语法时,愣是被吓了回去,隔了好久才重新耐下心去啃一啃.啃了一阵,觉得大概有了点概念,看到 Cocoa 那么多的 Class,又懵了, ...

  5. Dockerfile制作sshd镜像

    For Centos Shell脚本: # vim Dockerfile # mkdir /data01/sshd # vi Dockerfile # sshd # # VERSION 0.0.2 F ...

  6. C++ —— 类模板的分离式编译

    目录 对于C++中类模板的分离式编译的认识 具体的实例 1.对于C++中类模板的分离式编译的认识 为什么C++编译器不能支持对模板的分离式编译(博文链接) 主要内容:编译器编译的一般工作原理.对模版的 ...

  7. Effective C++ 第二版 40)分层 41)继承和模板 42)私有继承

    条款40 通过分层来体现"有一个"或"用...来实现" 使某个类的对象成为另一个类的数据成员, 实现将一个类构筑在另一个类之上, 这个过程称为 分层Layeri ...

  8. Python使用mechanize模拟浏览器

    Python使用mechanize模拟浏览器 之前我使用自带的urllib2模拟浏览器去进行訪问网页等操作,非常多站点都会出错误,还会返回乱码.之后使用了 mechanize模拟浏览器,这些情况都没出 ...

  9. GCC编译选项

    一.看例子分析gcc 的编译选项 gcc -o hello hello.c -I /home/hello/include -L /home/hello/lib -lworld 1.-I /home/h ...

  10. Android组件间的数据传输

    组件我们有了,那么我们缺少一个组件之间传递信息的渠道.利用Intent做载体,这是一个王道的做法.还有呢,可以利用文件系统来做数据共享.也可以使用Application设置全局数据,利用组件来进行控制 ...