flask实现分页


数据库实现分页

offset

使用offset可以实现数据库分页功能

questions = Questions.query.offset(num) # 从num开始

limit

使用limit实现限制每页的文章数量

questions = Questions.query.offset(num).limit(6) #每页显示6篇文章

前端实现分页

需求设计

是使用上一页,下一页,用表单进行跳转,还是使用数字显示

获得文章数量 pages,和当前页码 number

简单的上一页,下一页

因为我的设计不是这个,所以简单说一下

下一页,上一页

jinja2 代码

<a href="{{ url_for('blog.index',number=number + 1)}}">下一页</a>
<a href="{{ url_for('blog.index',number=number - 1)}}">下一页</a>

首页没有上一页,尾页没有下一页

{% if number == pages %}
no next …

flask-sqlalchemy使用


简单的例子这里已经有了
中文 这里记录一下平时我遇到的一些问题

一对多

需求:一个问题对应多个回复
下面给出代码(字段不完整)

class Questions(db.Model):
    __tablename__ = 'questions'
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(50), nullable=False)
    content = db.Column(db.Text, nullable=False)

    def __init__(self,title,content):
        self.title = title
        self.content = content

    def __repr__(self):
        return "<Questions %r>" % self.title


class Replies(db.Model):
    __tablename__ = 'replies'
    id …

关于sqlalchemy的filter_by与filter


都可看做是where但用法不一样

filter_by

question = Questions.query.filter_by(id=1).first()

filter

question = Questions.query.filter(Questions.id==1).first()

其实就是===还有是否带类名的区别
如果要select * from questions where id < 5
这时只能使用filter

questions = Questions.query.filter(Questions.id < 5).all()

多个条件

question = Questions.query.filter_by(name='hello',id=5).first()
# 或者
question = Questions.query.filter(Questions.name=='hello',Questions.id==5).first()

关于sqlalchemy的desc


也就是降序排序

简单使用

questions = Questions.query.order_by(Questions.time.desc()).all()

设置默认排序

如果几乎所有的questions都是按照时间降序排序,总不能每一条语句都加上order_by(Questions.time.desc())
所以设置默认排序是有效的

class Questions(db.Model):
    __tablename__ = 'questions'
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(50), nullable=False)
    content = db.Column(db.Text, nullable=False)
    time = db.Column(db.DateTime, nullable=False)

    __mapper_args__ = {
        "order_by": time.desc()
    }

如代码所示,使用__mapper_args__就可,__mapper_args__可以做很多事,具体看 …

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 …

关于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 …

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安装, 只好自己编译了

安装必要的文件 …