相关文档
第一个应用程序
# 导入Flask扩展
from flask import Flask
# 创建Flask应用程序实例(需要传入__name__,作用是为了确定资源所在路径)
app = Flask(__name__)
# 定义路由及视图函数
# Flask中定义路由是通过装饰器实现的
# 路由默认支支持GET,如果需要增加,需要自行指定
@app.route('/',methods=['GET','POST'])
def index():
return 'Hello wsj!'
# 使用同一个视图函数,来显示不同用户的订单信息
# <>定义路由的函数,<>内需要起个名字
# 有时候需要对路由做访问优化,订单ID应该是Int类型
@app.route('/orders/<int:order_id>')
def get_order_id(order_id):
# 需要在视图函数的()内填入参数名才可以在后面的代码中使用
# order_id参数,默认是字符串,unicode
return 'order_id: %s' % order_id
# 启动程序
if __name__ == '__main__':
# 执行app.run就会将Flask程序运行在一个简易的服务器(Flask提供,用于测试)
app.run(debug=True)
Jinja2模板使用
渲染模板函数
Flask提供的render_template函数封装了改模板引擎
render_template函数的第一个参数是模板的文件名,后面的参数都是键值对,表示模板中变量对应的真实值。
使用
注释
使用 {# #}进行注释
{# {{ name }} #}
变量代码块
{{}}来表示变量名,这种语法叫做变量代码块
{{ post.title }}
Jinja2模板中的变量代码块可以是任意Python类型或者对象,只要它能够被Python的str()方法转换为一个字符串就可以,比如,可以通过下面的方式显示一个字典或者列表中的某个元素
{{your_dict[‘key’]}}
{{your_list[0]}}
代码示例
index.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>This is template.Index</h1>
<br>
{# 下面是一个变量代码块的使用 #}
{{ url_str }}<br>
{# 列表的使用 #}
{{ my_list }}<br>
{{ my_list.2 }} {{ my_list[2] }}<br>
{# 字典的使用 #}
{{ my_dict }}<br>
{{ my_dict.url }}<br>
{{ my_dict['url'] }}<br>
</body>
</html>
app.py文件
@app.route('/',methods=['GET','POST'])
def index():
url_str = 'centuryw.cn'
my_list = [1,2,3,5]
my_dict = {
'name':'wsj',
'url' :'centuryw.cn'
}
# 通常,模板中使用的变量名和要传递的数据的变量名保持一致
return render_template(
'index.html',
url_str=url_str,
my_list=my_list,
my_dict=my_dict
)
控制代码块
用{% %}定义的控制代码块,可以实现一些语言层次的功能,如循环或if语句
{% if user %}
{{ user }}
{% else %}
hello!
{% endif %}
{% for indedx in indexs %}
{{ index }}
{% endfor %}
示例:
{# 控制代码块 {% %} #}
{# fro 循环的使用,建议先写for,然后按tab进行补全 #}
{% for num in my_list %}
{# 数据大于3才能显示 #}
{% if num > 3 %}
{{ num }} <br>
{% endif %}
{% endfor %}
过滤器
过滤器的本质就是函数,有时候我们不仅仅只是需要输出变量的值,还需要修改变量的显示,甚至格式化、运算等,而在模板中不能直接调用Python中的某些方法,所以用到了过滤器。
使用方式:
- 过滤器的使用方式为:变量名|过滤器
- {{variable | filter_name{*args)}}
- 如果没有任何参数传给过滤器,则可以把括号省略
- {{variable | filter_name}}
链式调用
在jinja2中,过滤器是可以支持链式调用的
{{ “hello world” | reverse | upper }}
常见内建过滤器
字符串操作
- safe:禁用转义
- <p>{{ ‘hello‘ | safe }}</p>
- capitalize:把变量值的首字母转换成大写,其余字母转小写
- <p>{{ ‘hello’ | capitalize }}</p>
- lower:把值转换成小写
- <p>{{‘HELLO’ | lower}}</p>
- upper:把值转换成大写
- <p>{{‘hello’ | upper }}</p>
- title:把值中的每个单词的首字母都转成大写
- <p>{{ ‘hello’ | title }}</p>
- reverse:字符串反转
- <p>{{‘olleh’ | reverse }} </p>
- format:格式化输出
- <p>{{ ‘%s is %d’ | format(‘name’,17) }} </p>
- striptags:渲染之前把值中所有的HTML标签都删掉
- <p>{{‘<em>hello</em>’ | striptags }}</p>
- truncate:字符串截断
- <p>{{‘hello every one’ | truncate(9)}}</p>
列表操作

语句块过滤
{% filter upper %}
文字
{% endfilter %}
Web表单
web表单是web应用程序的基本功能
它是HTML页面中负责数据采集的部件。表单有三个部分组成:表单标签、表单域、表单按钮。表单允许用户输入数据,负责HTML页面数据采集,通过表单将用户输入的数据交给服务器。
在Flask中,为了处理web表单,一般使用Flask-WTF扩展,他封装了WTForms,并且它有验证表单数据的功能
WTForms支持的HTML标准字段

WTForms常用验证函数
使用Flask-WTF需要配置参数SECRET_KEY。
CSRF_ENABLED是为了CSRF(跨站请求伪造)保护。SECRET_KEY用来生成加密令牌,当CSRF激活的时候,改设置会根据设置的密钥生成加密令牌

示例
使用普通方式实现表单
在HTLML页面中直接写form表单
html文件
<form method="post">
<label>name:</label><input type="text" name="username"><br>
<label>passwd:</label><input type="password" name="password"><br>
<label>verify</label><input type="password" name="password2"><br>
<input type="submit" value='submit'><br>
{# 使用遍历获取闪现的消息 #}
{% for message in get_flashed_messages() %}
{{ message }}
{% endfor %}
</form>
视图文件
'''目的:实现一个简单的登陆的逻辑处理
1.路由需要有get和post两者请求方式 --> 需要判断请求方式
2.获取请求的参数
3.判断参数是否填写 & 密码是否相同
4.如果判断都没有问题,返回一个success
'''
# request: 请求对象 --> 获取请求方式、数据
# flash:给模板传递消息 模板中需要遍历消息 需要对内容加密,因此需要设置secret_key,做加密
app.secret_key = 'pass'
from flask import request,flash
@app.route('/login',methods=['GET','POST'])
def login():
# 1.判断请求方式
if request.method == 'POST':
# 2.获取请求的参数
username = request.form.get('username')
password = request.form.get('password')
password2 = request.form.get('password2')
# 3.判断蚕食是否填写,密码是否相同
if not all([username,password,password2]):
flash('参数不完整')
elif password != password2:
flash('密码不一致')
else:
return 'success'
return render_template('login.html')
flask_sqlalchemy(数据库相关)
常用字段类型

常用列选项

常用关系选项

数据库基本操作
db.create_all() #创建数据库
db.drop_all() # 删除数据库

# 从文件导入db
>>> from app import db
# 创建所有数据表
>>> db.create_all()
# 导入所有
>>> from app import *
# 创建一个名叫 admin
>>> role = Role(name='admin')
# 添加 名叫 admin 的role
>>> db.session.add(role)
# 提交到数据库
>>> db.session.commit()
# 创建 User 添加name、role_id属性
>>> user = User(name='wsj',role_id=role.id)
# 添加
>>> db.session.add(user)
# 提交到数据库
>>> db.session.commit()
# 修改name属性为programmer
>>> user.name = 'programmer'
# 提交到数据库
>>> db.session.commit()
# 删除user
>>> db.session.delete(user)
# 提交到数据库
>>> db.session.commit()
模型之间的关联
一对多
class Role(db.Model):
# 定义表名
__tablename__ = 'roles'
# 定义字段
# db.Column表示是一个字段
id = db.Column(db.Integer,primary_key=True)
name = db.Column(db.String(16),unique=True)
# 关联
# 表示和User模型发生了关联,增加了一个Users属性(不会在字段中出现)
# backref 表示role是User要用的属性
users = db.relationship('User',backref='role')
查询操作
常用的查询过滤器

常用查询执行器

查询示例:
