01 2018 档案

摘要:一.程序包 程序包用来保存程序的所有代码、模板和静态文件。我们可以把这个包直接称为app(应用),如果有需求,也可使用一个程序专用名字。templates 和static 文件夹是程序包的一部分,因此这两个文件夹被移到了app 中。数据库模型和电子邮件支持函数也被移到了这个包中,分别保存为app/m 阅读全文
posted @ 2018-01-31 11:50 木易森林 阅读(399) 评论(0) 推荐(0) 编辑
摘要:尽管在单一脚本中编写小型Web 程序很方便,但这种方法并不能广泛使用。程序变复杂后,使用单个大型源码文件会导致很多问题。不同于大多数其他的Web 框架,Flask 并不强制要求大型项目使用特定的组织方式,程序结构的组织方式完全由开发者决定。在本节,我们将介绍一种使用包和模块组织大型程序的方式。 一. 阅读全文
posted @ 2018-01-31 11:22 木易森林 阅读(499) 评论(0) 推荐(0) 编辑
摘要:在开发程序的过程中,你会发现有时需要修改数据库模型,而且修改之后还需要更新数据库。仅当数据库表不存在时,Flask-SQLAlchemy 才会根据模型进行创建。因此,更新表的唯一方式就是先删除旧表,不过这样做会丢失数据库中的所有数据。更新表的更好方法是使用数据库迁移框架。源码版本控制工具可以跟踪源码 阅读全文
posted @ 2018-01-30 19:56 木易森林 阅读(6763) 评论(0) 推荐(0) 编辑
摘要:前面的章节中我们已经学习了如何建立模型和关系,接下来我们学习如何使用模型的最好方法是在Python shell 中实际操作。并将介绍最常用的数据库操作。 一.创建表 首先,我们要让Flask-SQLAlchemy 根据模型类创建数据库。方法是使用db.create_all()函数 查询mysql数据 阅读全文
posted @ 2018-01-30 16:43 木易森林 阅读(3214) 评论(0) 推荐(0) 编辑
摘要:关系型数据库使用关系把不同表中的行联系起来。上篇随笔中介绍的用户和角色之间是一种简单的关系。即角色到用户的一对多关系,因为一个角色可属于多个用户,而每个用户都只能有一个角色。这种关系在模型中的表示方法如下: 关系使用users 表中的外键连接了两行。添加到User 模型中的role_id 列被定义为 阅读全文
posted @ 2018-01-29 20:47 木易森林 阅读(1311) 评论(0) 推荐(0) 编辑
摘要:模型这个术语表示程序使用的持久化实体。在ORM 中,模型一般是一个Python 类,类中的属性对应数据库表中的列。 Flask-SQLAlchemy 创建的数据库实例为模型提供了一个基类以及一系列辅助类和辅助函数,可用于定义模型的结构。下面的实例中分别定义rules和users的模型: 类变量__t 阅读全文
posted @ 2018-01-29 20:23 木易森林 阅读(511) 评论(0) 推荐(0) 编辑
摘要:Flask-SQLAlchemy 是一个Flask 扩展,简化了在Flask 程序中使用SQLAlchemy 的操作。SQLAlchemy 是一个很强大的关系型数据库框架,支持多种数据库后台。SQLAlchemy 提供了高层ORM,也提供了使用数据库原生SQL 的低层功能。 和其他大多数扩展一样,F 阅读全文
posted @ 2018-01-29 16:28 木易森林 阅读(505) 评论(0) 推荐(0) 编辑
摘要:安装时候的日志如下: 错误解决方案: 1.检查系统是否安装了libmysqlclient-dev,没有安装的话使用sudo apt-get install libmysqlclient-dev安装 2.sudo updatedb,locate mysql_config找到mysql_config的安 阅读全文
posted @ 2018-01-29 16:26 木易森林 阅读(440) 评论(0) 推荐(0) 编辑
摘要:请求完成后,有时需要让用户知道状态发生了变化。这里可以使用确认消息、警告或者错误提醒。一个典型例子是,用户提交了有一项错误的登录表单后,服务器发回的响应重新渲染了登录表单,并在表单上面显示一个消息,提示用户用户名或密码错误。 这种功能是Flask 的核心特性。如下面例子所示,flash() 函数可实 阅读全文
posted @ 2018-01-29 15:45 木易森林 阅读(677) 评论(0) 推荐(1) 编辑
摘要:在新版hello.py 中,视图函数index() 不仅要渲染表单,还要接收表单中的数据。更新后的index() 视图函数如下: app.route 修饰器中添加的methods 参数告诉Flask 在URL 映射中把这个视图函数注册为GET 和POST 请求的处理程序。如果没指定methods 参 阅读全文
posted @ 2018-01-29 15:44 木易森林 阅读(371) 评论(0) 推荐(0) 编辑
摘要:最新版的hello.py 存在一个可用性问题。用户输入名字后提交表单,然后点击浏览器的刷新按钮,会看到一个莫名其妙的警告,要求在再次提交表单之前进行确认。之所以出现这种情况,是因为刷新页面时浏览器会重新发送之前已经发送过的最后一个请求。如果这个请求是一个包含表单数据的POST 请求,刷新页面后会再次 阅读全文
posted @ 2018-01-29 15:44 木易森林 阅读(222) 评论(0) 推荐(0) 编辑
摘要:默认情况下,Flask-WTF 能保护所有表单免受跨站请求伪造(Cross-Site Request Forgery,CSRF)的攻击。恶意网站把请求发送到被攻击者已登录的其他网站时就会引发CSRF 攻击。 为了实现CSRF 保护,Flask-WTF 需要程序设置一个密钥。Flask-WTF 使用这 阅读全文
posted @ 2018-01-29 15:39 木易森林 阅读(342) 评论(0) 推荐(0) 编辑
摘要:表单字段是可调用的,在模板中调用后会渲染成HTML。假设视图函数把一个NameForm 实例通过参数form 传入模板,在模板中可以生成一个简单的表单,如下所示: 当然,这个表单还很简陋。要想改进表单的外观,可以把参数传入渲染字段的函数,传入的参数会被转换成字段的HTML 属性。例如,可以为字段指定 阅读全文
posted @ 2018-01-29 14:55 木易森林 阅读(3413) 评论(0) 推荐(0) 编辑
摘要:Flask请求对象包含客户端发出的所有请求信息。其中,request.form 能获取POST 请求中提交的表单数据。尽管Flask 的请求对象提供的信息足够用于处理Web 表单,但有些任务很单调,而且要重复操作。比如,生成表单的HTML 代码和验证提交的表单数据。Flask-WTF(http:// 阅读全文
posted @ 2018-01-29 14:17 木易森林 阅读(6485) 评论(0) 推荐(0) 编辑
摘要:Moment.js 是一个简单易用的轻量级JavaScript日期处理类库,提供了日期格式化、日期解析等功能。它支持在浏览器和NodeJS两种环境中运行。此类库能够 将给定的任意日期转换成多种不同的格式,具有强大的日期计算功能,同时也内置了能显示多样的日期形式的函数。Flask-Moment是一个集 阅读全文
posted @ 2018-01-29 10:36 木易森林 阅读(681) 评论(0) 推荐(0) 编辑
摘要:Web 程序不是仅由Python 代码和模板组成。大多数程序还会使用静态文件,例如HTML代码中引用的图片、JavaScript 源码文件和CSS。 在前面的章节中,我们曾检查hello.py 程序的URL 映射时,其中有一个static 路由。这是因为对静态文件的引用被当成一个特殊的路由,即/st 阅读全文
posted @ 2018-01-29 10:05 木易森林 阅读(1093) 评论(0) 推荐(0) 编辑
摘要:在Web开发中,任何具有多个路由的程序都需要可以连接不同页面的链接,例如导航条。 在模板中直接编写简单路由的URL 链接不难,但对于包含可变部分的动态路由,在模板中构建正确的URL 就很困难。而且,直接编写URL 会对代码中定义的路由产生不必要的依赖关系。如果重新定义路由,模板中的链接可能会失效。 阅读全文
posted @ 2018-01-29 09:50 木易森林 阅读(538) 评论(0) 推荐(0) 编辑
摘要:如果你在浏览器的地址栏中输入了不可用的路由,那么会显示一个状态码为404 的错误页面。现在这个错误页面太简陋、平庸,而且样式和使用了Bootstrap 的页面不一致。 像常规路由一样,Flask 允许程序使用基于模板的自定义错误页面。最常见的错误代码有两个:404,客户端请求未知页面或路由时显示;5 阅读全文
posted @ 2018-01-25 17:29 木易森林 阅读(1505) 评论(0) 推荐(0) 编辑
摘要:Bootstrap(http://getbootstrap.com/)是Twitter 开发的一个开源框架,它提供的用户界面组件可用于创建整洁且具有吸引力的网页,而且这些网页还能兼容所有现代Web 浏览器。 要想在程序中集成Bootstrap,显然要对模板做所有必要的改动。不过,更简单的方法是使用一 阅读全文
posted @ 2018-01-25 16:04 木易森林 阅读(20715) 评论(3) 推荐(1) 编辑
摘要:我们使用一个简单的例子切入到Jinja2模板引擎,形式最简单的Jinja2模板引擎就是一个包含响应文本的文件,实例如下: 最简单的包含变量的模板引擎实例如下: 渲染模板 默认情况下,Flask 在程序文件夹中的templates 子文件夹中寻找模板。在下一个hello.py版本中,要把前面定义的模板 阅读全文
posted @ 2018-01-25 15:23 木易森林 阅读(910) 评论(0) 推荐(0) 编辑
摘要:初始化 所有Flask程序都必须创建一个程序实例,Web服务器使用一种名为Web服务器网关接口的的协议(WSGI),把接收自客户端的所有请求转发给这个对象处理。程序实例是Flask类的对象,使用下面代码构建 Flask类的构造函数只有一个必须指定的参数,即程序主模块或则包的名称。。在大多数程序中,P 阅读全文
posted @ 2018-01-25 11:51 木易森林 阅读(2445) 评论(0) 推荐(0) 编辑
摘要:Flask被设计成可扩展形式,因此并没有提供一些重要的功能,比如数据库和用户认证,所以开发者可以自由选择最适合程序的包,或者按需求自行开发。社区成员开发了大量不同用途的扩展,如果这还不能满足需求,你还可使用所有Python 标准包或代码库。为了让你知道如何把扩展整合到程序中,接下来我们将在hello 阅读全文
posted @ 2018-01-24 15:33 木易森林 阅读(1465) 评论(0) 推荐(0) 编辑
摘要:使用虚拟环境 安装Flask最简单的方式是使用虚拟环境,虚拟环境是python解释器的一个私有副本,在这个环境中你可以安装私有包,而且不会影响系统中安装的全局的Python解释器。虚拟环境非常有用,可以在系统的Python 解释器中避免包的混乱和版本的冲突。为每个程序单独创建虚拟环境可以保证程序只能 阅读全文
posted @ 2018-01-23 20:41 木易森林 阅读(2532) 评论(0) 推荐(0) 编辑
摘要:Elasticsearch REST API elasticsearch支持通过http请求响应服务,http请求默认使用9200断开,因此通过curl命令,可以发送http请求,并得到json返回内容。常用的REST API包括一下几个: 检查ES集群状态 检查ES节点的状态 查询所有的索引 创建 阅读全文
posted @ 2018-01-23 17:48 木易森林 阅读(1716) 评论(1) 推荐(0) 编辑
摘要:Elasticsearch的数据都存在每个节点的分片中,当执行搜索时每个分片独立搜索后,数据再经过整合返回。ElasticSearch的搜索请求一次请求最大量为10000。如果超过则会发生错误。那么,如果数据量很大,就必须实现分页查询。Elasticsearch中分页方式大致有两种:from siz 阅读全文
posted @ 2018-01-23 16:49 木易森林 阅读(1911) 评论(0) 推荐(0) 编辑
摘要:Elasticsearch的Bulk API允许批量提交index和delete请求,有如下两种用法: 用法1 用法2 beforeBulk会在批量提交之前执行,可以从BulkRequest中获取请求信息request.requests()或者请求数量request.numberOfActions( 阅读全文
posted @ 2018-01-23 16:08 木易森林 阅读(1971) 评论(1) 推荐(0) 编辑
摘要:加入依赖 我本地的Elasticsearch的版本是2.1.0,因此加入相应的maven依赖 创建Client Elasticsearch Client分为Node Client和TransportClient。 Node Client:节点本身也是Elasticsearch集群的节点,也进入Ela 阅读全文
posted @ 2018-01-23 15:55 木易森林 阅读(331) 评论(0) 推荐(0) 编辑
摘要:ubuntu 16.04 安装Tensorflow(CPU) 安装python ubuntu 16.04自带python2.7,因此可以略过这一步 安装pip 安装tensorflow 在国内google网站访问可能比较慢,如果出现网络错误的话多试几次就ok了。 测试 进入python,输入一下命令 阅读全文
posted @ 2018-01-22 10:58 木易森林 阅读(530) 评论(0) 推荐(0) 编辑
摘要:ElasticSearch是面向文档的,它不仅仅可以存储整个对象或则文档(document),还会索引(index)每个文档的内容使它可以被快速的检索。ElasticSearch和关系型数据库的对比如下: Elasticsearch是一个接近实时的搜索平台。这意味着,从索引一个文档直到这个文档能够被 阅读全文
posted @ 2018-01-18 20:46 木易森林 阅读(267) 评论(0) 推荐(0) 编辑
摘要:Elasticsearch安装与环境配置 确保机器上已经安装了jdk7以上版本 下载:官网下载地址:https://www.elastic.co/downloads/elasticsearch 将下载后的文件加压到/opt/ela目录下 进入到${Elasticsearch_HOME}/bin目录下 阅读全文
posted @ 2018-01-18 17:46 木易森林 阅读(1149) 评论(0) 推荐(0) 编辑
摘要:要创建一个KafkaSpout对象,必须要传入一个SpoutConfig对象,KafkaSpout的构造函数定义如下: SpoutConfig继承KafkaConfig,并实现Serializable,由于在KafkaConfig中所有的属性字段都是public的因此在SpoutConfig中可以直 阅读全文
posted @ 2018-01-15 20:57 木易森林 阅读(622) 评论(0) 推荐(0) 编辑
摘要:Docker允许通过外部访问容器或则容器互联的方式来提供网络服务。 外部访问容器 容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 P或则 P参数来指定断开映射。当使用 P 标记时,Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口。看如下的例子: 阅读全文
posted @ 2018-01-13 10:31 木易森林 阅读(264) 评论(0) 推荐(0) 编辑
摘要:本文介绍Docker内部以及容器间的数据管理,在容器中管理数据主要有两种方式: 数据卷(Volumes) 挂载主机目录(Bind mounts) 数据卷 数据卷是一个可供一个或则多个目录使用的特殊目录,它绕过UFS,可以提供很多有用的特性: 数据卷可以在容器之间共享共用 对数据卷的修改会立马生效 对 阅读全文
posted @ 2018-01-12 15:37 木易森林 阅读(357) 评论(0) 推荐(0) 编辑
摘要:VOLUME 定义匿名卷 VOLUME指令的格式为: VOLUME [,...] VOLUME 之前我们说过,容器运行时应该尽量保持容器存储层不发生写操作,对于数据库类需要保存动态数据的应用,其数据库文件应该保存于卷(volume)中。为了防止运行时用户忘记将动态文件所保存目录挂载为卷,在Docke 阅读全文
posted @ 2018-01-12 14:45 木易森林 阅读(658) 评论(0) 推荐(0) 编辑
摘要:COPY复制文件指令 和RUN命令一样,COPY命令也有两种格式,一种类似与命令行,一种类似与函数调用,命令格式如下: COPY ... COPY ["",...] COPY将构建上下文中目录中的文件或则目录复制到复制到镜像内的目录位置中。比如: 原路径可以有多个,甚至是通配符,但是通配符要符合GO 阅读全文
posted @ 2018-01-12 10:33 木易森林 阅读(4246) 评论(0) 推荐(0) 编辑
摘要:装饰器模式,顾名思义,就是将某个类重新装扮一下,使得它比原来的功能更加强大,这就是装饰器所要达到的目的。但是作为原来这个类的使用者,不应感受到装饰前和装饰后有什么不同,否则就破坏了原有类的结构了,所以装饰器模式要做到对被装饰类的使用者透明,这是对装饰器模式最基本的要求。 装饰器模式的结构 下图是一个 阅读全文
posted @ 2018-01-10 09:33 木易森林 阅读(227) 评论(0) 推荐(0) 编辑
摘要:适配器模式的功能很好的理解,就是把一个类的接口变换为客户端所能接收的另一种接口,从而使两个接口不匹配而无法在一起工作的两个类能够在一起工作。 适配器模式通常应用在一个项目需要引用一些开源框架来一起工作的情况下,这些框架的内部都有一些关于环境信息的接口,需要从外部传入,但是外部的接口不一定匹配,这种情 阅读全文
posted @ 2018-01-09 20:23 木易森林 阅读(180) 评论(0) 推荐(0) 编辑
摘要:NIO的工作机制 为了了解NIO,我们先看一下NIO的相关类图,如下图所示: 上图中有两个关键类Channel和Selector,他们是Java NIO的核心。举个例子,我们把Channel比作高铁,则Selector就是高铁的调度系统,负责监控每列高铁的运行状态,是出站还是在路上,也就是说Sele 阅读全文
posted @ 2018-01-09 19:56 木易森林 阅读(769) 评论(0) 推荐(1) 编辑
摘要:Dockerfile是一个文本文件,其中包含额一条一条的指令,每一条指令构建一层,因此每一条指令的作用就是描述这一层应当如何的构建。 以构建nginx镜像为例,使用Dockerfile构建的步骤如下: 在一个空的目录下创建一个名为Dockerfile的文件: 编辑Dockerfile文件,内容如下: 阅读全文
posted @ 2018-01-08 20:46 木易森林 阅读(236) 评论(0) 推荐(0) 编辑
摘要:docker容器是独立运行的一个或一组应用,以及它们的运行态环境。下面具体介绍如何管理一个容器,包括容器的创建,启动和停止等。 启动容器 基于镜像新建一个容器并启动 将终止状态的容器重新启动 新建并启动 所需要的命令主要是docker run 例如下面的命令输出一个welcome to docker 阅读全文
posted @ 2018-01-08 16:23 木易森林 阅读(546) 评论(0) 推荐(0) 编辑
摘要:获取镜像 首先说明一下如何从Docker hub中获取高质量的镜像,从Docker镜像库获取镜像的命令是docker pull 。其命令格式为: 具体的选项可以通过docker pull help命令看到,下面我们说一下镜像名称的格式: docker镜像仓库地址:地址的格式一般是 [:端口号] 。默 阅读全文
posted @ 2018-01-08 11:16 木易森林 阅读(7264) 评论(0) 推荐(1) 编辑
摘要:Java序列化就是将一个对象转化为一个二进制表示的字节数组,通过保存或则转移这些二进制数组达到持久化的目的。要实现序列化,需要实现java.io.Serializable接口。反序列化是和序列化相反的过程,就是把二进制数组转化为对象的过程。在反序列化的时候,必须有原始类的模板才能将对象还原。从这个过 阅读全文
posted @ 2018-01-05 15:20 木易森林 阅读(12591) 评论(0) 推荐(5) 编辑
摘要:Docker的三个基本概念 镜像(Image) 容器(Container) 仓库(Repository) Docker镜像 我们都知道,操作系统分为内核和用户空间。对于 Linux 而言,内核启动后,会挂载 root文件系统为其提供用户空间支持。而 Docker 镜像(Image),就相当于是一个 阅读全文
posted @ 2018-01-05 11:53 木易森林 阅读(464) 评论(0) 推荐(0) 编辑
摘要:卸载版本的docker 安装可选内核模块 从 Ubuntu 14.04 开始,一部分内核模块移到了可选内核模块包 ( linux image extra ) ,以 减少内核软件包的体积。正常安装的系统应该会包含可选内核模块包,而一些裁剪后的系统 可能会将其精简掉。 AUFS 内核驱动属于可选内核模块 阅读全文
posted @ 2018-01-05 11:08 木易森林 阅读(6178) 评论(0) 推荐(0) 编辑
摘要:配置参数 参数说明 broker.id =1 每一个broker在集群中的唯一标示,要求是正数。当该服务器的IP地址发生改变时,如果broker.id没有变化,则不会影响consumers的消息情况 log.dirs=/log/kafka-logs kafka数据的存放地址,多个地址的话用逗号分割/ 阅读全文
posted @ 2018-01-05 09:25 木易森林 阅读(1846) 评论(0) 推荐(0) 编辑
摘要:安装 sudo apt get install apache2 utils 简单使用 阅读全文
posted @ 2018-01-04 19:42 木易森林 阅读(1044) 评论(0) 推荐(0) 编辑
摘要:一致性hash算法解决的核心问题是,当solt数发生变化的时候能够尽量少的移动数据。该算法最早在《Consistent Hashing and Random Trees:Distributed Caching Protocols for Relieving Hot Spots on the Worl 阅读全文
posted @ 2018-01-03 16:28 木易森林 阅读(2936) 评论(0) 推荐(0) 编辑
摘要:导入jar包 为了能够使用hector操作Cassandra数据库,首先导入hector的jar包,注意根据实际情况修改版本号 初始化一个集群 我们首先创建一个代表Cassandra集群的集群对象,值得注意的是集群的名字仅仅是一个集群标示,和真正的Cassandra集群没有关系。为了使代码更清晰,我 阅读全文
posted @ 2018-01-03 10:24 木易森林 阅读(604) 评论(0) 推荐(0) 编辑