常常会有这样的验证问题: 一个post表单,虽然有的位置规定了是int,但是用户总是尝试自己发送post数据,来模拟实际情况。所以是不能相信用户的输入的,故我们需要在views层收到数据时,对数据进行检验和转换。 这里推荐marshmallow,非常的方便强大。 dict格式化成dict from marshmallow import Schema, fields, post_loadfrom marshmallow.validate import OneOf# required表示这个参数必须要有,然后会先转换对应的类型,再通过validate函数验证class UserLoginSchema(Schema): username = fields.String(required=True) # 如果不指定required, 默认为False password = fields.String(required=True, validate=lambda x: len(x) > 0) phone = fields.Method('get_prefix_phone_code')
发表于 2017-08-28 17:43:10 | 条评论 | 阅读次数:68
主要是一些基础函数的处理,如如何处理和区分未登录的用户,如何记录已经登录的信息(即session),如何实现长久保存账号登录,如何处理异常等一些flask框架的基础问题。 一个维护性可用性高的网站,需要建立在一个好的运行平台的基础之上~ 目录 .gitignore app初始化 返回处理和错误处理 manager管理 登录模块的处理 视图层 目录 /app/consts/ #用来存放常量/app/database/ #用来放数据库的表/app/celery/ #用来存放一些schedule的代码/app/models/ #model层/app/libs/ #封装比较关键的库/app/utils/ #一些类似工具的代码/app/views/ #view层/app/templates/ #偶尔也会存在一些模板/app/tests/ #单元测试/app/__init__.py #放app的初始化的内容/cmd/ #存放一些bash脚本,如网站启动的脚本等/scripts/ #日常维护的python脚本config.py #配置,通常在.gitignore中config_template.py
发表于 2017-08-25 14:52:12 | 条评论 | 阅读次数:168
docker可以很方便的一键部署应用,非常的实用,学习一下,顺便看能不能作为OnlineJudge的编译容器。 概念 镜像Image: 说白了就是类似.iso文件 容器Container: 说白了就是把.iso安装在虚拟机里,成为一个虚拟主机 说白了,docker就是把做好的镜像,直接运行,变成得到临时的容器,容器通常都是一次性的,用完后自动销毁所有的数据。 sudo yum -y install docker # 安装sudo service docker start # 运行# 之后所有的操作,都必须是用管理员的权限运行的docker images # 查看已经下载的镜像docker ps -las # 查看容器docker search xxxx # 搜索镜像docker pull xxxx # 下载镜像docker commit 5d8413f3d030 new_name # 复制那个哈希值对应的容器,然后commit出新的容器docker run -ti learn/ping /bin/bash # -ti表示交互模式,直接进入一个镜像,在上面直接修改docker r
发表于 2017-08-25 13:05:30 | 条评论 | 阅读次数:45
grafana其实是一款web端的图形界面,主要是用来查看报表的。 influxdb是存储的数据库。 StatsClient是python的一款influxdb的客户端,用来往influxdb数据库中发数据。 利用StatsClient来写statsd类(之后再把这个类的代码放上来QAQ) 今天这个主要是记录如何配置grafana的图表,感觉这块网上资料比较少。 这个是效果图。 其实往里面输入点东西,之后就会显示数据库中所有的条数了 这样设置来检测访问量,time可以设置多长时间聚合成一个点,一定要设置fill,不然图可能不能正常的显示。 这样可以设置这一段时间内,的平均耗时,如果把mean改成max, 就能检测这段时间内的极端耗时了 这path这边还能设置路由路径,能精确到某一具体的网页
发表于 2017-08-16 20:22:38 | 条评论 | 阅读次数:63
思路 1.记ans = INF 2.从任意点,用prim做最大生成树,记录最后一次加入到生成树中的点记为s,以及最后一次加入到生成树中的边记为e,记录e的另一端为t。 3.把与s节点相连的所有边权值相加记录为sum,去与ans取最小值更新ans 4.把s和t节点合并,若s和t都对r节点有边,合并后新的节点则是对r有重边。 5.回到步骤2,继续,直到只剩下了1个节点为止。 证明 定理1:sum就是上述的s和t的最小割。 证明 设与s相连的边分别是e1,e2,...,ene_1, e_2,...,e_ne​1​​,e​2​​,...,e​n​​,这些边的另一端分别为p1,p2,...,pnp_1, p_2, ..., p_np​1​​,p​2​​,...,p​n​​ 我们拿第一条边来举例子: 由于已经做了最大生成树,所以p1p_1p​1​​到ttt一定是可以通过最大生成树上的边到达的。 那么,考虑sss经过e1e_1e​1​​到达ttt,这条路径我们现在要让它断开。 可以分成两种情况,第一种情况是断开e1e_1e​1​​,第二种情况是断开p1p_1p​1​​与ttt不通过sss时的其他所有路径。 由于
acm
发表于 2017-08-08 10:01:23 | 条评论 | 阅读次数:67
创建 # config.pySQLALCHEMY_DATABASE_URI = 'mysql://root:123456@127.0.0.1/mc-backend-test'# main.pyfrom flask.ext.sqlalchemy import SQLAlchemydb = SQLAlchemy(blog) # 从flask的app的config创建 model层 class MessageContent(db.Model): __tablename__ = 'message_content' # 对应表的名字 id = db.Column('id', db.Integer, primary_key=True) # 声明主键 user_id = db.Column('user_id', db.Integer, doc="用户id", default=0) group_id = db.Column('group_id', db.Integer, default=0, doc="属于哪一组的消息") created_at = db.Column('c
发表于 2017-07-18 20:38:21 | 条评论 | 阅读次数:135
感觉flask_cache的那个缓存并不是太好用,于是自己撸了一个缓存的装饰器,配合redis实现。 利用这个,就能用来再继续做,得到orm自动缓存的基类等等。 # -*- coding:utf8 -*-import picklefrom app_create import r, config# r是StrictRedisdef cache(id, timeout=config.CACHE_DEFAULT_TIME): def real_decorator(func): answer = None key = '%s%s' % (config.CACHE_PREFIX, id) if r.exists(key): try: answer = pickle.loads(r.get(key)) except: pass def wrapped(*args, **kwargs): if answer is not None:
发表于 2017-07-15 01:45:00 | 条评论 | 阅读次数:40
Copyright © 2017 - 2018 qwb's blog
blog.csustacm.com All Rights Reserved
Powered by qwb Contact me