本文已参与「新人创作礼」活动,一起开启掘金创作之路。
1、处理表单
在flask开发中我们经常需要处理表单,今天给大家介绍一种扩展,在开发中会很实用
- 正常情况下:
模板文件
<form method='post'>
<input type="text" name="username" placeholder='Username'>
<input type="password" name="password" placeholder='password'>
<input type="submit">
</form>
也就是说,正常情况下,这些都需要我们自己来写,而且在提交的时候我们需要对每一个进行验证
from flask import Flask,render_template,request
@app.route('/login',methods=['GET','POST'])
def login():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
print username,password
return “success”
else:
return render_template(“login.html”)
- 使用 Flask-WTF扩展:
使用这个扩展需要设置SECRET_KEY的配置参数
<form method="post">
#设置csrf_token
{{ form.csrf_token() }}
{{ form.us.label }}
<p>{{ form.us }}</p>
{{ form.ps.label }}
<p>{{ form.ps }}</p>
{{ form.ps2.label }}
<p>{{ form.ps2 }}</p>
<p>{{ form.submit() }}</p>
{% for x in get_flashed_messages() %}
{{ x }}
{% endfor %}
</form>
# 视图函数
#coding=utf-8
from flask import Flask,render_template, redirect,url_for,session,request,flash
#导入wtf扩展的表单类
from flask_wtf import FlaskForm
#导入自定义表单需要的字段
from wtforms import SubmitField,StringField,PasswordField
#导入wtf扩展提供的表单验证器
from wtforms.validators import DataRequired,EqualTo
app = Flask(__name__)
app.config['SECRET_KEY']='1'
#自定义表单类,文本字段、密码字段、提交按钮
class Login(FlaskForm):
us = StringField(label=u'用户:',validators=[DataRequired()])
ps = PasswordField(label=u'密码',validators=[DataRequired(),EqualTo('ps2','err')])
ps2 = PasswordField(label=u'确认密码',validators=[DataRequired()])
submit = SubmitField(u'提交')
#定义根路由视图函数,生成表单对象,获取表单数据,进行表单数据验证
@app.route('/',methods=['GET','POST'])
def index():
form = Login()
if form.validate_on_submit():
name = form.us.data
pswd = form.ps.data
pswd2 = form.ps2.data
print name,pswd,pswd2
return redirect(url_for('login'))
else:
if request.method=='POST':
flash(u'信息有误,请重新输入!')
return render_template('index.html',form=form)
if __name__ == '__main__':
app.run(debug=True)
2、处理数据库
基本上只要是应用程序都会和数据库打交道,今天我来学习的是flask这个web开发框架怎么样和数据库完美的交互
1,首先我们来看一段数据库创建,和数据添加
# _*_ coding: utf-8
from flask import Flask
# 这个数是操作数据库的框架
from flask_sqlalchemy import SQLAlchemy
__author__ = 'hb'
__date__ = '2019/2/20 14:48'
app = Flask(__name__)
class Config(object):
"""配置参数"""
# 配置sqlalchemy的配置参数
SQLALCHEMY_DATABASE_URI = "mysql://root:mysql@127.0.0.1:3306/flaskmysql"
# 设置sqlalchemy自动跟踪数据库,也就是有变化时自动变化
SQLALCHEMY_TRACK_MODIFICATIONS = True
app.config.from_object(Config)
# 创建数据库sqlalchemy工具对象
db = SQLAlchemy(app)
class Role(db.Model):
__tablename__ = "tbl_roles"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(32), unique=True)
users = db.relationship("User", backref="Role")
# 显示对象的时候更直观
def __repr__(self):
return "Role object name=%s"%self.name
class User(db.Model):
"""用户表"""
"""
primary_key 如果设为 True,这列就是表的主键
unique 如果设为 True,这列不允许出现重复的值
index 如果设为 True,为这列创建索引,提升查询效率
nullable 如果设为 True,这列允许使用空值;如果设为 False,这列不允许使用空值
default 为这列定义默认值
"""
__tablename__ ="tbl_users"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
email = db.Column(db.String(128), unique=True)
pswd =db.Column(db.String(128))
# 这里很明显是外键,mysql外键不懂得同学可以去查下资料
role_id = db.Column(db.Integer,db.ForeignKey("tbl_roles.id"))
def __repr__(self):
return "User object name=%s"%self.name
if __name__ == '__main__':
# 清除数据库里面的所有的数据
db.drop_all()
# 创建所有的表
db.create_all()
ro1 = Role(name='admin')
ro2 = Role(name='user')
db.session.add_all([ro1, ro2])
db.session.commit()
us1 = User(name='wang', email='wang@163.com', pswd='123456', role_id=ro1.id)
us2 = User(name='zhang', email='zhang@189.com', pswd='201512', role_id=ro2.id)
us3 = User(name='chen', email='chen@126.com', pswd='987654', role_id=ro2.id)
us4 = User(name='zhou', email='zhou@163.com', pswd='456789', role_id=ro1.id)
# 添加数据
db.session.add_all([us1, us2, us3, us4])
# 将数据库保存到数据中当中去
db.session.commit()
app.run(debug=True)
执行完上面的代码,其实在我们的数据库中就有了一段数据
mysql> select * from tbl_users;
+----+-------+---------------+--------+---------+
| id | name | email | pswd | role_id |
+----+-------+---------------+--------+---------+
| 1 | wang | wang@163.com | 123456 | 1 |
| 2 | zhang | zhang@189.com | 201512 | 2 |
| 3 | chen | chen@126.com | 987654 | 2 |
| 4 | zhou | zhou@163.com | 456789 | 1 |
+----+-------+---------------+--------+---------+
2,介绍相关操作
#查询所有的Role对象
li = Role.query.all()
Out[2]: [<db_demo.Role at 0x10388d190>, <db_demo.Role at 0x10388d310>]
In[3]:r = li[0]
#获取查询的第一个对象
In [8]: Role.query.first()
#根据主键来获取对象
In [11]: r = Role.query.get(2)
#这里再隆重介绍另外一中查询方式
In [15]: db.session.query(Role).all()
#根据对象的Id来查找
db.session.query(Role).get(2)
#查询第一个对象
db.session.query(Role).first()
#查询执行名字的对象 filter_by 是filter的特殊形式
User.query.filter_by(name="wang").all()
#多个限制条件叠加
User.query.filter_by(name="wang", role_id=1).first()
#使用filter来多条件查询
user = User.query.filter(User.name=="wang", User.role_id==1).all()
# 使用 _or 或条件查询
from sqlalchemy import or_
User.query.filter(or_(User.name=="wang", User.email.endwith("163.com"))).all()
# offset 偏移,跳过几条数据
User.query.offset(2).all() # 跳过两条数据,从第三条数据开始
# limit 限制获取多少条数据
User.query.offset(1).limit(2).all()
#根据相关的参数升序或者降序 这里的"-id"表示降序
User.query.order_by("-id").all()
#还有另外一种表达方式 升序是asc()
User.Query.order_by(User.id.desc()).all()
#目前这里使用的都是等于 那mysql里面的一些聚合函数怎么表达呢,下面的表达就类似mysql中的select role_id,cout(role_id) from User group role_id
from sqlalchemy import func
db.session.query(User.role_id,func.count(User.role_id)).group_by(User.role_id).all()
out:[(1L, 2L), (2L, 2L)]
# 上面介绍的是查询语句,接下来我们介绍下更新语句的写法
User.query.filter_by(name="zhou").update({"name":"python","email;":"hongbiao@163.com"})
# 修改是需要保存的,因此,需要提交到数据库
db.seesion.commit()
#删除操作
user = User。query.get(3)
db.session.delete(user)
db.session.commit()