WEB-PROJECT(o2o)
B2C: BUSSINESS TO CUSTOMER
C2C: CUSTOMER TO CUSTOMER
O2O: ONLINE TO OFFLINE(OFFLINE TO ONLINE)
项目编写
项目结构
|- ihome
|-ihome_main(项目源码)
|-__init__.py
|-api_1_0(蓝图)
|- __init__.py(声明蓝图)
|- libs(第三方SDK)
|- manage.py
|- config.py
项目结构步骤
- 编写初始化文件
- 编写蓝图初始化文件
- 编写项目配置文件(config.py)
- 创建项目启动管理文件(manage.py)
访问静态文件
简化静态文件路径(使用正则表达获取文件名,并拼接真实路径)
创建蓝图(html),定义正则视图函数
注册蓝图
自定义正则类,继承于BaseConverter
class RegexConverter(BaseConverter):
"""在路由中使用正则表达式进行提取参数的转换工具"""
def __init__(self, url_map, *args):
super(RegexConverter, self).__init__(url_map)
self.regex = args[0]
@html.route("/regex('.*'):file_name")
使用logging记录日志
日志等级:
DEBUG INFO WARNING ERROR NONE
# 设置日志的记录等级
logging.basicConfig(level=logging.DEBUG) # 调试debug级
# 创建日志记录器,指明日志保存的路径、每个日志文件的最大大小、保存的日志文件个数上限
file_log_handler = RotatingFileHandler("logs/log", maxBytes=1024*1024*100, backupCount=10)
# 创建日志记录的格式 日志等级 输入日志信息的文件名 行数 日志信息
formatter = logging.Formatter('%(levelname)s %(filename)s:%(lineno)d %(message)s')
# 为刚创建的日志记录器设置日志记录格式
file_log_handler.setFormatter(formatter)
# 为全局的日志工具对象(flask app使用的)添加日后记录器
logging.getLogger().addHandler(file_log_handler)
logging.debug('this is a debug log')
logging.info('this is a info log')
验证码
验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)
Cookie: 客户端数据保持技术,由服务器生成,随着相应带到客户端,由客户端进行保存,并在下次请求时带回来.优点:减少服务器资源占用;缺点:安全性问题,占用数据流量.可以存储比较小的,不重要的数据.
Session:服务器端数据保持技术,将用户数据保存在服务器端.优点:安全性高,不占用流量;缺点:服务器资源占用较高,在多用户环境下,区分数据归属问题.
Redis:缓存类型的键值对数据库.需要用户请求中携带验证码唯一标识信息.
MySQL:中小型关系型数据库.用来长久保存数据,不适合验证码这种临时性数据.
MongoDB:非关系型数据库.存储文档对象的数据.相对于Redis效率较低.
current_app: flask内置全局字典型变量,flask服务器启动,current_app一直存在.
g: 在一次请求范围内,所有的方法可以访问.
接口文档
1.图片验证码接口
功能描述:访问该接口,可以获取到验证码图片
URL: /api/v1.0/image_code/
访问方式: GET
传入参数:
格式: url (json, xml)
参数名 参数类型 是否必传 说明 image_code_id string 是 图片验证码编号
返回参数
测试
单元测试
把assert语句组合在一起,放在特定的类函数里,就是python中编写单元测试的方式,这些测试函数组成的类叫做测试用例
继承
(unittest.TestCase)
setUp(self)
:调用测试方法之前调用tearDown(self)
:调用测试方法之后调用
集成测试
系统测试
记录错误次数,进行封IP操作
利用redis数据库的expire特性
获取IP:
request.remote_addr
记录错误次数:
redis_store.incr(key) # 自增(默认+1)
获取表单内所有输入框对象
var recv_dict = {}
$('form').serializeArray().map(function(x){recv_dict[x.name] = x.value})