-00- 初识Flask
中文文档:http://docs.jinkan.org/docs/flask/
英文文档:http://flask.pocoo.org/docs/0.12/
-01- 第一个Flask程序
# -*- coding: utf-8 -*-
#1.导入Flask扩展
from flask import flask
#2.创建应用程序实例
#需要传入_name_,作用是为了确定资源所在的路径
app = Flask(_name_)
#3.定义路由及视图函数
#Flask中定义路由器是通过装饰器实现的
@app.route('/')
def index():
return 'hello flask'
#4.启动程序
if __name__ == '__main__':
#执行app.run,就会将Flask程序运行在一个简易的服务器(Flask提供的,用于测试的)
app.run()
-02- 路由请求方式限定(权限规定)
#默认只支持GET请求,如果需要用其他请求,需要自行添加。
#用postman进行接口请求测试,测试网址可以使用www.tianqiapi.com。
@app.route('/',methods=["GET", "POST"])
def index():
return 'hello flask'
-03- 路由参数处理(翻书操作)
#同一视图函数传入不同的参数
#<>定义路由的参数,<>内需要起个名字
@app.route('/orders/' )
def get_order_id(order_id):
#参数类型,默认是字符串
print type(order_id)
#需要在视图函数的括号内填入参数名字,后面的代码才能使用
return 'order_id %s' % order_id
#有的时候,需要对路由做访问优化,订单ID应该是int类型
@app.route('/orders/' )
-04- Jinja2模板引擎
如何返回一个网页(模板)
# *-*coding:utf-8*-*
from flask import Flask,render_template
app = Flask(__name__)
#1.如何返回一个网页(模板)
@app.route("/")
def index():
return render_template("index.html")
if __name__ == '__main__':
app.run()
如何给模板填充数据(服务器动态计算)
首先要新建一个HTML文件,作为网站的首页。然后在主程序中import函数render_template来对HTML进行渲染,render_template函数的第一个参数是模板文件名,后面的参数都是键值对,表示模板中变量对应的真实值。
# *-*coding:utf-8*-*
from flask import Flask,render_template
app = Flask(__name__)
#2.如何给模板填充数据(服务器动态计算)
@app.route("/")
def index():
#比如需要传入网址
url_str = 'www.baidu.com'
return render_template("index.html",url_str=url_str)#前面是值,后面是名字
if __name__ == '__main__':
app.run()
用键值对传入参数,然后在HTML文件中用两个花括号来使用这个变量。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
这是一个模板<br>
这是一个标签<br>
{{ url_str }}<br>
</body>
</html>
-05- 变量代码块的使用
在Jinja2中,使用{# #}进行注释,快捷键Ctrl + /
使用{{ }} 来表示变量名,这种语法叫做变量代码块
def index():
#比如需要传入网址、列表、字典
url_str = 'www.baidu.com'
my_list = [1, 2, 3, 4]
my_dict = {"name": "zyt", "keywords":"lucky" }
#通常模板中使用的变量名和要传递的数据的变量名保持一致
return render_template("index.html",url_str=url_str,my_list=my_list,my_dict=my_dict)
<body>
这是一个模板<br>
这是一个标签<br>
{#下面是一个变量代码块的使用#}
{{ url_str }}<br>
{# 列表的使用#}
{{ my_list }}<br>
{{ my_list.2 }}<br>
{{ my_list[2] }}<br>
{# 字典的使用#}
{{ my_dict }}<br>
{{ my_dict.name }}<br>
{{ my_dict["name"] }}<br>
</body>
-06- 控制代码块的使用
<hr>
{#for循环的使用,建议写先写for,然后按住tab进行补全}
{% for num in my_list %}
{#数据大于3,才能显示#}
{% if num >3 %}
{{ num }} <br>
{% endfor %}
{% endfor %}
</hr>
-07- 过滤器的使用
常见内建过滤器
safe:禁用转义
capitalize:单词的首字母大写
lower和upper:大小写转换
title:一句话中每个单词的首字母大写
reverse:翻转
truncate:字符截断
<hr>
{# 过滤器 #}
{# 字符串变大写 #}
{{ url_str | upper }}<br>
{# 字符串反转 #}
{{ url_str | reverse }}<br>
{# 过滤器的链式调用 #}
{{ url_str |upper| reverse }}<br>
</hr>
-08- 普通的表单验证 + flash消息闪现
在html页面中直接写form表单
<form method="post">
<label>用户名:</label> <input type="text" name="username"><br>
<label>密码:</label> <input type="password" name="password"><br>
<label>确认密码:</label> <input type="password" name="password2"><br>
<input type="submit" value="提交"><br>
{ # 使用遍历获取闪现的消息 #}
{% for message in get_flashed_messages() %}
{{ message }}
{% endfor %}
</form>
视图函数中获取表单数据
# *-*coding:utf-8*-*
from flask import Flask,render_template,request
app = Flask(__name__)
app.secret_key = 'itheima'
'''
目的:实现一个简单的登录的逻辑处理
1.路由需要有get和post两种请求方式————>需要判断请求方式
2.获取请求参数
3.判断参数是否填写 & 密码是否相同
4.如果判断都没有问题,就返回一个success
'''
'''
给模板传递消息
flash ————>需要对内容加密,因此需要设置secret_key,做加密消息的混淆
模板中需要遍历消息
'''
@app.route("/",methods=['get','post'])
def index():
#request:请求对象 ————> 获取请求方式、数据
#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]):
# print '参数不完整'
flash(u'参数不完整')
elif password != password2:
# print '密码不一致'
flash(u'密码不一致')
else :
return 'success'
return render_template("index.html")
if __name__ == '__main__':
app.run()
-09- 使用Flask-WTF实现表单+逻辑验证
模板页面:
<form method="post">
{# 开启CSRF_TOKEN #}
{{ form.csrf_token }}
{{ form.username.label }}{{ form.username }}<br>
{{ form.password.label }}{{ form.password }}<br>
{{ form.password2.label }}{{ form.password2 }}<br>
{{ form.submit}}
</form>
视图函数
from flask_wtf import FlaskForm
from wtfforms import StringField,PasswordField,SubmitField
# 解决编码问题
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
'''
使用WTF实现表单
自定义表单类
'''
class LoginForm(FlaskForm):
username = StringField('用户名',validators = [DataRequired()])
password = PasswordField('密码',validators = [DataRequired()])
password2 = PasswordField('确认密码',validators = [DataRequired(),EqualTo('password','密码填入不一致')])
submit = SubmitField('提交')
@app.route('/form', methods=['get','post'])
def login():
login_form = LoginForm()
#1.判断请求方式
if request.method =='post':
#2.获取请求参数
username = request.form.get('username')
password = request.form.get('password')
password2 = request.form.get('password2')
#3.验证参数 WTF可以一句话就实现所有的校验
# 我们没有CSRF_token
if login_form.validate_on_submit():
print username, password
return 'success'
else:
flash('参数有误')
return render_template('index.html', form=login_form)