arch更新遇到的问题


:confuse: signature from "Thorsten Töpper atsutane@freethoughts.de" is unknown trust

解决:

$ sudo pacman-key --refresh-keys

arch错误:无法准备事务处理 (无法满足依赖关系) :: package-query: 要求 pacman<4.3

解决:

$ sudo pacman -R package-query yaourt

更新python2-pip出现问题

$ sudo pacman -Syu
错误:无法提交处理 (有冲突的文件)
python2-pip: 文件系统中已存在 /usr/lib/python2.7/site-packages/pip/_vendor/requests/packages/urllib3/contrib/socks.py 
python2-pip: 文件系统中已存在 /usr/lib/python2.7/site-packages/pip/_vendor/requests/packages/urllib3/contrib …

flask使用ajax


简单使用ajax

参考文档

<script type=text/javascript>
$(document).ready(function(){
    $('button#ajax').click(function() {
        $.ajax ({
            type : "POST",
            url : "{{ url_for('index.login') }}",
            data:JSON.stringify({
                name: $('input[name="name"]').val(),
                passwd: $('input[name="passwd"]').val()
            }),
            contentType: 'application/json;charset=UTF-8',
            success: function(result) {
                if (result.judge == true)
                {
                    window.location = '/';
                }
                else 
                {
                    $("#showerror").show();
                    $("#error").text(result.error);
                }
            }
        });
    });
});
</script>

ajax使用CSRF

参考文档

首先注册CSRF

from flask_wtf.csrf import CsrfProtect
csrf …

使用jquery实现markdown预览


虽然算不上是实时预览
实时预览功能等有时间在把它加上

还是把实时预览加上,不过实时预览可能会对网站有所影响,读者看着加上

前端

<script type="text/javascript">
function previewTopicContent(){
    $.getJSON("{{ url_for('blog.preview') }}", {
        content: $("#content").val(),
    }, function(data) {
        $("#showPreview").html(data.result);
    });
   /*setTimeout('previewTopicContent()',300);*/
};
</script>

或者

function previewTopicContent(){
    $.get("{{ url_for('blog.preview') }}", {
        content: $("#content").val(),
    }, function(data) {
        $("#showPreview").html(data);
    });
};

服务端

@site.route('/pages/preview')
def preview():
    from misaka import Markdown, HtmlRenderer
    from flask import jsonify
    content = request.args.get …

关于flask-wtf中的validators


以前都是"吃快餐",利用别人的例子进行修改,弄得自己不明不白的,这次放假,静下心来好好的看看官方文档, 才发现写的代码有很多不必要的东西,可以进行很多优化

flask-wtforms是一个优秀的flask扩展,可惜官方文档说的不明不白,只是简单的说了大概的 功能,如果想要更好的利用这个扩展,请google wtforms,或者看这里

这里记录一下wtforms的validators
参考文档

class RegisterForm(Form):
    name = StringField('用户名:')
    email = StringField('邮箱:')
    passwd = PasswordField('密码:')
    repasswd = PasswordField('重复密码:')
    register = SubmitField('注册')

这只是一个最简单注册表单

慢慢地加上一些要求:

输入不能为空

from wtforms.validators import Required
name = StringField('用户名:',
                   [Required()])

限制name长度

from wtforms.validators import Length
name = StringField('用户名:',
                    [Length(min=4,
                           max=20 …

redis记录用户操作


必须得记下来,否则等那天看到又要浪费时间了,主要记录访问时间这里

    '''记录访问的时间'''
    now_time = int(time()) #首先得到当前时间戳 
    '''查询上次访问的时间和最近访问的时间'''
    query_last_time = redis_data.zscore(visited_users,'last_time')
    query_now_time = redis_data.zscore(visited_users,'time')
    '''判断查询是否为空,一般是第一次访问还未记录的IP'''
    if query_last_time is None:
        query_last_time = now_time
        pipe.zadd(visited_users,query_last_time,'last_time')
    if query_now_time is None:
        query_now_time = now_time
    '''将当前时间与last_time进行对比,十分钟之内不记录'''
    if now_time - query_last_time >= 600:
        '''这里类似交换更新数据,把query_now_time变成last_time,把now_time更新'''
        pipe.zadd(visited_users,query_now_time,'last_time')
        pipe.zadd(visited_users,now_time,'time')
    else:
        pipe.zadd(visited_users,now_time,'time')

flask应用部署——安装环境


虽然以前安装过但是没有记录,这次重新安装,趁机记录下来,省得满世界地找

环境: centos7

安装nginx

参考资料
使用yum list nginx会发现nginx是1.6的版本,但现在nginx已经到了1.9,虽然不必那么新, 但是过旧的版本说不定会出现安全问题

# vim /etc/yum.repos.d/nginx.repo

输入

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1

然后

# yum list nginx  #你会发现nginx已经是1.8的版本
# yum install nginx
# systemctl start nginx #启动nginx

安装python3

centos7默认安装了python2.7的版本,但我习惯用python3,但是centos无法通过yum install python3安装, 只好自己编译了

安装必要的文件 …

supervisor使用


supervisor安装请参考flask应用部署——安装环境

生成配置文件

# cd /etc
# mkdir -p supervisord/conf.d
# echo_supervisord_conf > /etc/supervisord/supervisord.conf

修改supervisord.conf

# vim supervisord.conf # G直接跳到最后一行

取消下面注释并修改

[include]
files = /etc/supervisord/conf.d/*.ini

ok,现在可以在/etc/supervisord/conf.d/目录下创建配置文件了

# vim honmaple.com.ini

输入以下内容

# 进程的名字
[program:website]
# 命令
command=/home/www/honmaple.com/venv/bin/gunicorn run:app -c /home/www/honmaple.com/gunicorn.conf
# 网站目录 …

使用python的Pillow模块生成验证码


参考资料
准备

from PIL import Image, ImageDraw, ImageFont, ImageFilter

_letter_cases = "abcdefghjkmnpqrstuvwxy" # 去除可能干扰的i,l,o,z
_upper_cases = _letter_cases.upper() # 大写字母
_numbers = ''.join(map(str, range(3, 10))) # 数字
init_chars = ''.join((_letter_cases, _upper_cases, _numbers))
fontType="/usr/share/fonts/TTF/DejaVuSans.ttf"

1.创建图像

def create_validate_code(self,size=(120, 30),
                        chars=init_chars,
                        img_type="PNG",
                        mode="RGB",
                        bg_color=(255, 255, 255),
                        fg_color=(0, 0, 255),
                        font_size=18,
                        font_type …