文章目录
一、flask简介
WEKA作为一个公开的数据挖掘工作平台,集合了大量能承担数据挖掘任务的机器学习算法,包括对数据进行预处理,分类,回归、聚类、关联规则以及在新的交互式界面上的可视化。
如果想自己实现数据挖掘算法的话,可以参考weka的接口文档。在weka中集成自己的算法甚至借鉴它的方法自己实现可视化工具并不是件很困难的事情。
二、第一个flask程序
111
# -*- coding:utf-8 -*-
# 1.导入Flask扩展
from flask import Flask
# 2.创建Flask应用程序实例
# 需要传入__name__,作用是为了确定资源所在的路径
app=Flask(__name__)
# 3.定义路由及视图函数
# flask中定义路由是通过装饰器实现的
@app.route('/')
def index():
return "hello world"
# 4.启动程序
if __name__ == '__main__':
#执行了app.run,就会将flask程序运行在一个简易的服务器上(flask提供的,用于测试的)
app.run()
执行后点击生成的网页,就可以看到"hello world"的字样。
Flask调用视图函数后,可以返回两种内容:
- 字符串内容:将视图函数的返回值作为响应的内容,返回给客户端(浏览器)
- HTML模版内容:获取到数据后,把数据传入HTML模板文件中,模板引擎负责渲染HTTP响应数据,然后返回响应数据给客户端(浏览器)
比如新建一个flask文件夹后,在template文件夹中新建一个html文件,命名为index,并在中输入<h1>HW<h1>字样,并将上文的第四行改成"from flask import Flask,render_template",第14行替换为"return render_template(“index.html”)",则返回的是html模板,打开后为模板的HW字样。
三、路由相关
1. 路由请求方式的限定
为了验证和演示调试结果,引入接口测试软件Postman。
- Postman下载安装地址:https://www.postman.com/downloads/
- Postman是一个接口测试工具,不仅可以调试简单的css、html、脚本等简单的网页基本信息,Postman还可以发送几乎所有类型的HTTP请求!Postman简化了API生命周期的每个步骤并简化了协作。
在methods处对路由进行选择,相应的可在Postman中调试。
# -*- coding:utf-8 -*-
# 1.导入Flask扩展
# -*- coding:utf-8 -*-
# 1.导入Flask扩展
from flask import Flask,render_template
# 2.创建Flask应用程序实例
# 需要传入__name__,作用是为了确定资源所在的路径
app=Flask(__name__)
# 3.定义路由及视图函数
# flask中定义路由是通过装饰器实现的
# 路由默认只支持GET,如果需要增加,需要自行指定
@app.route('/',methods=['GET','POST'])
def index():
return "hello world"
# return render_template("index.html")
# 4.启动程序
if __name__ == '__main__':
#执行了app.run,就会将flask程序运行在一个简易的服务器上(flask提供的,用于测试的)
app.run()
2. 路由参数处理
在生成的网址后加上/orders/xxx(xxx可为数字,可为字母),打开的网页会出现"order_id xxx"字样。
访问优化:如果想对xxx进行整数类型限定,在<>内加上“int:”。
# -*- coding:utf-8 -*-
# 1.导入Flask扩展
from flask import Flask,render_template
# 2.创建Flask应用程序实例
# 需要传入__name__,作用是为了确定资源所在的路径
app=Flask(__name__)
# 3.定义路由及视图函数
# flask中定义路由是通过装饰器实现的
# 路由默认只支持GET,如果需要增加,需要自行指定
@app.route('/',methods=['GET','POST'])
def index():
return "hello world"
# return render_template("index.html")
# 使用同一个视图函数来显示不同用户的订单信息
# <>定义路由的参数,<>内需要起个名字
@app.route('/orders/<order_id>')
def get_order_id(order_id):
#参数类型,默认是字符串,unicode编码
print type(order_id)
# 需要在视图函数的()内填入参数名,后面的代码才能使用
return "order_id %s" % order_id
# 4.启动程序
if __name__ == '__main__':
#执行了app.run,就会将flask程序运行在一个简易的服务器上(flask提供的,用于测试的)
app.run()
四、Jinja2模板引擎
Jinja2 是 Python 下一个被广泛应用的模板引擎,是由Python实现的模板语言,他的设计思想来源于 Django 的模板引擎,并扩展了其语法和一系列强大的功能,其是Flask内置的模板语言。
1.简单使用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{#这是index.html文件内容#}
{{ url_str }}<br>
</body>
</html>
# -*- coding:utf-8 -*-
from flask import Flask,render_template
app=Flask(__name__)
# 1.如何返回一个网页(模板)
# 2.如何给模板填充数据
@app.route('/',methods=['GET','POST'])
def index():
# 动态传入参数
url_str="www.baidu.com"
return render_template("index.html",url_str=url_str)
if __name__ == '__main__':
app.run()
2.变量代码块的基本使用
- {{}}来表示变量名,这种语法叫做变量代码块。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{#下面是一个变量代码块的使用#}
{{ url_str }}<br>
{#列表的使用#}
{{ my_list }}<br>
{#取 index为 2 的数据#}
{{ my_list.2 }}<br>
{{ my_list[2] }}<br>
{#字典的使用#}
{{ my_dict }}<br>
{{ my_dict.url }}<br>
{{ my_dict['url'] }}<br>
</body>
</html>
# -*- coding:utf-8 -*-
from flask import Flask,render_template
app=Flask(__name__)
# 1.如何返回一个网页(模板)
# 2.如何给模板填充数据
@app.route('/',methods=['GET','POST'])
def index():
# 比如需要传入网址
url_str="www.baidu.com"
my_list=[1,3,5,7,9]
my_dict={
'name':'问就ycy',
'url':'www.baidu.com'
}
return render_template("index.html",url_str=url_str,my_list=my_list,my_dict=my_dict)
if __name__ == '__main__':
app.run()
3.控制代码块的基本使用
- 用{%%}定义的控制代码块,可以实现一些语言层次的功能,比如循环或者if语句。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{#下面是一个变量代码块的使用#}
{{ url_str }}<br>
{#列表的使用#}
{{ my_list }}<br>
{#取 index为 2 的数据#}
{{ my_list.2 }}<br>
{{ my_list[2] }}<br>
{#字典的使用#}
{{ my_dict }}<br>
{{ my_dict.url }}<br>
{{ my_dict['url'] }}<br>
{#下面是一个控制代码块的使用#}
<hr>
{#for循环的使用,建议先写for,然后按住tab进行补全#}
{% for num in my_list %}
{# 数据大于3才能显示#}
{% if num>3 %}
{{ num }}<br>
{% endif %}
{% endfor %}
</body>
</html>
4.过滤器的基本使用
过滤器的本质就是函数,可用于修改变量的显示,甚至格式化、运算等等,而在模板中不能直接调用python的某些方法,这就用到了过滤器。
使用方式:变量名 | 过滤器
常用的过滤器
- 字符串操作
safe:禁用转义 {{ ‘hello’ | safe }}
capitalize:把变量值的首字母转成大写,其余字母转小写{{ ‘hello’ | capitalize }}
lower:把值转成小写 {{ ‘HELLO’ | lower }}
upper:把值转成大写{{ ‘hello’ | upper }}
title:把值中的每个单词的首字母都转成大写 {{ ‘hello’ | title }}
reverse:字符串反转 {{ ‘olleh’ | reverse }}
format:格式化输出 {{ ‘%s is %d’ | format(‘name’,17) }}
striptags:渲染之前把值中所有的HTML标签都删掉 {{ ‘hello’ | striptags }}
truncate: 字符串截断 {{ ‘hello every one’ | truncate(9)}} - 列表操作
first:取第一个元素 {{ [1,2,3,4,5,6] | first }}
last:取最后一个元素 {{ [1,2,3,4,5,6] | last }}
length:获取列表长度 {{ [1,2,3,4,5,6] | length }}
sum:列表求和 {{ [1,2,3,4,5,6] | sum }}
sort:列表排序 {{ [6,2,3,1,5,4] | sort }} - 链式调用
{{variable | filter_name1 | filter_name2 | filter_name3…}}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{#下面是一个变量代码块的使用#}
{{ url_str }}<br>
{#列表的使用#}
{{ my_list }}<br>
{#取 index为 2 的数据#}
{{ my_list.2 }}<br>
{{ my_list[2] }}<br>
{#字典的使用#}
{{ my_dict }}<br>
{{ my_dict.url }}<br>
{{ my_dict['url'] }}<br>
{#下面是一个控制代码块的使用#}
<hr>
{#for循环的使用,建议先写for,然后按住tab进行补全#}
{% for num in my_list %}
{# 数据大于3才能显示#}
{% if num>3 %}
{{ num }}<br>
{% endif %}
{% endfor %}
{#过滤器#}
{#字符串变大写#}
{{ url_str | upper }}<br>
{#字符串反转#}
{{ url_str | reverse }}<br>
{#过滤器链式调用#}
{{ url_str | reverse | upper}}<br>
</body>
</html>
五、表单信息
1.Web表单
web表单是web应用程序的基本功能。
它是HTML页面中负责数据采集的部件。表单有三个部分组成:表单标签、表单域、表单按钮。表单允许用户输入数据,负责HTML页面数据采集,通过表单将用户输入的数据提交给服务器。
在Flask中,为了处理web表单,我们一般使用Flask-WTF扩展,它封装了WTForms,并且它有验证表单数据的功能。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<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 get_flashed_message in get_flashed_messages() %}
{{ get_flashed_message }}
{% endfor %}
</form>
</body>
</html>
# -*- coding:utf-8 -*-
from flask import Flask,render_template,request
app=Flask(__name__)
'''
目的:实现一个简单的登录的逻辑处理
1.路由需要有get和post两种请求方式 --> 需要判断请求方式
2.获取请求的参数
3.判断参数是否填写&密码是否相同
4.如果判断都没有问题,就返回一个success
'''
@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('参数不完整')
elif password!=password2:
print('密码不一致')
else:
return 'SUCCESS'
return render_template("index.html")
if __name__ == '__main__':
app.run(debug=True)
2.flash消息闪现
# -*- coding:utf-8 -*-
from flask import Flask,render_template,request,flash
app=Flask(__name__)
app.secret_key='ccyy'
'''
目的:实现一个简单的登录的逻辑处理
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('参数不完整')
elif password!=password2:
# print('密码不一致')
flash('密码不一致')
else:
return 'SUCCESS'
return render_template("index.html")
if __name__ == '__main__':
app.run(debug=True)
3.WTF表单的显示
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<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 get_flashed_message in get_flashed_messages() %}
{{ get_flashed_message }}
{% endfor %}
</form>
<hr>
<form method="post">
{{ form.username.label }}{{ form.username }}<br>
{{ form.password.label }}{{ form.password }}<br>
{{ form.password2.label }}{{ form.password2 }}<br>
{{ form.submit }}<br>
</form>
</body>
</html>
# -*- coding:utf-8 -*-
from flask import Flask,render_template,request,flash
from flask_wtf import FlaskForm
from wtforms import StringField,PasswordField,SubmitField
# 解决编码问题
import importlib,sys
importlib.reload(sys)
app=Flask(__name__)
app.secret_key='ccyy'
'''
目的:实现一个简单的登录的逻辑处理
1.路由需要有get和post两种请求方式 --> 需要判断请求方式
2.获取请求的参数
3.判断参数是否填写&密码是否相同
4.如果判断都没有问题,就返回一个success
'''
'''
给模板传递消息
flash --> 需要对内容加密,因此需要设置secret_key,做加密消息的混淆
模板需要遍历消息
'''
'''
使用WTF实现表单
自定义表单类
'''
class LoginForm(FlaskForm):
username = StringField('用户名:')
password = PasswordField('密码:')
password2 = PasswordField('确认密码:')
submit = SubmitField('提交')
@app.route('/form',methods=['GET','POST'])
def login():
login_form=LoginForm()
return render_template('index.html',form=login_form)
@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('参数不完整')
elif password!=password2:
# print('密码不一致')
flash('密码不一致')
else:
return 'SUCCESS'
return render_template("index.html")
if __name__ == '__main__':
app.run(debug=True)
使用importlib,sys解决编码问题,其原因是python在安装时,默认的编码是ascii,当程序中出现非ascii编码时,python的处理常常会报错。
当前为python3的解决方法,如果是python2,将该部分代码替换为
import sys
reload(sys)
sys.setdefaultencoding(‘utf-8’)
4.WTF的逻辑验证
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<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 get_flashed_message in get_flashed_messages() %}
{{ get_flashed_message }}
{% endfor %}
</form>
<hr>
<form method="post">
{{ form.csrf_token() }}
{{ form.username.label }}{{ form.username }}<br>
{{ form.password.label }}{{ form.password }}<br>
{{ form.password2.label }}{{ form.password2 }}<br>
{{ form.submit }}<br>
</form>
</body>
</html>
# -*- coding:utf-8 -*-
from flask import Flask,render_template,request,flash
from flask_wtf import FlaskForm
from wtforms import StringField,PasswordField,SubmitField
from wtforms.validators import DataRequired,EqualTo
# 解决编码问题
import importlib,sys
importlib.reload(sys)
app=Flask(__name__)
app.secret_key='ccyy'
'''
目的:实现一个简单的登录的逻辑处理
1.路由需要有get和post两种请求方式 --> 需要判断请求方式
2.获取请求的参数
3.判断参数是否填写&密码是否相同
4.如果判断都没有问题,就返回一个success
'''
'''
给模板传递消息
flash --> 需要对内容加密,因此需要设置secret_key,做加密消息的混淆
模板需要遍历消息
'''
'''
使用WTF实现表单
自定义表单类
'''
class LoginForm(FlaskForm):
username = StringField('用户名:',validators=[DataRequired()])
password = PasswordField('密码:',validators=[DataRequired()])
password2 = PasswordField('确认密码:',validators=[DataRequired(),EqualTo('password',message='密码不一致')])
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可以一句话就实现所有校验
if login_form.validate_on_submit():
print(username,password)
return 'success'
else:
flash('参数有误')
return render_template('index.html',form=login_form)
@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.判断参数是否填写&密码是否相同
# 我们没有CSRF_token
if not all([username,password,password2]):
# print('参数不完整')
flash('参数不完整')
elif password!=password2:
# print('密码不一致')
flash('密码不一致')
else:
return 'SUCCESS'
return render_template("index.html")
if __name__ == '__main__':
app.run(debug=True)
六、参考
http://docs.jinkan.org/docs/flask/index.html